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

8voto

Dr. belisarius Punkte 59702

Versuchen Sie dies, um ein leeres Array zu überprüfen:

Dim arr() As String

If (Not arr) = -1 Then
   Debug.Print "empty"
Else
   Debug.Print "UBound is " & UBound(X)
End If  

HTH!

7voto

Alex K. Punkte 165323

Ihre Funktion schlägt fehl, denn wenn kein Fehler durch UBound() (d. h. das Array ist dimensioniert), dann Err.Number 0 ist und:

Case 0
  IsArrayEmpty = True

ausgeführt wird und ein falsches Ergebnis liefert.

Am einfachsten ist es, den Fehler einfach abzufangen:

Function IsArrayEmpty(anArray As Variant) As Boolean
On Error GoTo IS_EMPTY
If (UBound(anArray) >= 0) Then Exit Function
IS_EMPTY:
    IsArrayEmpty = True
End Function

4voto

Nigel Heffernan Punkte 4431

Ist Ihre Array-Variante Empty oder Empty()?

Empty" ist eine nicht initialisierte Variante: IsEmpty(myVar) wird true zurückgeben... Und man könnte Ihnen vorgaukeln, dass Sie ein leeres Array haben (was 'Empty()' ist, nicht 'Empty' - versuchen Sie dranzubleiben, es wird einen kurzen Test nach dieser Klasse geben), weil IsEmpty(myArray) ebenfalls True zurückgibt.

Dim myVar as Variant      ' this is currently Empty, and Ubound returns an error  
Dim myArray() as variant  ' this is currently Empty(), and Ubound returns an error  

Redim myVar(0 to 0)   ' this is no longer empty, and has a valid Ubound  
Redim myArray(0 to 0) ' this is no longer empty, and has a valid Ubound  

Eine zuverlässige Methode zur Überprüfung von myVar ist TypeName(myVar) - wenn es sich um ein Array handelt, enthält der Name Klammern:

If Instr(Typename(myVar), "(") > 0 then  

    ' we now know it is an array  
    If Not IsEmpty(myVar) Then  

       ' We can now check its dimensions  
        If Ubound(myVar) > 0  
             ' insert error-free code here  
        Endif  

    Endif  

Endif  

Die vollständige Antwort lautet 'Detecting an array variant in Excel VBA' auf Excellerando .

3voto

phrebh Punkte 162

Chip Pearson gab die Antwort vor Jahren und funktioniert immer noch. Hier ist die Funktion, die ich seit fast vier Jahren in meiner Bibliothek habe.

Public Function IsArrayEmpty(arr As Variant) As Boolean
    Dim lb As Long
    Dim ub As Long

    Err.Clear
    On Error Resume Next

    If IsArray(arr) = False Then
        ' we weren't passed an array, return True
        IsArrayEmpty = True
    End If

    ' Attempt to get the UBound of the array. If the array is
    ' unallocated, an error will occur.
    ub = UBound(arr, 1)
    If (Err.Number <> 0) Then
        IsArrayEmpty = True
    Else
        ''''''''''''''''''''''''''''''''''''''''''
        ' On rare occasion, under circumstances I
        ' cannot reliably replicate, Err.Number
        ' will be 0 for an unallocated, empty array.
        ' On these occasions, LBound is 0 and
        ' UBound is -1.
        ' To accommodate the weird behavior, test to
        ' see if LB > UB. If so, the array is not
        ' allocated.
        ''''''''''''''''''''''''''''''''''''''''''
        Err.Clear
        lb = LBound(arr)
        If lb > ub Then
            IsArrayEmpty = True
        Else
            IsArrayEmpty = False
        End If
    End If

    Err.Clear
End Function

Grundsätzlich wird geprüft, ob Sie ein Array übergeben haben, dann wird versucht, die obere Grenze zu finden (was zu einem Fehler führt, wenn das Array leer ist), und schließlich wird die untere Grenze mit der oberen Grenze verglichen, um sicherzustellen, dass das Array wirklich nicht leer ist.

1voto

CaBieberach Punkte 1748

.. Ich erhalte immer noch Fehler #9 Skript Überschreitung der Grenzen

Wenn Sie den Fehler #9.... erhalten, bedeutet das nicht, dass Sie die benötigten Informationen erhalten (Array ist leer)?

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