2010-11-04 3 views
6

Ich schreibe ein Skript, das durch mich Excel-Tabelle durchlaufen und finden Sie, ob es Duplikate der ausgewählten Zellen sind. Wenn es Duple gibt, gibt die Funktion ein Array zurück, dessen Zeilen Duplikate sind, und einen Kommentar erstellen. Sag mir, welche Zeilen Duplikate sind. Ich war in der Lage, Fehler 0 zu behandeln, aber jetzt bekomme ich Fehler 9, wenn ich das Array überprüfe, wenn es Elemente gibt, die die UBound Funktion verwenden. Jemand weiß, wie man das Array von ganzen Zahlen validiert, wenn es leer ist oder nicht, weil mein Code scheint, die Arbeit nicht zu machen. Unten ist mein CodeVBA Handle Empty Array Error

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 

Antwort

5

das Versuchen 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!

+2

Ich behaupte keine besonderen Kenntnisse, aber anscheinend diese Methode der Suche nach einem leeren Array nutzt einen Fehler in VBA und sollte nicht verwendet werden: http://stackoverflow.com/questions/183353/how-do-i- deet-wenn-ein-Array-is-initialisiert-in-vb6/183356 # 183356 – jtolle

+0

@jtolle - Ihr Link ist sicherlich die definitive Diskussion dieser Frage. vielleicht sollte dieses Q ein dup markiert werden. oder zumindest Ihr Link sollte die Antwort auf Talguys Q. – hawbsl

+0

@jtolle sein. Ich habe dieses Ding schon früher benutzt, aber da ich es nicht erschaffen habe, beanspruche ich keine Tugend. –

6

Ihre Funktion versagt, weil, wenn es kein Fehler durch UBound() angehoben ist (das heißt die Anordnung bemessen ist), dann ist Err.Number 0 und:

Case 0 
    IsArrayEmpty = True 

ausgeführt wird, ein falsches Ergebnis zurück.

Der einfachste Weg ist, einfach Falle der Fehler:

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 
+0

, die besser funktionierte, aber ich bekomme immer noch Fehler # 9 Skript außerhalb der Grenzen – Talguy

+1

'Dim a(): Debug.Print IsArrayEmpty (a)' funktioniert gut für mich ... Make sicher, dass Sie nicht Extras> Optionen> Allgemein> Pause auf alle Fehler gesetzt haben –

+0

Funktioniert auch für mich. –

1

.. I am still getting error #9 script out of bounds

, wenn Sie erhalten Fehler # 9 .... heißt das nicht, dass Sie die Informationen sind geting, die Sie benötigen (array ist leer)?

+0

das ist die Information, die ich will, aber es Programm springt nicht auf den Error-Handler stattdessen bekomme ich den Pop, der Fehler 9 sagt – Talguy

+0

Hallo Talguy, haben Sie Alex K. suggestion versucht? Nach diesem Link , wenn Sie es in einem Office-Programm ändern, könnte es auf den anderen übertragen werden. – CaBieberach

+0

Überprüfen Sie auch diesen Link . Abschnitt "Fehlerbehandlung von Blöcken und bei Fehler Goto". (Mehrere "On Error" -Anweisung in der gleichen Prozedur wird nicht richtig fangen.) – CaBieberach

3

Ist Ihre Array-Variante leer oder leer()?

'Leere' eine uninitialised Variante: IsEmpty (myVar) wird true zurück ... Und Sie täuschen könnte zu denken, Sie ein leeres Array (die 'Empty()', nicht 'leer' ist - versuchen, Schritt halten, es wird einen kurzen Test nach dieser Klasse geben), weil IsEmpty (myArray) auch 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 Art und Weise meineVar zu überprüfen ist, Type-Name (myVar) - wenn es ein Array ist, wird der Name enthält 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 ist ‚eine Array-Variante in Excel-VBA-Erkennung 'auf Excellerando.

0

Sie überprüfen können, ob das Array durch Abrufen aller Elemente leer ist JScript gräflichen mit VBArray() Objekt (funktioniert mit Arrays von Variantentyp, 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 

Für mich ist es etwa 0,3 mksec für jede nimmt Element + 15 ms Initialisierung, so dass die Anordnung von 10M Elementen etwa 3 Sekunden dauert. Die gleiche Funktionalität könnte über ScriptControl ActiveX (es ist nicht verfügbar in 64-Bit MS Office-Versionen, so dass Sie eine Umgehung wie this verwenden können) implementiert werden.