Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1116to1120
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Frage zu Ubound

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

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Frage zu Ubound
23.11.2009 11:23:32
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
Anzeige
AW: Frage zu Ubound
23.11.2009 11:39:32
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?
23.11.2009 12:07:14
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
Anzeige
Deine MsgBox wird nicht erscheinen,...
23.11.2009 17:03:20
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.
23.11.2009 17:37:27
Tino
Hallo,
man könnte auch die Anzahl der Dimensionen mit API (CopyMemory) bestimmen.
Gruß Tino
AW: Frage zu Ubound
23.11.2009 13:35:03
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

Anzeige
AW: Frage zu Ubound
23.11.2009 11:39:18
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
Anzeige
AW: Frage zu Ubound
23.11.2009 11:53:47
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? :)
Anzeige
wo wird crash_names gefüllt...
23.11.2009 12:31:41
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...
23.11.2009 13:00:25
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
Anzeige
AW: wo wird crash_names gefüllt...
23.11.2009 13:38:27
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
Anzeige
AW: Frage zu Ubound
23.11.2009 12:57:55
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
23.11.2009 15:20:43
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
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige