美文网首页
ExcelVBA——数组(2)

ExcelVBA——数组(2)

作者: 猛犸象和剑齿虎 | 来源:发表于2019-06-04 08:19 被阅读0次

上文将数组的基础介绍了一下,本篇将分享数组的一些实战案例。


image.png

求大于80分的平均分

Sub test()
Dim arr1(1 To 99)
arr = [b2:c9]
For Each a In arr
    If a >= 80 Then
        n = n + 1
        arr1(n) = a
    End If
Next
MsgBox WorksheetFunction.Average(arr1)
End Sub

VBA不强制区分大小写,也不强制声明变量,所以方式比较灵活,首先定义一个一维数组,将单元格区域分数区域赋值给arr数组,循环取出arr的值,然后判断是否大于80,如果大于80就将其写入另一个数组arr,最后对arr采用工作表函数average,average函数的特性为去除空值后的平均,最后用msgbox消息框输出平均分。


image.png

UBound与LBound函数

Ubound取出数组的最大下标(默认为第一维的下标,如果后面有参数则代表该维的下标)
Lbound取出数组的最小上标(默认为第一维的上标,如果后面有参数则代表该维的上标)

Sub test()
Dim arr(4 To 8, 1 To 3, 1 To 9)
MsgBox UBound(arr) '可简写为:UBound(arr)
MsgBox UBound(arr, 2)
MsgBox UBound(arr, 3)
MsgBox LBound(arr) 'LBound 用来确定数组某一维的上界。
End Sub

提取不重复值

  • 提取不重复值用字典的方式比较方便,因为键值的键具有唯一性,而用数组的方式则要进行循环比对,最后取值。


    image.png

Sub 利用数组提取不重复值()
Dim arr1(1 To 10)
Set lastcell = Cells(Rows.Count, "b").End(xlUp) '查找最后B列最后一个非空单元格
arr = Range([b2], lastcell)     '将B列的姓名数据赋值给变量arr形成一个数组
For i = 1 To lastcell.Row - 1   '循环B列单元格个数的次数
    For j = 1 To UBound(arr1)   '找到arr1数组的最大小标,形成循环
        x = arr(i, 1): y = arr1(j) '辅助代码
        If arr(i, 1) = arr1(j) Then
            GoTo 100    'arr数组元素与arr1元素循环对比,如果相等,则跳出内层循环
        End If
    Next j
        k = k + 1   '做个计数器,计算相等重复的元素人数
        arr1(k) = arr(i, 1)  '如果循环完后都没有相等的,则将arr1循环的元素赋值给arr1数组
100:
Next i
[e2].Resize(k) = Application.Transpose(arr1)    '循环结束后将arr1的结果赋值给单元格区域
End Sub

分类求和

image.png
Sub 利用数组提取不重复值()
Dim arr1(1 To 10, 1 To 2)
Set endr = Cells(Rows.Count, "c").End(xlUp) '查找最后B列最后一个非空单元格
arr = Range([b2], endr) '将B列的姓名数据赋值给变量arr形成一个数组
For i = 1 To endr.Row - 1 '循环B列单元格个数的次数
    For j = 1 To UBound(arr1) '找到arr1数组的最大小标,形成循环
        x = arr(i, 1): y = arr1(j, 1) '辅助代码
        If arr(i, 1) = arr1(j, 1) Then
           arr1(j, 2) = arr(i, 2) + arr1(j, 2)
            GoTo 100 'arr数组元素与arr1元素循环对比,如果相等,则跳出内层循环
        End If
    Next j
        k = k + 1 '做个计数器,计算相等重复的元素人数
        arr1(k, 1) = arr(i, 1) '如果循环完后都没有相等的,则将arr1循环的元素赋值给arr1数组
        arr1(k, 2) = arr(i, 2)
100:
Next i
[e2].Resize(k, 2) = arr1 '循环结束后将arr1的结果赋值给单元格区域
End Sub

动态数组

ReDim 语句
在过程级别中使用,用于为动态数组变量重新分配存储空间。
ReDim [Preserve] varname( ) [As type]

可以使用 ReDim 语句反复地改变数组的元素以及维数的数目。 image.png
Sub test3()
Dim arr(), arr1()
rn = Cells(Rows.Count, 1).End(xlUp).Address
arr1 = Range("a2", rn)
m = WorksheetFunction.CountIf(Range("a2", rn), ">=80") '确定重新定义数组的上界
ReDim arr(1 To m)
For Each ar In arr1
    If ar >= 80 Then
        n = n + 1
        arr(n) = ar
    End If
Next
[c2].Resize(UBound(arr)) = Application.Transpose(arr)
End Sub

相关文章

  • ExcelVBA——数组(2)

    上文将数组的基础介绍了一下,本篇将分享数组的一些实战案例。 求大于80分的平均分 VBA不强制区分大小写,也不强制...

  • ExcelVBA——数组(1)

    excelvba针对性比较强,就是excel文件中的行列,以及单元格,工作表,工作薄,图表,图形等对象,很明确“我...

  • ExcelVBA——数组排序冒泡算法

    今天我们介绍一个好玩的算法——排序算法,当然排序功能excel功能区和筛选都能进行排序,有很多简便的方法,用VBA...

  • ExcelVBA——数组spilit,join,filter函数

    经过上篇数组的实战案例的道友,多少会被其中的逻辑关系搞得有点绕,小道也是,我们需要知晓的是很多东西我们只是拿来用的...

  • ExcelVBA——数组运用工作表函数

    在工作表支持数组的函数,很多也支持VBA数组。返回结果,当然也是一个数组。嘿嘿。如sumif,countif,ma...

  • 按照数组中的字符串顺序给另一个数组排序

    数组1 数组2: 数组1按照数组2的顺序排序 sortedUserDicts就是排序后的数组

  • 3.数组扩展

    1)cat函数扩展结果=cat(1或2,数组1,数组2) 3)水平连接扩展结果=horzcat(数组1,数组2,。...

  • 2019-01-09shell编程之数组

    一、数组简介 1类型 二、普通数组 1定义数组 2访问数组元素 三、关联数组 1定义数组 2查看数组 3访问数组元...

  • Excel妙用

    在做excel表格时如果遇到大量重复简单的工作时建议学习一下excelVBA宏录制(简单易学),如果说Excel函...

  • php进阶(一)之数组与类

    一、数组:索引数组、关联数组。 1、索引数组 (1)、初始化 输出 (2)、用foreach遍历关联数组 输出 2...

网友评论

      本文标题:ExcelVBA——数组(2)

      本文链接:https://www.haomeiwen.com/subject/sunxxctx.html