【发布时间】:2020-03-05 03:14:26
【问题描述】:
我想使用一个包含任意数量字符串的动态数组。该数组由if ... then 逻辑而不是循环填充。我不断收到Subscript out of range 错误:
Dim Files() As String
If True Then
ReDim Preserve Files(UBound(Files) + 1) ' Throws "Subscript out of range" error
Files(UBound(Files)) = "foo.pdf"
End If
If True Then
ReDim Preserve Files(UBound(Files) + 1)
Files(UBound(Files)) = "bar.txt"
End If
If True Then
ReDim Preserve Files(UBound(Files) + 1)
Files(UBound(Files)) = "baz.jpg"
End If
我有一个这样声明的函数:
Function SendFiles(Files() As String)
我想摆脱这个错误尽可能不使用变体。我可以重写代码,但我不能使用循环。
【问题讨论】:
-
一个未调整大小的数组没有
UBound。 -
@bigben 处理这个问题的最干净的方法是什么?我事先不知道需要添加多少条目,没有循环,并且要求我尽可能使用类型。
-
您可以在第一个
If之前使用ReDim Files(0)。如果您一开始就知道可能的最大尺寸,您可以在一开始调整到该尺寸,然后在最后使用 Preserve 删除任何不必要的元素。 -
你知道
ReDim Preserve分配了一个全新的数组,一个一个地复制元素,然后更新原来的引用,对吧?这是一头表现力的猪。如果您有一个希望经常追加的数组,您应该查看Collection类型。 -
If True Then这些行需要吗? TRUE 什么时候不是 TRUE?