Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: ReDim Problem mit UBound in zweidim. Array

ReDim Problem mit UBound in zweidim. Array
27.11.2008 21:50:41
Andreas
Hallo Herber Fans,
durch die Unterstützung hier im Forum habe ich einiges über die Re- Dimensionierung von Arrays gelernt und damit noch experimentiert. Nun wollte ich ein zweidimensionales Array über ReDim Preserve und UBound(myArr) + 1 in seiner Spaltenanzahl neu dimensionieren. Aber ich bekomme es einfach nicht hin. Der Debugger gibt immer aus, daß der Index außerhalb des gültigen Bereiches liegt. Ich finde den Fehler nicht. Ich weiß nicht, ob es daran liegt, aber ich habe es auch nicht hinbekommen, daß im UBound Befehl die Aussengrenze der Spalten genommen wird. Die Zeilen sind 1 to 2 dimensioniert. Für die ReDim Betrachtung soll aber die Anzahl der Spalten die Referenz sein. Wie kann ich UBound selektiv nur für Spalten ermitteln? Und warum läuft dieser Code nicht. Wo ist der Logik Fehler?
https://www.herber.de/bbs/user/57188.xls
Ich würde mich über weitere Anhaltspunkte aus dem Forum sehr freuen.
Vielen Dank und Grüße, Andreas Hanisch
Anzeige

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: ReDim Problem mit UBound in zweidim. Array
27.11.2008 22:32:50
Tino
Hallo,
Spalte
Ubound(area,2)
Zeile
Ubound(area,1)
Gruß Tino
AW: ReDim Problem mit UBound in zweidim. Array
27.11.2008 22:41:00
Andreas
Hallo Tino,
danke für die Syntax.
Aber ich bekomme die Re Dimensionierung im Code immer noch nicht korrekt hin. Es müßte eigentlich laufen. Kannst Du den Fehler erkennen?
Dank und Gruß, Andreas

Sub SubTotalsAuslesen_Array_2()
Dim pvTable As PivotTable
Dim iCounter As Long
Dim SubTotalElement As Variant
Dim SubTotalArr()
Set pvTable = ActiveSheet.PivotTables(1)
ReDim SubTotalArr(1 To 2, 0 To 0)                 'muß ich ein Array Initial dimensionieren?
For Each pvField In pvTable.RowFields
iCounter = 0
For Each SubTotalElement In pvField.Subtotals
iCounter = iCounter + 1
If SubTotalElement = True Then
ReDim Preserve SubTotalArr(1 To 2, 1 To (UBound(SubTotalArr, 2) + 1))    'hier  _
kommt der Debugger
SubTotalArr(1, UBound(SubTotalArr)) = pvField.Caption
End If
Next
Next
Debug.Print "final ubound:"; UBound(SubTotalArr, 2)
For i = 1 To UBound(SubTotalArr, 2)   'auch hier soll nur auf die Ubound Spalte des Arrays  _
referenziert werden, wenn nur einmal SubTotals ausgelesen wurden.
Debug.Print i; "Field:"; SubTotalArr(1, i), "SubT:"; SubTotalArr(2, i)
Next i
End Sub


Anzeige
AW: ReDim Problem mit UBound in zweidim. Array
27.11.2008 22:53:06
Daniel
HI
es kann mit "ReDim Preserve" nur die obere Grenze verändern, nicht aber die untere.
die muss schon bei der erstdimensionierung passen.
Gruß, Daniel
AW: ReDim Problem mit UBound in zweidim. Array
27.11.2008 23:00:28
Tino
Hallo,
versuche es mal ohne
1 To
PS: schreibe vom Pocket
Gruß Tino
AW: ReDim Problem mit UBound in zweidim. Array
27.11.2008 22:36:51
Daniel
Hi
erster Fehler, du arbeitset nicht mit Option Explict.
das alleine ist eigentlich schon ein Grund, sich das Marko gar nicht erst anzuschauen.
nichtdestotrotz, folgende Zinken sind drin:
1. du versuchst mit UBound die grösse des Arrays abzufragen, dabei sind für das Array noch gar keine Dimensionen festgelegt (die erste ReDim - Anweisung ist auskommentiert), das kann also nicht funktionieren.
2. wenn du mit "1 to x" redimensioneren willst, muss auch die erstdimensonierung mit "1 to y" erfolgen.
3. kannst du mit ReDim-Preserve immer nur die 2. Dimension erweitern (Spalten), nich aber die erste, dh. die muss schon bei der erstdimensonierung passend angelegt werden.
4. mit Ubound(arr) fragst du immer die akutelle Zeilenzah (1, Dimension)l des Arrays ab. um die aktuelle Spaltenzahl (2. Dimension) zu ermitteln, musst du Ubound(arr, 2) verwenden
Gruß, Daniel
Anzeige
AW: ReDim Problem mit UBound in zweidim. Array
27.11.2008 22:57:00
Andreas
Hallo Daniel,
vielen Dank. Jetzt hat es geklingelt... Entschuldige bitte die Nicht Verwendung von Option Explicit. Das ist in dem Beispiel passiert, ansonsten weiß ich diese Option schon zu schätzen. Das mit der ersten auskommentieren ReDim Anweisung geht klar. Die muß drin sein.
Das die Erst- und Rediomensionierung übereinstimmen müssen, war mein Fehler. Nun läuft es.
Eine kleine Frage noch:
Die Erstdimensionierung erfolgt mit ReDim myArr(1 to 2, 1 to 1). In der anschließend folgenden Redimensionierung schreibe ich bisher ReDim Preserve myArr(1 to 2, 1 to n). Also nur die Spalten werden neu dimensioniert, geht ja auch nicht anders. Muß ich die Zeilendimension (1 to 2) auch in der Redimensionierung immer wieder hinschreiben oder kann ich das überspringen/ weglassen. a la: ReDim Preserve myArr(, 1 to n). Einfaches weglassen führte zum Debugger. Gibt es eine spezielle Syntax, falls es geht?
Rein interesse- und verständnishalber.
Dir vielen Dank für den entscheidenden Hinweis. Habe noch einen schönen Abend!
Grüße, Andreas
Anzeige
AW: ReDim Problem mit UBound in zweidim. Array
28.11.2008 09:08:00
Andreas
Hallo Daniel,
vielen Dank. Jetzt hat es geklingelt... Entschuldige bitte die Nicht Verwendung von Option Explicit. Das ist in dem Beispiel passiert, ansonsten weiß ich diese Option schon zu schätzen. Das mit der ersten auskommentieren ReDim Anweisung geht klar. Die muß drin sein.
Das die Erst- und Rediomensionierung übereinstimmen müssen, war mein Fehler. Nun läuft es.
Eine kleine Frage noch:
Die Erstdimensionierung erfolgt mit ReDim myArr(1 to 2, 1 to 1). In der anschließend folgenden Redimensionierung schreibe ich bisher ReDim Preserve myArr(1 to 2, 1 to n). Also nur die Spalten werden neu dimensioniert, geht ja auch nicht anders. Muß ich die Zeilendimension (1 to 2) auch in der Redimensionierung immer wieder hinschreiben oder kann ich das überspringen/ weglassen. a la: ReDim Preserve myArr(, 1 to n). Einfaches weglassen führte zum Debugger. Gibt es eine spezielle Syntax, falls es geht?
Rein interesse- und verständnishalber.
Dir vielen Dank für den entscheidenden Hinweis. Habe noch einen schönen Abend!
Grüße, Andreas
Anzeige
AW: ReDim Problem mit UBound in zweidim. Array
28.11.2008 12:01:00
Tino
Hallo,
hier mal ein bar Beispiele wie es funktioniert.
Die erste Zeile bzw. Spalte hat hier immer den Indes 0, daher 0 heißt eigentlich 1 Zeile oder Spalte.
Sub test1()
Dim meArea()

'Area Dimensionieren, sechs Zeilen u. eine Spalte 
'Area 1. Zeile bzw Spalte hat den Index ist 0 ;-) 
Redim meArea(5, 0)
Debug.Print Ubound(meArea, 1), Ubound(meArea, 2)

'Area neu Dimensionieren mit sechs Spalten 
Redim Preserve meArea(5, 5)
Debug.Print Ubound(meArea, 1), Ubound(meArea, 2)

'oder 
Redim Preserve meArea(Ubound(meArea, 1), 5)
Debug.Print Ubound(meArea, 1), Ubound(meArea, 2)

'oder 
Redim Preserve meArea(5, Ubound(meArea, 2) + 5)
Debug.Print Ubound(meArea, 1), Ubound(meArea, 2)
End Sub


Gruß Tino

Anzeige
AW: ReDim Problem mit UBound in zweidim. Array
01.12.2008 10:13:00
Andreas
Hi Tino,
vielen Dank. Werde mir die Beispiele merken und mit dem Wissen nun vermutlich mehr die Möglichkeiten von Arrays ausschöpfen können.
Grüße, Andreas
AW: ReDim Problem mit UBound in zweidim. Array
28.11.2008 12:08:00
Rudi
Hallo,
das geht nicht. Die Mühe musst du dir schon machen.
Gruß
Rudi
AW: ReDim Problem mit UBound in zweidim. Array
01.12.2008 10:09:00
Andreas
Hi Rudi,
vielen Dank für die Antwort. Nach Abschluß dieses Threads und Themas bin ich in Sachen Array viel fitter als zuvor!
Grüße, Andreas
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

ReDim und UBound in zweidimensionalen Arrays


Schritt-für-Schritt-Anleitung

Um ein zweidimensionales Array in VBA mit ReDim Preserve und UBound korrekt zu dimensionieren, befolge diese Schritte:

  1. Array deklarieren: Deklariere dein Array, ohne es sofort zu dimensionieren.

    Dim myArr() As Variant
  2. Erstdimensionierung: Dimensioniere das Array initial mit ReDim.

    ReDim myArr(1 To 2, 1 To 1)
  3. Redimensionierung: Verwende ReDim Preserve, um nur die zweite Dimension (die Spalten) zu verändern.

    ReDim Preserve myArr(1 To 2, 1 To UBound(myArr, 2) + 1)
  4. UBound verwenden: Um die obere Grenze eines Arrays zu ermitteln, benutze UBound(arr, 1) für die Zeilen und UBound(arr, 2) für die Spalten.

  5. Fehlerbehandlung: Stelle sicher, dass das Array vor der Verwendung von UBound dimensioniert ist, da sonst ein "Index außerhalb des gültigen Bereichs" Fehler auftreten kann.


Häufige Fehler und Lösungen

  • Fehler beim Zugriff auf UBound: Wenn du versuchst, UBound auf ein nicht dimensioniertes Array anzuwenden, erhältst du einen Fehler. Stelle sicher, dass du das Array vor der Verwendung dimensionierst.

  • Falscher ReDim Preserve Gebrauch: Denke daran, dass bei ReDim Preserve nur die obere Grenze (2. Dimension) geändert werden kann. Die untere Grenze (1. Dimension) muss beim ersten ReDim festgelegt werden.

  • Option Explicit: Achte darauf, die Option Option Explicit zu verwenden. Dies zwingt dich, alle Variablen zu deklarieren und kann viele Fehler vermeiden.


Alternative Methoden

Wenn du mit ReDim Preserve und UBound nicht weiterkommst, gibt es alternative Ansätze:

  • Array-Liste: Verwende ein Collection-Objekt oder ein Dictionary, wenn die Anzahl der Elemente dynamisch ist. Diese Objekte benötigen keine Dimensionierung.

  • Multidimensionale Arrays: Wenn du mit mehreren Dimensionen arbeitest, stelle sicher, dass du die Syntax korrekt anwendest:

    ReDim Preserve myArr(1 To 2, 0 To UBound(myArr, 2) + 1)

Praktische Beispiele

Hier sind einige praktische Beispiele zur Verwendung von ReDim und UBound in Excel VBA:

  1. Ein einfaches Beispiel:

    Sub Beispiel()
       Dim myArr() As Integer
       ReDim myArr(1 To 2, 0 To 0)
       ReDim Preserve myArr(1 To 2, 1 To 5)  ' Erweiterung der Spalten
       Debug.Print UBound(myArr, 1)  ' Gibt 2 zurück (Zeilen)
       Debug.Print UBound(myArr, 2)  ' Gibt 5 zurück (Spalten)
    End Sub
  2. Ein komplexeres Beispiel:

    Sub KomplexesBeispiel()
       Dim myArr() As Variant
       ReDim myArr(1 To 3, 1 To 1)  ' Initiale Dimensionierung
       Dim i As Integer
       For i = 1 To 5
           ReDim Preserve myArr(1 To 3, 1 To i)  ' Dynamische Erweiterung
           myArr(1, i) = "Element " & i
       Next i
       Debug.Print myArr(1, 1), myArr(1, 2), myArr(1, 3)
    End Sub

Tipps für Profis

  • Verwende Option Explicit: Dies hilft, Tippfehler bei Variablennamen zu vermeiden und verbessert die Lesbarkeit deines Codes.

  • Kombiniere Arrays mit anderen Datenstrukturen: Nutze Arrays zusammen mit Collections oder Dictionaries, um die Flexibilität zu erhöhen.

  • Überlege dir, ob du wirklich ReDim Preserve benötigst: Wenn du nur die Größe des Arrays ändern möchtest, kann es effizienter sein, ein neues Array zu erstellen und die Werte zu kopieren.


FAQ: Häufige Fragen

1. Muss ich die Zeilendimension bei jeder Redimensionierung angeben? Ja, bei der Verwendung von ReDim Preserve musst du die Zeilendimension angeben. Es gibt keine Möglichkeit, diese beim Redimensionieren zu überspringen.

2. Ist es möglich, ReDim Preserve für mehrdimensionale Arrays zu verwenden? Ja, du kannst ReDim Preserve für mehrdimensionale Arrays verwenden, aber du kannst nur die obere Grenze (2. Dimension) anpassen. Die untere Grenze bleibt unverändert.

3. Was passiert, wenn ich versuche, UBound auf ein nicht dimensioniertes Array anzuwenden? Du erhältst einen Laufzeitfehler, da das Array nicht existiert. Stelle sicher, dass das Array vor der Verwendung von UBound dimensioniert ist.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige