excel - 具有 1 个条目的数组循环

标签 excel vba

我的数组来自一个可以包含可变数量条目的范围。

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 个值/条目时,会出现“类型不匹配”错误。

enter image description here

我需要它灵活并可以使用多个值,但也可以仅使用 1 个值。 如果您除了数组之外还有其他建议,我会洗耳恭听。

最佳答案

因为您Dim myArray as Variant变量myArray也可以是一个简单的值(不是数组)。所以如果只有在细胞上像

myArray = Range("A1")

那么它不是数组而是一个值,因此没有要循环的元素。

如果您使用 VarType functionDebug.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/

相关文章:

python - 超链接样式在 xlsxwriter python 中使用 set_column 不起作用

脚本的VBA和Excel优化,处理70万行

excel - 在 VBA Excel 中创建插入语句

尝试将工作表复制到另一个工作簿时 VBA 返回错误 1004

以贴纸格式放置的 VBA 列表

excel - 按字符串中倒数第二个字符实例修剪

excel - 在 Mac 中使用 ODBC 连接从 Excel 查询 Hive 时出现 HortonWorks “Table or view not found”

excel - 索引匹配对于空白单元格返回 0,希望它是 "-"

vba - 删除文件夹中的所有文件

vba - 如何使用 VBA 在 MS Access 中添加新记录?