【发布时间】:2020-04-21 09:55:52
【问题描述】:
我不喜欢未初始化的 VBA 数组,因为每次使用 UBound() 或 For Each 之前都必须检查 if array is initialized 以避免异常,并且没有本地 VBA 函数来检查它。这就是我初始化数组的原因,至少用a = Array() 将它们清空。这在大多数情况下消除了额外检查的需要,因此一维数组没有问题。
出于同样的原因,我尝试创建一个空的二维数组。不可能简单地做ReDim a(0 To -1, 0 To 0),转置一维空数组或类似的东西。我偶然遇到的唯一方法是使用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
其实debug中确实是空的二维数组:
有没有更优雅的方法来创建一个空的二维数组,而不使用ComboBox 或UserForm 控件?
【问题讨论】:
-
我不知道答案,但我确实找到了一种让 excel 崩溃的好方法。我想知道这是否会影响其他人。尝试仅在子例程中编写以下行(先保存您的工作):
a=Array();redim a(,0 to 0) -
@JNevill 瞬间崩溃!
-
你现在让我玩这个
-
我认为这是一个 XY 问题。您应该问的是 如何轻松检查数组是否已初始化? 。 CPearsom.com here 上提供了一个很好的解决方案
-
我必须承认这个问题本身可能听起来很宽泛,因此很容易被视为 XY 问题。请注意,我已经发布了链接how to check if array is initialized,IMO
OERN之类的方法必须是最后的手段,使用它们的唯一借口是显着的简单性和对他人的性能。真正的重点是要改变二维数组处理模式并摆脱额外的检查。你知道,“如果一开始这个想法不是荒谬的,那么它就没有希望了。”
标签: arrays excel vba multidimensional-array is-empty