10 Stimmen

Behandlung des Fehlers 9 bei einem leeren Array

Ich schreibe ein Skript, das eine Excel-Tabelle in einer Schleife durchläuft und feststellt, ob es Duplikate in ausgewählten Zellen gibt. Wenn es Duplikate gibt, gibt die Funktion ein Array zurück, in dem steht, welche Zeilen Duplikate sind, und erstellt einen Kommentar, um mir die Zeilen zu nennen.

Ich war in der Lage, Fehler 0 zu behandeln, aber jetzt erhalte ich Fehler 9, wenn ich prüfe, ob es Elemente im Array mit der Funktion UBound gibt.

Wie überprüfe ich, ob das Array der ganzen Zahlen leer ist?

Function IsArrayEmpty(anArray As Variant) As Boolean
    Dim i As Integer

    On Error Resume Next
        i = UBound(anArray, 1)
    Select Case (Err.Number)
        Case 0
            IsArrayEmpty = True
        Case 9
            IsArrayEmpty = True
        Case Else
            IsArrayEmpty = False
    End Select
End Function

1voto

Kepa Punkte 9

Sie können jederzeit die Funktion "isArray()" verwenden

Dim yourArray as variant
if not isArray(your_array) then
   msgbox("empty")
else
   msgbox("with data")
end if

0voto

omegastripes Punkte 11952

Sie können überprüfen, ob das Array leer ist, indem Sie die Gesamtzahl der Elemente mit JScripts VBArray() Objekt (funktioniert mit Arrays unterschiedlichen Typs, ein- oder mehrdimensional):

Sub Test()

    Dim a() As Variant
    Dim b As Variant
    Dim c As Long

    ' Uninitialized array of variant
    ' MsgBox UBound(a) ' gives 'Subscript out of range' error
    MsgBox GetElementsCount(a) ' 0

    ' Variant containing an empty array
    b = Array()
    MsgBox GetElementsCount(b) ' 0

    ' Any other types, eg Long or not Variant type arrays
    MsgBox GetElementsCount(c) ' -1

End Sub

Function GetElementsCount(aSample) As Long

    Static oHtmlfile As Object ' instantiate once

    If oHtmlfile Is Nothing Then
        Set oHtmlfile = CreateObject("htmlfile")
        oHtmlfile.parentWindow.execScript ("function arrlength(arr) {try {return (new VBArray(arr)).toArray().length} catch(e) {return -1}}"), "jscript"
    End If
    GetElementsCount = oHtmlfile.parentWindow.arrlength(aSample)

End Function

Bei mir dauert es etwa 0,3 mksec für jedes Element + 15 msec Initialisierung, so dass das Array mit 10M Elementen etwa 3 sec benötigt. Die gleiche Funktionalität könnte implementiert werden über ScriptControl ActiveX (es ist in 64-Bit-Versionen von MS Office nicht verfügbar, daher können Sie eine Umgehung wie este ).

0voto

Joaquinglezsantos Punkte 1180

UBound und LBound geben die oberen und unteren Grenzen eines gegebenen Arrays zurück. Wenn also Ubound(arr) gleich LBound(arr) ist, dann ist es leer.

Dim arr() As String

If UBound(arr) = LBound(arr) Or UBound(arr) <= 0 Then
   Debug.Print "empty"
Else
   Debug.Print "not empty"
End If

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X