我希望找到一个压缩的数组处理解决方案,因为必须复制大部分代码才能处理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
答案 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