Hi,
ich brauche für eine Routine die Möglichkeit zu überprüfen, ob ein dynamisches Array initialisiert ist. Eigentlich sollte es ja möglich sein, einfach mit Ubound die Länge des Arrays abzufragen und den im Falle eines leeren Arrays auftretenden Laufzeitfehler 9 mit einem On Error statement abzufangen. Leider funktioniert genau das bei mir nicht (Excel 2010, Win 7), es kommt trotz des On Error statements der Laufzeitfehler. Kann mir jemand verraten, warum das nicht klappt?
Beipsiel:
Alternativ würde mir auch ein anderer Weg helfen, mit dem ich leere dynamische Arrays erkennen kann.
Ich habe auch Ansätze gefunden, welche die Funktionen
Private Declare Sub GetSafeArrayPointer Lib "msvbvm60.dll" Alias "GetMem4" (ar() As Any, ptr As Long)
oder
Private Declare Function SafeArrayGetDim Lib "oleaut32.dll" (ByRef ar() As Any) As Long
verwenden. Diese Funktionieren im Prinzip auch, sie versagen aber, wenn das Array in einem Variant verpackt ist (was in meinem Fall leider vorkommt):
Und dann habe ich noch eine Möglichkeit mit "not not" gefunden:
Diese Möglichkeit versagt auch wieder bei dem in variant verpackten array. Woran liegt das eigentlich? ich dachte, dass das Variant durch die Zuweisung in diesem Fall zu einem Array of strings wird:
Debug.Print IsArray(var) ' liefert "Wahr"
Debug.Print IsEmpty(var) 'liefert "falsch"
Debug.Print IsNull(var) 'liefert auch "falsch"
ich brauche für eine Routine die Möglichkeit zu überprüfen, ob ein dynamisches Array initialisiert ist. Eigentlich sollte es ja möglich sein, einfach mit Ubound die Länge des Arrays abzufragen und den im Falle eines leeren Arrays auftretenden Laufzeitfehler 9 mit einem On Error statement abzufangen. Leider funktioniert genau das bei mir nicht (Excel 2010, Win 7), es kommt trotz des On Error statements der Laufzeitfehler. Kann mir jemand verraten, warum das nicht klappt?
Beipsiel:
Alternativ würde mir auch ein anderer Weg helfen, mit dem ich leere dynamische Arrays erkennen kann.
Ich habe auch Ansätze gefunden, welche die Funktionen
Private Declare Sub GetSafeArrayPointer Lib "msvbvm60.dll" Alias "GetMem4" (ar() As Any, ptr As Long)
oder
Private Declare Function SafeArrayGetDim Lib "oleaut32.dll" (ByRef ar() As Any) As Long
verwenden. Diese Funktionieren im Prinzip auch, sie versagen aber, wenn das Array in einem Variant verpackt ist (was in meinem Fall leider vorkommt):
VB.NET-Quellcode
- Private Declare Sub GetSafeArrayPointer Lib "msvbvm60.dll" Alias "GetMem4" (ar() As Any, ptr As Long)
- Private Declare Function SafeArrayGetDim Lib "oleaut32.dll" (ByRef ar() As Any) As Long
- Public Sub test2()
- Dim ar() As String, ptr As Long
- GetSafeArrayPointer ar, ptr
- Debug.Print ptr
- Debug.Print SafeArrayGetDim(ar)
- Dim var As Variant
- var = ar
- GetSafeArrayPointer var, ptr 'Hier stoppt der Kompiler: unverträglicher Typ: Datenfeld oder benutzerdefinierter Typ erwartet
- Debug.Print ptr
- Debug.Print SafeArrayGetDim(var) 'Hier stoppt der Kompiler: unverträglicher Typ: Datenfeld oder benutzerdefinierter Typ erwartet
- End Sub
Und dann habe ich noch eine Möglichkeit mit "not not" gefunden:
VB.NET-Quellcode
- Public Sub test3()
- Dim ar() As String, laenge As Long
- If (Not Not ar) = 0 Then laenge = -1 Else laenge = UBound(ar) 'Funktioniert!
- Debug.Print laenge
- Dim var As Variant: var = ar
- If (Not Not var) = 0 Then laenge = -1 Else laenge = UBound(var) 'Laufzeitfehler '13': Typen unverträglich
- Debug.Print laenge
- End Sub
Diese Möglichkeit versagt auch wieder bei dem in variant verpackten array. Woran liegt das eigentlich? ich dachte, dass das Variant durch die Zuweisung in diesem Fall zu einem Array of strings wird:
Debug.Print IsArray(var) ' liefert "Wahr"
Debug.Print IsEmpty(var) 'liefert "falsch"
Debug.Print IsNull(var) 'liefert auch "falsch"
Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „ai5g“ ()