检查 VBA 中的空数组索引(可以包含对象)

问题描述 投票:0回答:2

我需要对 Variant 数组进行

is nothing
检查以排除使用空索引。我使用
is nothing
来捕获保存(空)对象的空索引,它工作正常,但对于保存常规数据类型(而不是对象)的索引,它会抛出异常。

    Dim arrArray() as Variant
    '... fill array with values but leave some indexes out

    'Loop through the array
    For i = LBound(arrArray) To UBound(arrArray)

        'Check if the current array item is an empty object
        If arrArray(i) Is Nothing Then
            'don't debug.print
        
        'Debug if it's not an empty object 
            Else
            Debug.Print arrArray(i)
            End If

        Next

我可以使用

on error resume next
,但由于错误处理是动态完成的,它会改变错误处理状态,所以我想避免这种情况。如果无法避免,请检查我的其他问题

注意:目前我只使用空对象,在将来的某个时候我可能会得到一个实际的对象。因此,从长远来看,我将不得不检查索引是否包含现有对象(否则 - 我认为 - debug.print 将抛出错误)。

arrays vba types variant
2个回答
1
投票

请尝试下一个功能。它将返回一个清理后的数组(没有空元素),适用于各种元素类型:

Function elimEmptyArrayElements(arrX As Variant) As Variant
 Dim i As Long, arrNoEmpty, k As Long
 ReDim arrNoEmpty(UBound(arrX)): k = 0
 For i = LBound(arrX) To UBound(arrX)
    If Not IsMissing(arrX(i)) Then
       If Not IsObject(arrX(i)) Then
            If TypeName(arrX(i)) = "String" Then
                If arrX(i) <> "" Then
                    arrNoEmpty(k) = arrX(i): k = k + 1
                End If
            Else
                If Not IsEmpty(arrX(i)) Then
                    arrNoEmpty(k) = arrX(i): k = k + 1
                End If
            End If
       Else
            Set arrNoEmpty(k) = arrX(i): k = k + 1
       End If
    End If
 Next i
 ReDim Preserve arrNoEmpty(k - 1)
 elimEmptyArrayElements = arrNoEmpty
End Function

请使用下一个

Sub
进行测试。它将停止在每对初始/清理的数组表示上。如果可能,两个数组都会加入
Immediate Window

如果不可能,则仅返回其元素的数量 (

Ubound(arr)
)。您可以在每个数组元素之间进行迭代,并看到不存在空元素:

Sub testElimEmptyArrayElements()
   Dim arr
   arr = Split("1,7,9,,10,5,6,,2,8,3,4", ",")
   Debug.Print Join(arr, "|") 'just to visually see the initial array content
   
   arr = elimEmptyArrayElements(arr)
   Debug.Print Join(arr, "|"): Stop 'the cleaned array
   
   arr = Application.Transpose(Range("A2:A20").value) 'a 1D array extracted from a column range
   Debug.Print Join(arr, "|")

    arr = elimEmptyArrayElements(arr)
    Debug.Print Join(arr, "|"): Stop 'the cleaned array

    arr = Array(1, 2, 3, , 4, , 5): Debug.Print "Initial number of numeric elements: " & UBound(arr)
    arr = elimEmptyArrayElements(arr): Debug.Print "Cleaned array number of numeric elements: " & UBound(arr): Stop

    arr = Array(Range("A2"), Range("A3"), , Range("A6")): Debug.Print "Initial number of Range Object elements: " & UBound(arr)
    arr = elimEmptyArrayElements(arr): Debug.Print "Cleaned array number of Range elements: " & UBound(arr): Stop
    
    arr = Array(ActiveSheet, , ActiveSheet.Next): Debug.Print "Initial number of Sheet Object elements: " & UBound(arr)
    arr = elimEmptyArrayElements(arr): Debug.Print "Cleaned array number of Sheet Object elements: " & UBound(arr): Stop
    
    arr = Array("my string", 100, Range("A2"), , ActiveSheet, , ThisWorkbook, "test", 6): Debug.Print "Initial number of variate elements: " & UBound(arr)
    arr = elimEmptyArrayElements(arr): Debug.Print "Cleaned array number of variate types elements: " & UBound(arr)
      Debug.Print arr(2).value        'the cell value
      Debug.Print arr(3).name         'the activesheet name
      Debug.Print arr(4).Sheets.count 'activeworkbook number of sheets
End Sub

-1
投票

您可以使用

if YourArray(i)<>"" then
语法简单地检查和过滤数组中的空槽

除此之外,我在代码的第一行看到一些错误的声明问题: 1-您不能使用

Array
作为数组的名称 2-您应该在数组名称后使用括号(例如 Dim myArray() 作为变体) 3-变量类型不能有括号(据我所知)

我建议像下面这样声明你的数组:

dim arr()

这样它会自动被视为变体数组。所以我建议的代码是这样的:

Dim arr()
'... fill array with values but leave some indexes out
For i = LBound(arr) To UBound(arr)
    If arr(i)<>"" Then
        'do nothing
    Else
        'do something
    end if
Next i
© www.soinside.com 2019 - 2024. All rights reserved.