仅包含一个元素的数组的 For 循环

E P*_*E P 5 excel vba

我有一个宏,它几乎按照我想要的方式运行:

该宏根据单元格组合的内容填充字符串。

输入是我转换为数组的范围。E3 列的值位于从第 3 行及以下行开始的单元格中。

With ActiveWorkbook.Worksheets("Sheet2")
Set GclR = .Range("E3", .Range("E3").End(xlDown))
End With

GclArr = GclR.Value
Run Code Online (Sandbox Code Playgroud)

这些数组的大小各不相同,从不存在到六行长度不等。我的代码循环遍历内容并找到每个值并将其放入字符串中相应的位置。

当数组中的值少于 2 个时,就会出现问题。Excel 挂起并崩溃。

我认为这是由于 For 循环造成的:

If GclArr(1, 1) <> 0 Then
    If Gcl <> 0 Then
        For R = 1 To UBound(GclArr, 1)
        GclStr = GclStr & GclArr(R, 1) & " " & Gcl & " "
        Next R
    End If
End If
Run Code Online (Sandbox Code Playgroud)

如果 R = 1 并且 UBound(GclArr, 1) 也 = 1,则 For 循环似乎会变得混乱。(如果 UBound 为 2 或更大,则效果完美)。

我使用 If 语句来处理数组为空时的情况,但无法想出一种方法让它适用于具有单个值的数组。

我可以使用什么其他函数来实现相同的结果,但能够处理数组中的单个值?

Cse*_*nyi 1

如果只有迭代,for 循环没有问题(参见示例)

Sub ForLoopTest()

Dim iItem As Long

For iItem = 1 To 1
        MsgBox (iItem)
        Next iItem

End Sub
Run Code Online (Sandbox Code Playgroud)

您是否考虑过 VBA 数组索引默认从 0 开始。因此,在这种情况下,UBound(GclArr, 1) 的值为 0。为了消除此类问题,可以使用 LBound(GclArr, 1) To UBound(GclArr, 1) 语法可以使用。

If GclArr(1, 1) <> 0 Then
If Gcl <> 0 Then
    For R = LBound(GclArr, 1) To UBound(GclArr, 1)
    GclStr = GclStr & GclArr(R, 1) & " " & Gcl & " "
    Next R
End If
End If
Run Code Online (Sandbox Code Playgroud)

模块开头的 Option Base 1 语句可以修改此行为。在这种情况下,数组的第一个元素的索引将为 1。