
本文于2023年3月3日首发于本人同名公众号:Excel活学活用,敬请关注!
对于Excel VBA新手来说,如果没有学会使用数组,那么你的VBA编码水平就很难提高。
就我自己的经验来讲,学会使用数组,就好像练武之人打通任督二脉一样,我这么说一点也不夸张。
当我了解了数组,并逐步使用它的时候,我真的觉得入了门,以前好多无法解决的问题突然就有了思路,真有种豁然开朗的感觉。
下面我就简单地说一下我所掌握的有关数组的要点,当然可能不够全面,欢迎在留言区补充讨论,在此先谢谢大家!
网上相关的文章多如牛毛,大家动动手,各取所需,我相信只要大家有心,一定能把它学好、学透。闲话少说,下面正式开始:
定义:在VBA中,数组是一种用于存储和管理数据的数据类型。它可以存储一系列数据,这些数据可以是数字、文本、日期等。
维度:常用的是一维和二维,一维数组你可以把它看成Excel表的一行或一列,二维数组你可以把它看成一个多行多列的表格。
优势:数组是在内存中进行运算,速度快,比在Excel表中快的不是一点半点。很多数据处理你必须在数组中处理,大量读写单元格不仅效率低,而且数据量大的时候根本不可能。
如何使用?
下面给大家看一个小例子,你就全明白了:
代码中的stop是暂停执行,此时我们可以打开【视图】【本地窗口】,点开数组前面的+号展开数组,查看其行、列标号及它的值,然后再点“运行"继续执行:
Sub test() Dim arr(), brr(), crr() Dim iRow As Integer Dim iCol As Integer arr = Sheet1.UsedRange.Value '从Excel表给数组赋值Stop iRow = UBound(arr, 1) iCol = UBound(arr, 2) ReDim brr(1 To iCol, 1 To iRow) '重定义数组 For i = 1 To iRow '通过循环给数组的每一个元素赋值 For j = 1 To iCol arr(i, j) = i & j brr(j, i) = arr(i, j) '起到给数组转置的效果 Next Next crr = Application.WorksheetFunction.Transpose(arr) Sheet2.Range("A1").Resize(iRow, iCol) = arr StopEnd Sub
简单解释一下代码(这次可不简单了):
定义数组:要使用数组,我们要先定义一个数组,这里我们为了演示之用,定义了三个数组,数组在定义的时候,我们要在变量名称后面加上一个括号。
在定义数组的时候,我们还要注意,后面如果加上了 as 数据类型,那么,在向数组存入数据的时候,一定是要同样的类型,否则会报错,类型不匹配。
另外,我们在定义数组的时候,最好在名称里包含'arr',这样我们一看就知道,这玩意是一数组,我们得按数组的方式来处理它,特别是在排错的时候,我们能有的放矢。
Dim arr(4) As Integer '定义一个包含 5 个整数的数组,注意这里数组的下标从0开始Dim arrFileName() As StringDim arrID() As IntegerDim arrValue() As Double......
常用的定义数组的方法有:
静态数组:静态数组是指在定义数组时就指定了数组的大小,不能动态地改变数组大小。例如:
Dim arr(4) As Integer ' 定义一个包含 5 个整数的数组
动态数组:动态数组是指在定义数组时不指定数组的大小,可以根据需要动态地改变数组大小。例如:
Dim arr() As Integer ' 定义一个动态数组ReDim arr(4) ' 动态地改变数组大小为 5
可以使用 ReDim 语句动态地改变数组大小,需要注意的是,ReDim 语句会擦除原有的数组元素,因此在使用 ReDim 语句改变数组大小时需要注意保存原有的数组元素。
多维数组:多维数组是指包含多个维度的数组。例如:
Dim arr(4, 2) As Integer ' 定义一个包含 5 行 3 列的二维数组
这段代码定义了一个二维数组,包含 5 行 3 列的数组,可以通过两个下标来访问数组元素。
变体数组:变体数组是指可以包含不同类型的数据的数组。例如:
Dim arr(4) As Variant ' 定义一个包含 5 个变体类型的数组
这段代码定义了一个包含 5 个变体类型的数组,可以在数组中存储不同类型的数据,如整数、字符串、日期等。
以上是数组的定义,接下来:
数组赋值:
在我们的示例代码里,我们使用了2种方式,一起说明如下:
将Excel表格单元格区域的值存入数组
Dim arr()arr = Sheet1.UsedRange.Value '已使用区域,不确定大小arr = Sheet1.Range("A1").CurrentRegion 'A1单元格所在的数据区域arr = Sheet1.Range("A1:F5").Value '限定大小arr = Sheet1.Range("A1").Resize(5, 6)
通过循环读取下标,给数组的每个元素赋值,如我们的示例代码:
For i = 1 To iRow '通过循环给数组的每一个元素赋值 For j = 1 To iCol arr(i, j) = i & j '改变arr元素的值 brr(j, i) = arr(i, j) '起到给数组转置的效果 Next Next
把一个数组常量赋值给另一个定义的数组
arr = Array(1, 2, 3, 4, 5)arr = Array(Array(1, 2, 3, 4, 5), Array(11, 22, 33, 44, 55))
记录集赋值给数据,我们用SQL语句从Access数据库查询数据:
Dim rs As New ADODB.Recordsetrs.Open "SELECT * FROM table", connDim arr() As Variantarr = rs.GetRows
字符串分列(Split),结果存到数组
Dim arr() As StringDim strA As String strA = "甲,乙,丙,丁" arr = Split(strA, ",")
数组输出:
输出到Excel表格,我们的示例代码:
Sheet2.Range("A1").Resize(iRow, iCol) = arr
输出到listview控件,这是我用得最多的一种方式,随便来一段:
For i = 0 To iRow Set LvItem = Me.LvVoucherList.ListItems.Add LvItem.Text = aData(0, i) For j = 1 To iCol LvItem.SubItems(j) = aData(j, i) Next Next
数组转置:就是行列互换,相当于Excel表中,我们在粘贴数据的时候,右键菜单里有一个“转置”。在我们的示例代码中:
通过循环来转置,假设arr(0 to iRow,0 to iCol),我们把它转置一下,变成brr:
Dim brr(0 To iCol, 0 To iRow) For i = 0 To iRow For j = 0 To iCol brr(j, i) = arr(i, j) Next Next
通过工作表函数来转置,这里要注意,只能转换二维数组,且数组中不能包含Null值,在查询数据库记录的时候,经常会有字段是Null值。
crr = Application.WorksheetFunction.Transpose(arr)
数组ReDim:重新定义数组的大小
ReDim一个数组,它会清除原来的内容,如果要保留以前的记录,我们要用ReDim Preserve arr(k) 来表示,k表示新的大小。小于等于K的列标的记录都会保存,这个k可以比原来最大列标大,也可以小,视你实际需要而定。
Dim arr() As StringDim strA As String strA = "甲,乙,丙,丁" arr = Split(strA, ",") k = UBound(arr) ReDim Preserve arr(k + 1) k = UBound(arr) arr(k) = "戊"
这里还要注意点的就是,它只能改变列,不能改变行,如果以Excel表格来作例子,就是它可以向右扩展,不能向下扩展。如果我们要扩展行,那么我们要先把数据转置一下,操作完成后,再转置回来。
好,关于数组的内容差不多就这样了,感谢大家的阅读,我们下期再见。示例文件下载链接我放到下面,请自取。
𭗂网址限制,请自公众号查看。
本文使用 文章同步助手 同步,本文于2023年3月3日首发于本人同名公众号:Excel活学活用,敬请关注!