我不喜欢未初始化的VBA数组,因为每次使用
出于同样的原因,我尝试创建一个空的2d数组。不能简单地执行
实际上,这真的是调试中的空2d数组:
UBound()
或For Each
之前都需要检查数组是否已初始化,以避免异常,并且没有本地VBA函数可以检查它。这就是为什么我初始化数组,至少要用a = Array()
将它们置为空。这在大多数情况下消除了额外检查的必要性,因此1d数组没有问题。出于同样的原因,我尝试创建一个空的2d数组。不能简单地执行
ReDim a(0 To -1, 0 To 0)
、转置1d空数组或类似的操作。我偶然发现的唯一方法是使用MSForms.ComboBox
,将空数组分配给.List
属性并读取回来。以下是示例,在Excel和Word中可行,您需要向VBA项目中插入UserForm
,将ComboBox
放置在其中,并添加以下代码:Private Sub ComboBox1_Change()
Dim a()
ComboBox1.List = Array()
a = ComboBox1.List
Debug.Print "1st dimension upper bound = " & UBound(a, 1)
Debug.Print "2nd dimension upper bound = " & UBound(a, 2)
End Sub
组合框改变后的输出为:
1st dimension upper bound = -1
2nd dimension upper bound = 0
实际上,这真的是调试中的空2d数组:
有没有更优雅的方法创建一个空的二维数组,而不使用ComboBox
或一般的UserForm
控件?
a=Array();redim a(,0 to 0)
。 - JNevillOERN
的方法必须是最后的手段,唯一使用它们的借口是显著的简单性和性能优势。而真正的重点是改变2D数组处理模式并摆脱额外的检查。你知道,“如果一开始的想法不荒谬,那就没有希望了。” - omegastripes(0到-1, 0到0)
的数组,并且无法通过任何非hacky的方式重复。我唯一的想法是在C#中构建一个自定义库,并在你的代码中"引用"它。然而,如果你想分发这个表格,这并不是一个好的解决方案,而且我只是猜测你是否能够在自定义库中完成这个操作。 - JNevill