none
Acc2007: Wie stelle ich die Ausdehnung eines Arrays fest (Fehler bei UBound)

    Frage

  • Ich habe eine VBA-Funktion geschrieben, die ein String-Array zurückliefert.

    Das funktionert zwar wunderbar, Probleme gibt es aber, falls die Funktion kein ERgebnis zurückliefert.

    Dies habe ich versucht festzustellen, indem ich die Funktion Ubound(termine) anwende.

    Leider liefert UbOund offenbar nicht "0" zurück wenn termine() gar keine Mitglieder enthält, sondern löst einen Fehler aus.

    Wie gehe ich dabei vor ?

    Donnerstag, 7. April 2011 12:48

Antworten

  • Hallo NicoNi,

    NicoNi schrieb folgendes:

    Ich habe eine VBA-Funktion geschrieben, die ein String-Array
    zurückliefert.

    Das funktionert zwar wunderbar, Probleme gibt es aber, falls die
    Funktion kein ERgebnis zurückliefert.

    Dies habe ich versucht festzustellen, indem ich die Funktion
    Ubound(termine) anwende.

    Leider liefert UbOund offenbar nicht "0" zurück wenn termine() gar keine Mitglieder enthält, sondern löst einen Fehler aus. Wie gehe ich dabei vor ?

    mit einer Fehlerbehandlung:

    On Error GoTo FuncErr
    
    Debug.Print UBound(termine())
    
    ExitFunc:
        Exit Sub
    FuncErr:
        Select Case Err
            Case 9
                ' Fehler 9
                ' Hier deinen Code wenn Array nicht gefüllt
                Resume ExitFunc
            Case Else
                MsgBox "Fehler in Funktion" & vbCrLf & _
                       "Nr: " & Err.Number & vbCrLf & _
                       "Description: " & Err.Description, vbCritical
                Resume ExitFunc
        End Select

    Gruß
    Gunter



    Access FAQ: http://www.donkarl.com

          http://www.avenius.de - http://www.AccessRibbon.de
    http://www.ribboncreator.de - http://www.ribboncreator2010.de

    Donnerstag, 7. April 2011 13:16
    Moderator
  • Hallo NicoNi

    NicoNi wrote:

    Ich habe eine VBA-Funktion geschrieben, die ein String-Array
    zurückliefert.

    Das funktionert zwar wunderbar, Probleme gibt es aber, falls die Funktion
    kein ERgebnis zurückliefert.

    Dies habe ich versucht festzustellen, indem ich die Funktion
    Ubound(termine) anwende.

    Leider liefert UbOund offenbar nicht "0" zurück wenn termine() gar keine
    Mitglieder enthält, sondern löst einen Fehler aus.

    Wie gibst Du das Array zurück? Als Variant? Falls nicht, versuche es damit. Dann kannst Du beim Aufrufer folgendes machen:

    Dim varArray as Variant
    varArray = DeineFunktion()
    If VarType(varArray) And vbArray = vbArray Then
     MsgBox "es wurden " & UBound(varArray()) & " Strings zurückgeliefert"
    Else
     MsgBox "Da kam nix zurück, ätsch"
    End If

    Die Alternative, die man häufig sieht, den Code in einen Fehler laufen zu lassen und dann den Fehler zu prüfen, ist irgendwie nicht mein Stil. Da greife ich lieber auf den Varaint Datentyp zurück, der auch Arrays aufnehmen kann.

    Gruss
    Henry

    Freitag, 8. April 2011 09:25
  • Hallo!

    Zum Überpürfen, ob ein dynamisches Array initialisiert wurde, kann man folgende Variante probieren:

    Dim Termine() As Date
    If (0 / 1) + (Not Not Termine) = 0 Then
     Debug.Print "Array ist nicht dimensioniert"
    End If
    

    siehe: http://www.vbarchiv.net/tipps/tipp_798-pruefen-ob-array-dimensioniert-ist-ii.html

    mfg
    Josef


    Code-Bibliothek für Access-Entwickler
    AccUnit - Testen von Access-Anwendun
    Sonntag, 10. April 2011 20:04

Alle Antworten

  • Hallo NicoNi,

    NicoNi schrieb folgendes:

    Ich habe eine VBA-Funktion geschrieben, die ein String-Array
    zurückliefert.

    Das funktionert zwar wunderbar, Probleme gibt es aber, falls die
    Funktion kein ERgebnis zurückliefert.

    Dies habe ich versucht festzustellen, indem ich die Funktion
    Ubound(termine) anwende.

    Leider liefert UbOund offenbar nicht "0" zurück wenn termine() gar keine Mitglieder enthält, sondern löst einen Fehler aus. Wie gehe ich dabei vor ?

    mit einer Fehlerbehandlung:

    On Error GoTo FuncErr
    
    Debug.Print UBound(termine())
    
    ExitFunc:
        Exit Sub
    FuncErr:
        Select Case Err
            Case 9
                ' Fehler 9
                ' Hier deinen Code wenn Array nicht gefüllt
                Resume ExitFunc
            Case Else
                MsgBox "Fehler in Funktion" & vbCrLf & _
                       "Nr: " & Err.Number & vbCrLf & _
                       "Description: " & Err.Description, vbCritical
                Resume ExitFunc
        End Select

    Gruß
    Gunter



    Access FAQ: http://www.donkarl.com

          http://www.avenius.de - http://www.AccessRibbon.de
    http://www.ribboncreator.de - http://www.ribboncreator2010.de

    Donnerstag, 7. April 2011 13:16
    Moderator
  • Hallo NicoNi

    NicoNi wrote:

    Ich habe eine VBA-Funktion geschrieben, die ein String-Array
    zurückliefert.

    Das funktionert zwar wunderbar, Probleme gibt es aber, falls die Funktion
    kein ERgebnis zurückliefert.

    Dies habe ich versucht festzustellen, indem ich die Funktion
    Ubound(termine) anwende.

    Leider liefert UbOund offenbar nicht "0" zurück wenn termine() gar keine
    Mitglieder enthält, sondern löst einen Fehler aus.

    Wie gibst Du das Array zurück? Als Variant? Falls nicht, versuche es damit. Dann kannst Du beim Aufrufer folgendes machen:

    Dim varArray as Variant
    varArray = DeineFunktion()
    If VarType(varArray) And vbArray = vbArray Then
     MsgBox "es wurden " & UBound(varArray()) & " Strings zurückgeliefert"
    Else
     MsgBox "Da kam nix zurück, ätsch"
    End If

    Die Alternative, die man häufig sieht, den Code in einen Fehler laufen zu lassen und dann den Fehler zu prüfen, ist irgendwie nicht mein Stil. Da greife ich lieber auf den Varaint Datentyp zurück, der auch Arrays aufnehmen kann.

    Gruss
    Henry

    Freitag, 8. April 2011 09:25
  • Die Version mit bAbfangen eines provozierten Fehlers funktioniert nach dem Vorbild oben.

    Eleganter scheint mir aber Deine Method zu sein.

     

    Samstag, 9. April 2011 15:05
  • Hallo!

    Zum Überpürfen, ob ein dynamisches Array initialisiert wurde, kann man folgende Variante probieren:

    Dim Termine() As Date
    If (0 / 1) + (Not Not Termine) = 0 Then
     Debug.Print "Array ist nicht dimensioniert"
    End If
    

    siehe: http://www.vbarchiv.net/tipps/tipp_798-pruefen-ob-array-dimensioniert-ist-ii.html

    mfg
    Josef


    Code-Bibliothek für Access-Entwickler
    AccUnit - Testen von Access-Anwendun
    Sonntag, 10. April 2011 20:04