强制单元素数组的创建和“循环”? (VBA)

时间:2018-02-18 12:07:11

标签: arrays vba variables

我希望找到一个压缩的数组处理解决方案,因为必须复制大部分代码才能处理1个元素的列表。 (0元素不是一个大问题,因为它不需要执行)

如果我创建

testRange As Variant 
testRange = .ListColumns(2).DataBodyRange.Value2 'Case only 1 row in list
IsArray(testRange) 'FALSE!

我试过了

testRange() As Variant
testRange() As String
...

如果只输入1个元素,是否有办法强制VBA创建数组? 之后有一种方法可以无差错地使用:

For i = LBound(testRange) To UBound(testRange)

或者

For each i in testRange

使用该1个成员数组,仅为了1个成员列表而没有编写特定的异常?

如果没有我可能会回到“好老”的方法:

For each cell in .ListColumns(2).DataBodyRange  

唯一的缺点是执行速度有点慢,对吧?

修改 来自@CallumDA的好主意 我需要更多提示来更好地理解这一点,并让它发挥作用。 我测试过:

Public Sub Test2()
    Dim testRange As Variant
    With Sheet1.ListObjects(1).ListColumns(2).DataBodyRange
        testRange = IIf(.Count = 1, Array(.Value2), .Value2)
    End With
    For i = (LBound(testRange)) To (UBound(testRange))
        Debug.Print i & " : " ' & testRange(i, 1)
    Next
End Sub

为什么当有1个元素时, i 以0开头, 但是当有多个元素时, i 以1?

开头

为什么会这样, testRange(i,1)会出现“Suscript out of range”错误? (在1元素场景的情况下) 我应该如何测试两种情况下都接受的值?

旁注:我已经对这种数组方法和“每个元素”方法进行了性能比较,看看它是否值得付出努力。 在3000个元素表列表的情况下,差异是2ms对10ms (所以它在乘数方面确实是一个很大的不同,但幸运的是,对于我的情况来说,速度越慢越快。)

For i = (LBound(testRange)) To (UBound(testRange))
         If testRange(i, 1) = "kaslkfjghh" Then 
VS.
For Each cell In Sheet1.ListObjects(2).ListColumns(1).DataBodyRange
         If cell.Value2 = "kaslkfjghh" Then 

1 个答案:

答案 0 :(得分:1)

您可以使用Data强制元素进入数组。如果Array中只有一个元素,那么请使用它:

ListColumn

如果您的Public Sub Test() Dim testRange As Variant testRange = Array(Sheet1.ListObjects(1).ListColumns(2).DataBodyRange.Value2) Debug.Print IsArray(testRange) End Sub 中有时会有多个,请使用以下内容:

ListColumn