这不是一个“数组”,但 VBA 确实有一个Dictionary
对象(此链接也很有用)可能适合您的需要。您需要添加对 的引用Microsoft Scripting Runtime
,然后您可以创建一个无类型键控字典(实际上Item
属性是 a Variant
),它可以动态增长。链接有更完整的示例,但用法基本上是:
Set dict = New Dictionary
'Example for adding item to Dictionary
For i = 1 to 100
dict.Add Key:=i, Item:=someData
Next
'Example for retrieving item from dictionary by Key
For i = 1 to 100
Debug.Print dict(i)
Next
还有一个Collection
对象,它提供类似的功能和类似的用法,但不需要添加对 的引用Microsoft Scripting Runtime
,但Dictionary
提供了一些更有用的方法,例如dict.Exists()
检查特定键是否存在。还有一些属性可以让您将所有项目.Keys
或键提取为-typed 数组.Items
Dictionary
Variant
即使您明确声明不想重新调整数组,在创建后调整数组大小的唯一替代方法是Preserve
在 redim 语句上使用修饰符。这将允许您在创建后灵活地更改数组大小。我说“一些灵活性”的原因是您只能更改数组的最后一个维度。
Dim myarray(2, 2)
Redim Preserve myarray(2, 4) 'this works
Redim Preserve myarray(3, 4) 'this is not allowed
正如您所提到的,这是资源密集型的,因为您实际上并没有更改数组的大小,您实际上只是创建了一个新数组并将旧数组的内容复制到其中。
最后一个选择是从 VBA 切换到 .NET。假设您有适当版本的 Visual Studio可供您使用,您将可以访问VSTO而不是 Office 附带的 VBA 编辑器,然后您将能够为 Excel 和其他 Office 开发符合 CLR 的加载项产品。然后,您将有权访问所有 .NET 集合。同样,这些不是“数组”,因为 .NET 数组具有相同的限制(它们无法调整大小),但您拥有可能适合您需要的动态大小的集合。