excel学习库

excel表格_excel函数公式大全_execl从入门到精通

Excel VBA 数组定义/数组赋值/数组输出/数组转置/数组ReDim

本文于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......

常用的定义数组的方法有:

  1. 静态数组:静态数组是指在定义数组时就指定了数组的大小,不能动态地改变数组大小。例如:

Dim arr(4) As Integer ' 定义一个包含 5 个整数的数组
  1. 动态数组:动态数组是指在定义数组时不指定数组的大小,可以根据需要动态地改变数组大小。例如:

Dim arr() As Integer ' 定义一个动态数组ReDim arr(4) ' 动态地改变数组大小为 5

可以使用 ReDim 语句动态地改变数组大小,需要注意的是,ReDim 语句会擦除原有的数组元素,因此在使用 ReDim 语句改变数组大小时需要注意保存原有的数组元素。

  1. 多维数组:多维数组是指包含多个维度的数组。例如:

Dim arr(4, 2) As Integer ' 定义一个包含 5 行 3 列的二维数组

这段代码定义了一个二维数组,包含 5 行 3 列的数组,可以通过两个下标来访问数组元素。

  1. 变体数组:变体数组是指可以包含不同类型的数据的数组。例如:

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活学活用,敬请关注!

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

«    2024年12月    »
1
2345678
9101112131415
16171819202122
23242526272829
3031
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
搜索
最新留言
    文章归档
      友情链接