Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen

Frage zu Ubound | Herbers Excel-Forum


Betrifft: Frage zu Ubound von: Philipp
Geschrieben am: 23.11.2009 10:43:37

Morgen zusammen.

Ich habe eine array Variable namens Crash_names.

Die variable hat nicht immer den gleichen Rang.

z.B. Crash_names(0,0)(0) = 10
Crash_names(0,0)(1) = 9
Crash_names(0,0)(2) = 8

Crash_names(1,0) = 9

Crash_names(2,0)(1) = 9
Crash_names(2,0)(2) = 4

Jetzy möchte ich eine Abfrage bauen , die mir sagt, wie groß der Bereich Crash_names(j,0) ist.
Das mache ich mit if Ubound(Crash_names(j,0)).

jedoch kommt in dem Fall Ubound(Crash_names(1,0)) immer eine Fehlermeldung Typ Unverträglich an stelle einer 0.

Wie kann ich sozusagen den Rang abfragen ohne eine Fehlermeldung zu erhalten.

Danke im Voraus.

Gruß Phil
Wie

  

Betrifft: AW: Frage zu Ubound von: fcs
Geschrieben am: 23.11.2009 11:23:32

Hallo Phil,

du verwendest für die Abfrage der Dimensionen eines Arrays die falsche Syntax.

Hier ein Beispiel:

Sub ReDimHilfe()
  Dim Crash_names()

  ReDim Crash_names(0 To 4, 1 To 3)
  MsgBox "Dimensionen von Crash_names(0 To 4, 1 To 3)" & vbLf _
    & "Untere Grenze Dimension 1:  " & LBound(Crash_names, 1) & vbLf _
    & "Obere Grenze Dimension 1:  " & UBound(Crash_names, 1) & vbLf _
    & "Untere Grenze Dimension 2:  " & LBound(Crash_names, 2) & vbLf _
    & "Obere Grenze Dimension 2:  " & UBound(Crash_names, 2)
  ReDim Crash_names(1 To 4, 0 To 1)
  MsgBox "Dimensionen von Crash_names(1 To 4, 0 To 1)" & vbLf _
    & "Untere Grenze Dimension 1:  " & LBound(Crash_names, 1) & vbLf _
    & "Obere Grenze Dimension 1:  " & UBound(Crash_names, 1) & vbLf _
    & "Untere Grenze Dimension 2:  " & LBound(Crash_names, 2) & vbLf _
    & "Obere Grenze Dimension 2:  " & UBound(Crash_names, 2)
End Sub

Gruß
Franz


  

Betrifft: AW: Frage zu Ubound von: Philipp
Geschrieben am: 23.11.2009 11:39:32

Hallo Franz.

An welcher Stelle ist die Syntax falsch. Eigendlich verstehe ich die Befehle LBound und UBound.

Ich möchte wissen , an welchen Stelle es noch Unterdimensionen gibt.
Wie kann ich so eine abfrage basteln?

z.B. Crash_names(0,0) hat 1 Unterdimension mit 3 Feldern die man so ansprechen kann Crash_names(0,0)(?)

jedoch hat Crash_names(1,0) keine wieter Unterdimension.

Wie kann ich das herausfinden


Gruß Philipp


  

Betrifft: meinst Du die drei Dimensionen? von: Tino
Geschrieben am: 23.11.2009 12:07:14

Hallo,

Sub beispiel()

Dim meArray(5, 6, 7)

meArray(0, 1, 0) = "Test1"
meArray(1, 1, 6) = "Test2"
meArray(5, 6, 7) = "Test3"

MsgBox "1. Dimension: " & UBound(meArray, 1) & vbCr & _
       "2. Dimension: " & UBound(meArray, 2) & vbCr & _
       "3. Dimension: " & UBound(meArray, 3) & vbCr


End Sub
Die Anzahl Zeilen und Spalten der dritten Dimension ist die der Dimension 1 und 2.

Gruß Tino


  

Betrifft: Deine MsgBox wird nicht erscheinen,... von: Luc:-?
Geschrieben am: 23.11.2009 17:03:20

...Tino,
wenn eine Dimension nicht vorhanden ist! Du solltest den dann mögl Fehlerwert in Text umwandeln und außerdem die Weiterarbeit bei Fehler zulassen oder eine entsprechende Fehlerbehdl vorsehen!
Ich mache das immer so:
If IsError(UBound(myArray, 3)) Then
    ...
ElseIf IsError(UBound(myArray, 2)) Then...


Gruß Luc :-?


  

Betrifft: war ja nur ein Beispiel. von: Tino
Geschrieben am: 23.11.2009 17:37:27

Hallo,
man könnte auch die Anzahl der Dimensionen mit API (CopyMemory) bestimmen.

Gruß Tino


  

Betrifft: AW: Frage zu Ubound von: fcs
Geschrieben am: 23.11.2009 13:35:03

Hallo Phil,

bei geschachtelten Arrays oder Arrays mit Unterdimensionen kann man die Dimensionen der Unterdimensionen wie im folgenden Beispiel ermitteln. ggf. muss hier auch eine Fehlerbehandlung eingebaut werden, da eine nicht vorhandene Unterdimension zu einem Fehler führt.

Gruß
Franz

Sub UboundHilfe()
  
  Dim a, x, i1&, i2&, i3&
  On Error GoTo Fehler
  a = Array(1, Array(Array(1, 2, 3), Array(1, 3, 3), Array(1, 4, 3)), _
      Array(Array(1, 5, 3), Array(1, 2, 3), Array(2, 3, 3), 2, Array(2, 5, 3)))
  If IsArray(a) Then
  For i1 = LBound(a, 1) To UBound(a, 1)
    If IsArray(a(i1)) Then
      For i2 = LBound(a(i1), 1) To UBound(a(i1), 1)
        If IsArray(a(i1)(i2)) Then
          For i3 = LBound(a(i1)(i2)) To UBound(a(i1)(i2))
            x = a(i1)(i2)(i3)
          Next
        Else
          x = a(i1)(i2)
        End If
      Next
      Else
        x = a(i1)
      End If
  Next
  x = a
  End If
Fehler:
  With Err
    Select Case .Number
    Case 0
    Case Else
      MsgBox "Fehler-Nr.: " & .Number & vbLf & .Description
    End Select
  End With
End Sub



  

Betrifft: AW: Frage zu Ubound von: ChrisL
Geschrieben am: 23.11.2009 11:39:18

Hallo Phil

Mal frei interpretiert...

Sub t()
Dim crash_names(2, 2) As Variant

crash_names(0, 0) = 10
crash_names(1, 0) = 9
crash_names(2, 0) = 8

crash_names(0, 1) = 9

crash_names(0, 2) = 9
crash_names(1, 2) = 4

MsgBox "Ergebnis 1 = " & UboundSpecial(crash_names, 0)
MsgBox "Ergebnis 2 = " & UboundSpecial(crash_names, 1)
MsgBox "Ergebnis 3 = " & UboundSpecial(crash_names, 2)

End Sub
Function UboundSpecial(ar As Variant, iRow As Long) As Variant
Dim i As Long

For i = 0 To UBound(ar)
    If ar(i, iRow) <> "" Then UboundSpecial = ar(i, iRow)
Next i
End Function

Hoffe du kannst etwas damit anfangen.

cu
Chris


  

Betrifft: AW: Frage zu Ubound von: Philipp
Geschrieben am: 23.11.2009 11:53:47

Komm irgendwie nicht weiter

hier mein Quellcode:




Global crash_names As Variant
Global ReqWbook As Workbook
Global bmwWbook As Workbook

Function ausgabe()
Dim mysheet As Object

For i_sheet = 4 To bmwWbook.Sheets.Count
Set mysheet = bmwWbook.Sheets(i_sheet)

i_spalte = 0
With mysheet


If InStr(1, mysheet.Name, "CSFrt1exc", vbTextCompare) > 1 Then
    i_spalte = 2
ElseIf InStr(1, mysheet.Name, "CSFrt2exc", vbTextCompare) > 1 Then
    i_spalte = 3
ElseIf InStr(1, mysheet.Name, "CSFrt3exc", vbTextCompare) > 1 Then
    i_spalte = 4
ElseIf InStr(1, mysheet.Name, "FfcCSFrt4", vbTextCompare) > 1 Then
    i_spalte = 5
ElseIf InStr(1, mysheet.Name, "CSFrt5exc", vbTextCompare) > 1 Then
    i_spalte = 6
End If


j = 0
    For i = 0 To UBound(crash_names)

        If UBound(crash_names(i, i_spalte)) > 0 Then
            .Cells(j + 3, 20) = crash_names(i, i_spalte)(0)
            .Cells(j + 3, 21) = crash_names(i, i_spalte)(1)
            .Cells(j + 3, 22) = crash_names(i, i_spalte)(2)
            j = j + 2
            MsgBox crash_names(17, 2)
        Else
            .Cells(j + 3, 20) = crash_names(i, i_spalte)
            .Cells(j + 3, 21) = crash_names(i, i_spalte)
            .Cells(j + 3, 22) = crash_names(i, i_spalte)
             j = j + 2
        End If
    Next i

End With

Next i_sheet
End Function
Bekomme immer eine Fehlermeldung bei der Bestimmung der Dimension.
Oder stelle ich mich dumm an? :)


  

Betrifft: wo wird crash_names gefüllt... von: Tino
Geschrieben am: 23.11.2009 12:31:41

Hallo,
, kann ich nicht sehen?

Mach mal Option Explicit ganz oben in Dein Modul als allererste Zeile, da fehlt bestimmt einiges.

Frage offen.

Gruß Tino


  

Betrifft: AW: wo wird crash_names gefüllt... von: Nepumuk
Geschrieben am: 23.11.2009 13:00:25

Hallo Tino,

auf diese Art kannst du so ein Array erstellen:

Public Sub Test()
    Dim Beispiel As Variant
    Beispiel = Array(Array(1, 2, 3), Array(4, 5, 6), Array(7, 8, 9))
End Sub

Gruß
Nepumuk


  

Betrifft: AW: wo wird crash_names gefüllt... von: Tino
Geschrieben am: 23.11.2009 13:38:27

Hallo,
dann müsste es ja so gehen.

Public Sub Test()
Dim i As Integer
Dim Beispiel As Variant

'*************************************************************************************** 
Beispiel = Array(Array(1, 2), Array(4, 5, 6), Array(7, 8, 9, 10, 11))
    
For i = Lbound(Beispiel) To Ubound(Beispiel)
    Debug.Print Ubound(Beispiel(i), 1)
Next i

'oder ********************************************************************************** 
Beispiel = Array(Range("A1:B10").Value2, Range("Z1:AB10").Value2, Range("G1:Y10").Value2)
For i = Lbound(Beispiel) To Ubound(Beispiel)
    Debug.Print Ubound(Beispiel(i), 1), Ubound(Beispiel(i), 2)
Next i
End Sub
Gruß Tino


  

Betrifft: AW: Frage zu Ubound von: Nepumuk
Geschrieben am: 23.11.2009 12:57:55

Hallo,

das geht nicht. An so einem Array (Array in Array) hab ich mir eine Woche lang erfolglos die Zähne ausgebissen. Wenn das fest programmiert ist, dann weißt du ja, wie viele Dimensionen das Unterarray hat. Wenn es dynamisch ist, da zähl die Anzahl der Einträge vor den Erstellen das Arrays.

Ich würde das auch nicht benutzen. Das bringt keinen Vorteil und ist schwierig handzuhaben. Versuch das ganze mit einem benutzerdefinierten Datentyp oder über eine geschachtelte Klasse.

Gruß
Nepumuk


  

Betrifft: AW: Frage zu Ubound von: Philipp
Geschrieben am: 23.11.2009 15:20:43

Hallo,

hab die Lösung.

Einfach die Bereiche die eindimesional sein sollen mit array deklarieren. Dann funktioniert auch wieder die UBound Funktion und man kan die Abfrage wie gewünscht durchführen.

Danke an Alle

Philipp