Visual Basic for Application 中的数组是通常存储相同类型的相关变量集的结构。 数组条目通过其数字索引访问。
例如,有一个 20 人的团队,他们的名字需要保存以供以后在 VBA 代码中使用。 可以简单地声明 20 个变量来保存每个名称,如下所示:
将 Team_Member1 调暗为字符串 将 Team_Member2 调暗为字符串 ... 将 Team_Member20 调暗为字符串
但是您可以使用更简单、更有条理的方式——将团队成员姓名列表存储在 20 个变量的数组中,例如 串:
将 Team_Members(1 到 20) 调暗为字符串
在上面显示的行中,我们声明了一个数组。 现在让我们为其每个元素写入一个值,如下所示:
Team_Members(1) = "约翰·史密斯"
当需要对数组的每个元素执行相同的操作时,与使用单独的变量相比,将数据存储在数组中的另一个优势变得明显。 如果团队成员的姓名存储在 20 个单独的变量中,那么每次需要编写 20 行代码才能对每个人执行相同的操作。 但是,如果名称存储在数组中,那么您可以使用简单的循环对每个名称执行所需的操作。
下面通过一个代码示例演示它是如何工作的,该示例在列单元格中按顺序打印每个团队成员的姓名。 A 活动的 Excel 工作表。
For i = 1 To 20 Cells(i,1).Value = Team_Members(i) Next i
显然,使用存储 20 个名称的数组比使用 20 个单独的变量要简单得多,而且更准确。 但是如果这些名字不是 20 而是 1000 呢? 另外,如果还需要将姓氏和父名分开保存?! 很明显,如果没有数组的帮助,在 VBA 代码中处理如此大量的数据很快就会变得完全不可能。
Excel Visual Basic 中的多维数组
上面讨论的 Visual Basic 数组被认为是一维的。 这意味着它们存储了一个简单的名称列表。 但是,数组可以有多个维度。 例如,可以将二维数组与值网格进行比较。
假设您要保存 5 个不同团队 5 月份的每日销售数据。 这将需要一个包含 31 天的 XNUMX 组指标的二维数组。 让我们像这样声明一个数组:
Dim Jan_Sales_Figures(1 到 31, 1 到 5) 作为货币
访问数组元素 一月销售数字,您需要使用两个索引来指示月份中的日期和命令编号。 例如,包含销售数据的元素的地址 2-哦 团队为 15号 一月会这样写:
Jan_Sales_Figures(15, 2)
同样,您可以声明一个具有 3 个或更多维度的数组——只需在数组声明中添加额外的维度并使用额外的索引来引用该数组的元素。
在 Excel Visual Basic 中声明数组
在本文前面,我们已经看过几个在 VBA 中声明数组的示例,但这个主题值得仔细研究。 如图所示,一维数组可以这样声明:
将 Team_Members(1 到 20) 调暗为字符串
这样的声明告诉 VBA 编译器该数组 团队成员 由 20 个变量组成,可以在从 1 到 20 的索引处访问它们。但是,我们可能会考虑将数组变量编号从 0 到 19,在这种情况下,数组应该这样声明:
将 Team_Members(0 到 19) 调暗为字符串
实际上,默认情况下,数组元素的编号是从 0 开始的,而在数组声明中,可能根本没有指定初始索引,像这样:
将 Team_Members(19) 调暗为字符串
VBA 编译器会将此类条目视为声明一个包含 20 个元素的数组,其索引从 0 到 19。
声明多维 Visual Basic 数组时适用相同的规则。 如其中一个示例所示,在声明二维数组时,其维度的索引用逗号分隔:
Dim Jan_Sales_Figures(1 到 31, 1 到 5) 作为货币
但是,如果您没有为数组的两个维度指定起始索引并像这样声明它:
Dim Jan_Sales_Figures(31, 5) 作为货币
那么这个条目将被视为一个二维数组,它的第一维包含 32 个索引从 0 到 31 的元素,数组的第二维包含 6 个索引从 0 到 5 的元素。
动态数组
上述示例中的所有数组都有固定的维数。 但是,在许多情况下,我们事先并不知道数组的大小。 我们可以通过声明一个巨大的数组来摆脱这种情况,它的大小肯定会比我们的任务所需的大。 但是这样的解决方案将需要大量额外的内存并且会减慢程序的速度。 有一个更好的解决方案。 我们可以使用动态数组——这是一个数组,其大小可以在宏执行期间任意设置和更改。
使用空括号声明动态数组,如下所示:
将 Team_Members() 调暗为字符串
接下来,您需要在代码执行期间使用表达式声明数组的维度 重新调暗:
ReDim Team_Members(1 到 20)
如果在执行代码的过程中你需要再次改变数组的大小,那么你可以再次使用 ReDim 表达式:
If Team_Size > 20 Then ReDim Team_Members(1 To Team_Size) End If
请记住,以这种方式调整动态数组的大小会导致数组中存储的所有值丢失。 为了将数据存储在数组中,您需要使用关键字 保存如下图所示:
If Team_Size > 20 Then ReDim Preserve Team_Members(1 To Team_Size) End If
不幸的是关键字 保存 只能用于更改数组维度的上限。 不能以这种方式更改数组的下限。 另外,如果数组有多个维度,那么使用关键字 保存,只有数组的最后一个维度可以调整大小。