HERBERS Excel-Forum - das Archiv
Frage zu Ubound
Philipp

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

AW: Frage zu Ubound
fcs

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
AW: Frage zu Ubound
Philipp

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
meinst Du die drei Dimensionen?
Tino

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
Deine MsgBox wird nicht erscheinen,...
Luc:-?

...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 :-?
war ja nur ein Beispiel.
Tino

Hallo,
man könnte auch die Anzahl der Dimensionen mit API (CopyMemory) bestimmen.
Gruß Tino
AW: Frage zu Ubound
fcs

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

AW: Frage zu Ubound
ChrisL

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
AW: Frage zu Ubound
Philipp

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? :)
wo wird crash_names gefüllt...
Tino

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
AW: wo wird crash_names gefüllt...
Nepumuk

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
AW: wo wird crash_names gefüllt...
Tino

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
AW: Frage zu Ubound
Nepumuk

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
AW: Frage zu Ubound
Philipp

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