TOP

VBA-第 13.1 课。使用数组 (Arrays)

YouLibreCalc for Excel logo

数组 (Arrays) 在编程中经常使用,包括在 Excel VBA 中。

数组本质上是一个变量,有许多单元来存储值,而典型的变量只有一个存储单元,只能存储一个值。

如果您想引用数组包含的所有值,则可以将其作为一个整体进行访问,也可以引用其各个元素。

您可以声明一个数组来处理一组相同数据类型的值。我们已经在 VBA-第 6.2 课中介绍了这一点。 Datatypes 但现在让我们更深入地研究一下......

为什么使用数组?

想象一下,您正在尝试编写一个需要存储最多 500 个值的过程。如果你必须创建 500 个单独的变量,那将是非常困难的。在数组的中间,存储和使用这些值会容易得多。

使用数组的第二个原因是它们的速度。从数组读取数据所需的时间明显少于从 Excel 工作表中的表(由单元格组成)读取数据所需的时间。


使用数组的示例

因此,这里是一个示例,它将显示在 Excel 中使用 VBA 数组的明显优势。

第一个工作表(“DS”)有一个数据集:5000 行 x 3 列:

在第二张表上,您将找到一个汇总表,其中按年份和客户考虑了所有“是”答案 (“YES”):

在本例中,该过程将使用循环来处理数据集并记录每年的“是”响应数量和每个客户编号,然后将该数据输入到相应的单元格中。

如果不使用数组,执行此过程将花费 Excel 131.44 秒:

但首先将数据保存到数组(来自“DS”工作表),然后执行相同的计算(使用数组而不是“DS”工作表数据集)仅需要 1.74 秒:

如果我们决定通过仅存储数组中包含“YES”响应的数据(大约是数据的 3/4)来优化我们的过程,则只需要 1.02 秒:

这是一个很好的例子,说明使用数组如何使您执行过程的速度提高 128 倍。如果我们同时处理许多数据集,我们的优化结果会更好。

我们将在本课结束时返回示例的详细信息。

声明数组

下面是在 VBA 中声明数组的一些示例(如果您不清楚前两个示例,请阅读):

 '声明一维数组的示例
 Dim array1(4)

 '声明二维数组的示例
 Dim array2(6, 1)

 '声明动态数组的示例
 Dim array3()

如果在声明数组时无法输入固定值(因为它们取决于数据集的大小等),请将括号留空。

您不必声明数据类型(字符串、长整型等),尽管在许多情况下这会减慢过程的执行速度。

数据存储在数组中

让我们尝试在数组中存储一些数据:

本例中我们要存储11x1的值,因此我们需要创建一个一维数组:

 '宣言
 Dim array_example(10)

不要忘记数组中元素的编号从 0 开始(这是编程中的标准,因此值得立即养成这种习惯,尽管事实上您可以在 VBA 中更改此方法)。

数组中的每个元素现在都将收到其值:

 '将值保存在数组中
 array_example(0)  = Range("A2")
 array_example(1)  = Range("A3")
 array_example(2)  = Range("A4")
 array_example(3)  = Range("A5")
 array_example(4)  = Range("A6")
 array_example(5)  = Range("A7")
 array_example(6)  = Range("A8")
 array_example(7)  = Range("A9")
 array_example(8)  = Range("A10")
 array_example(9)  = Range("A11")
 array_example(10) = Range("A12")

您可以像操作普通变量一样操作或修改每个数组元素。

接下来是我们使用 array_example(8) 的示例:

Sub example()
     '宣言
     Dim array_example(10)
     
     '将值保存在数组中
     array_example(0)  = Range("A2")
     array_example(1)  = Range("A3")
     array_example(2)  = Range("A4")
     array_example(3)  = Range("A5")
     array_example(4)  = Range("A6")
     array_example(5)  = Range("A7")
     array_example(6)  = Range("A8")
     array_example(7)  = Range("A9")
     array_example(8)  = Range("A10")
     array_example(9)  = Range("A11")
     array_example(10) = Range("A12")
     
     '测试1
     MsgBox array_example(8) '=> 返回: 04/02/2016
    
     '更改其中一个值
     array_example(8) = Year(array_example(8))
     
     '测试2
     MsgBox array_example(8) '=> 返回:2016
End Sub

For 循环将是更快保存数组的更好选择:

 '宣言
 Dim array_example(10)

 '将值保存在数组中
 For i = 0 To 10
    array_example(i) = Range("A" & i + 2)
 Next