在 VBA 中附加一个动态数组

Appending a dynamic array in VBA

我正在遍历命名范围并根据单元格是否为空附加一个数组。我对VBA中的数组不太熟悉,所以我的逻辑可能不正确。该代码不断覆盖数组中的第一个元素,并且它永远不会递增。我不确定为什么 UBound(myArray) 即使在将元素分配给第一个索引后也始终保持为 0。

我的代码类似于:

Dim myArray() As Double

ReDim Preserve myArray(0)

    For Each cell In [myRange]
        If cell <> "" Then
            If UBound(myArray) > 0 Then
                ReDim Preserve myArray(0 To UBound(myArray) + 1)
            End If
            myArray(UBound(myArray)) = cell.value
        End If
    Next

If UBound(myArray) > 0 Then 更改为 If UBound(myArray) >= 0 Then 即可解决问题。

Sub Test()
    Dim myArray() As Double
    ReDim Preserve myArray(0)
    For Each cell In Range("Hello")
        If cell <> "" Then
            If UBound(myArray) >= 0 Then
                myArray(UBound(myArray)) = cell.Value
                ReDim Preserve myArray(0 To UBound(myArray) + 1)
            End If
        End If
    Next
End Sub

使用变量并递增它,代码完成时变量是否大于 ubound 没有区别:

Sub Test()
Dim myArray() As Double, X As Long
X = 0
ReDim Preserve myArray(X)
For Each cell In Range("Hello")
    If cell <> "" Then
        ReDim Preserve myArray(0 To X)
        myArray(X) = cell.Value
        X = X + 1
    End If
Next
End Sub

扩展 Dan Donoghue 的解决方案以避免过多的 redim(以及在 Jeanno 的解决方案中通过使用变量进行过多的重新计算),我会使用

Dim rng as Range
    Set rng = Range("Hello")

Dim myArray() As Double, X As Long, N As Long
    X = 0
    N = WorksheetFunction.CountIf(rng, "<>")
    ReDim Preserve myArray(X)

For Each cell In rng
    If cell <> "" And X < N Then
        myArray(X) = cell.Value
        X = X + 1
        If X < N Then ReDim Preserve myArray(0 to X)
    End If
Next