我的数组来自一个可以包含可变数量条目的范围。
Dim myArray as Variant, elem as Variant
myArray = hSheet.Range("A1:A" & hSheet.Cells(Rows.Count, 1).End(xlUp).Row)
我正在使用这个数组来循环它的值并执行某些操作。
For Each elem In myArray
Magic
Next elem
当我的数组有超过 1 个值(范围有超过 1 个条目)时,这非常有效。但是,当只有 1 个值/条目时,会出现“类型不匹配”错误。
我需要它灵活并可以使用多个值,但也可以仅使用 1 个值。 如果您除了数组之外还有其他建议,我会洗耳恭听。
最佳答案
因为您Dim myArray as Variant
变量myArray
也可以是一个简单的值(不是数组)。所以如果只有在细胞上像
myArray = Range("A1")
那么它不是数组而是一个值,因此没有要循环的元素。
如果您使用 VarType function到 Debug.Print VarType(myArray)
你会看到它:
- 在
myArray = Range("A1")
之后,它返回eg
VarType = 8
(vbString
) 或5
(vbDouble
) 这意味着它是一个值 - 在
myArray = Range("A1:A5")
之后,它返回eg
VarType = 8204
=8192 + 12
(vbArray
+vbVariant
)
所以你需要区分这两种类型并用它们做不同的事情:
If VarType(myArray) >= 8192 Then 'is array
Debug.Print Join(myArray, ";") 'print whole array
Else
Debug.Print myArray 'print single value
End If
第二种解决方案
请注意,使用 Dim myArray() as Variant
您可以强制变量始终为数组。但随后输入一个简单值(单个单元格)myArray = Range("A1")
将失败,并出现类型不匹配错误。
所以你需要以不同的方式填充变量myArray
:
Dim myArray() as Variant 'forced to be an array!
Dim MyRange As Range
Set MyRange = hSheet.Range("A1:A" & hSheet.Cells(Rows.Count, 1).End(xlUp).Row)
If MyRange.Cells.Count > 1 Then 'is array
myArray = MyRange.Value
Else
'create an array with only one item
ReDim myArray(1 To 1, 1 To 1) As Variant
myArray(1, 1) = MyRange.Value
End If
'now you can always loop even if only one cell was in the range
For Each elem In myArray
Magic
Next elem
关于excel - 具有 1 个条目的数组循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65791854/