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

Forumthread: ReDim Preserve eines 2D Arrays

ReDim Preserve eines 2D Arrays
18.10.2016 08:54:48
baschti007
Halli Hallo
Ich habe einen Bereich in A1:B10 in A1 befinden sich leere Zellen , dieses Spalte soll somit nicht in das Array so weit so gut .
Nur definiere ich das Array mit ReDim Preserve auf die Anzahl die in das Array gekommen sind nur leider funktioniert das mit dem 2D Array nicht , wenn ich nur 1D Array habe läuft es .
Fehler : Index Außerhalb des gültigen Bereiches
Gruß Basti
Option Explicit
Sub DoIT()
Dim x As Long, c As Long
Dim lngCount As Long
Dim myArray As Variant
Dim tmp()
myArray = Range("A1:B10")
ReDim tmp(1 To UBound(myArray, 1), 1 To UBound(myArray, 2))
For x = LBound(myArray, 1) To UBound(myArray, 1)
If myArray(x, 1)  "" Then
lngCount = lngCount + 1
For c = LBound(myArray, 2) To UBound(myArray, 2)
tmp(lngCount, c) = myArray(x, c)
Next
End If
Next
ReDim Preserve tmp(1 To lngCount, 1 To UBound(myArray, 2))
For x = 1 To UBound(tmp, 1)
For c = 1 To UBound(tmp, 2)
Cells(x, c + 4) = tmp(x, c)
Next
Next
End Sub

Anzeige

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: ReDim Preserve eines 2D Arrays
18.10.2016 09:38:23
EtoPHG
Hallo Baschti,
Ich glaube das ist nicht das erste Mal, dass ich sage: Zuerst mal die XL-VBA Hilfe konsultieren!
Das steht:
Preserve Optional.
Schlüsselwort, das zum Erhalt der Daten in einem bestehenden Datenfeld verwendet wird,
wenn die Größe der letzten Dimension geändert wird. 
heisst im Klartext,ein Preserve kann nicht angewendet werden um kleinere Dimensionen, wie die letzte, zu ändern!
Gruess Hansueli
Anzeige
AW: ReDim Preserve eines 2D Arrays
18.10.2016 10:00:10
Luschi
Hallo Basti,
ein Blick in die Vba-Hilfe (F1-Taste würde Dein Problem sofort beantworten:

Wenn Sie das Preserve-Schlüsselwort verwenden, können Sie lediglich die Größe
der letzten Array-Dimension ändern, die Anzahl der Dimensionen ist nicht veränderbar.
Wenn Ihr Array beispielsweise nur über eine Dimension verfügt, können Sie die Größe
dieser Dimension ändern, da sie die letzte und einzige Dimension ist.
Wenn Ihr Array jedoch zwei oder mehr Dimensionen hat, können Sie nur die Größe
der letzten Dimension ändern und den Inhalt des Arrays dennoch beibehalten.
Das folgende Beispiel zeigt, wie Sie die letzte Dimension vergrößern können,
ohne dabei bestehende Daten im Array zu löschen.

Diese Regel gilt auch in VB6, VB.Net, C# usw.
Gruß von Luschi
aus klein-Paris
PS: Vielleicht denkst Du mal über die Worte meines Vorredners nach - nicht nur immer Hilfe schreien, sondern sich selbst informieren /F1-Taste, Google, Fchbuch u.u.u.
Anzeige
AW: ReDim Preserve eines 2D Arrays
18.10.2016 10:16:50
baschti007
Und dazu nicht immer gleich Hilfe zu Schrein !!
Ich Denke nicht, das ich immer gleich Hilfe schrei und Googlen Tuh ich eh nur wenn man sich damit nun 30 min beschäftigt hat und zu keiner Lösung kommt (Man sieht den Walt vor lauter Bäumen nicht) kann man wohl fragen dafür ist doch solch ein Forum da =D .
Und ich selber versuche ja auch hier zu Helfen soweit wie es mir möglich ist.
Gruß Basti
Anzeige
AW: ReDim Preserve eines 2D Arrays
18.10.2016 10:11:41
baschti007
Danke euch beiden =D
Ihr habt es schon nicht leicht mit mir ;)
Gruß Basti
Lösung = ReDim Preserve eines 2D Arrays
18.10.2016 10:28:52
baschti007
Hier meine Lösung =)

Option Base 1
Sub DoIT()
Dim x As Long, c As Long
Dim lngCount As Long
Dim myArray As Variant
Dim tmp()
myArray = Range("A1:B10")
ReDim tmp(1 To UBound(myArray, 2), 1 To UBound(myArray, 1))
For x = LBound(myArray, 1) To UBound(myArray, 1)
If myArray(x, 1)  "" Then
lngCount = lngCount + 1
For c = LBound(myArray, 2) To UBound(myArray, 2)
tmp(c, lngCount) = myArray(x, c)
Next
End If
Next
ReDim Preserve tmp(1 To UBound(myArray, 2), 1 To lngCount)
For x = 1 To UBound(tmp, 2)
For c = 1 To UBound(tmp, 1)
Cells(x, c + 4) = tmp(c, x)
Next
Next
End Sub

Anzeige
AW: ReDim Preserve eines 2D Arrays
18.10.2016 11:10:30
Daniel
Hi
Wie schon gesagt wurde, nur die letzte Dimension kann mit ReDim Preserve ohne Datenverlust verändert werden.
Wenn die erste Dimension redimmt werden muss, dann kann man bei einem 2D-Array mit Worksheetfunction.Transpose die Dimensionen tauschen.
arr = worksheetfunction.Transpose(arr)
Redim Preserve arr(...)
arr = worksheetfunction.Transpose(arr)
Gruß Daniel
Anzeige
Bei 1dimensionalen Arrays in 1dimensionalen ...
18.10.2016 15:09:11
Luc:-?
Arrays ist das ReDimmen problemlos auf allen Ebenen möglich, Bastian! ;-]
Gruß, Luc :-?
Besser informiert mit …
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

ReDim Preserve eines 2D Arrays in VBA


Schritt-für-Schritt-Anleitung

Um ein 2D Array in VBA mit ReDim Preserve anzupassen, gehe wie folgt vor:

  1. Definiere das Array: Lade die Daten von einem Excel-Bereich in ein Variant-Array.

    Dim myArray As Variant
    myArray = Range("A1:B10")
  2. Erstelle ein temporäres Array: Erstelle ein temporäres Array, um die Werte zu speichern.

    Dim tmp() As Variant
    ReDim tmp(1 To UBound(myArray, 1), 1 To UBound(myArray, 2))
  3. Fülle das temporäre Array: Durchlaufe das Original-Array, filtere die leeren Zellen und speichere die Werte im temporären Array.

    Dim lngCount As Long
    For x = LBound(myArray, 1) To UBound(myArray, 1)
       If myArray(x, 1) <> "" Then
           lngCount = lngCount + 1
           For c = LBound(myArray, 2) To UBound(myArray, 2)
               tmp(lngCount, c) = myArray(x, c)
           Next c
       End If
    Next x
  4. Redimensioniere das Array mit Preserve: Redimensioniere das temporäre Array, um die Anzahl der Zeilen anzupassen.

    ReDim Preserve tmp(1 To lngCount, 1 To UBound(myArray, 2))
  5. Übertrage die Werte zurück nach Excel: Fülle die Zellen in der Excel-Tabelle mit den Werten aus dem temporären Array.

    For x = 1 To UBound(tmp, 1)
       For c = 1 To UBound(tmp, 2)
           Cells(x, c + 4) = tmp(x, c)
       Next c
    Next x

Häufige Fehler und Lösungen

Ein häufiger Fehler beim Arbeiten mit ReDim Preserve ist der Index außerhalb des gültigen Bereichs. Dies geschieht oft, wenn du versuchst, die erste Dimension eines 2D Arrays zu ändern. Beachte, dass du nur die letzte Dimension ändern kannst.

Lösung: Wenn du die erste Dimension anpassen musst, kannst du die Dimensionen mit WorksheetFunction.Transpose tauschen. Hier ein Beispiel:

arr = WorksheetFunction.Transpose(arr)
ReDim Preserve arr(...)
arr = WorksheetFunction.Transpose(arr)

Alternative Methoden

Wenn ReDim Preserve nicht funktioniert, kannst du folgende Alternativen in Betracht ziehen:

  • Kopieren des Arrays: Erstelle ein neues Array mit der gewünschten Größe und kopiere die Daten manuell.
  • Verwende ein Collection-Objekt: Anstelle eines Arrays kannst du auch ein Collection-Objekt verwenden, das dynamisch wächst, ohne die Dimensionen manuell anpassen zu müssen.

Praktische Beispiele

Hier ist ein einfaches Beispiel für das Arbeiten mit einem 2D Array in VBA:

Sub BeispielReDimPreserve()
    Dim myArray As Variant
    Dim i As Long, j As Long
    myArray = Range("A1:B10").Value

    Dim tmp() As Variant
    ReDim tmp(1 To UBound(myArray, 1), 1 To UBound(myArray, 2))

    ' Werte kopieren
    For i = 1 To UBound(myArray, 1)
        For j = 1 To UBound(myArray, 2)
            tmp(i, j) = myArray(i, j)
        Next j
    Next i

    ' Redimensionieren
    ReDim Preserve tmp(1 To UBound(myArray, 1), 1 To 5)

    ' Ausgabe
    Range("D1").Resize(UBound(tmp, 1), UBound(tmp, 2)).Value = tmp
End Sub

Tipps für Profis

  • Verwende die Option Base 1, um sicherzustellen, dass deine Arrays bei 1 beginnen, was die Indizes übersichtlicher macht.
  • Nutze Debug.Print für die Fehlersuche, um die Werte der Variablen während der Ausführung zu überprüfen.
  • Achte darauf, dass du beim Arbeiten mit ReDim Preserve die Datentypen im Array gleich hältst, um Komplikationen zu vermeiden.

FAQ: Häufige Fragen

1. Kann ich mit ReDim Preserve die Anzahl der Dimensionen eines Arrays ändern?
Nein, du kannst nur die Größe der letzten Dimension ändern. Die Anzahl der Dimensionen bleibt gleich.

2. Was passiert, wenn ich versuche, die erste Dimension eines 2D Arrays zu ändern?
Du erhältst eine Fehlermeldung, da ReDim Preserve nicht auf die erste Dimension angewendet werden kann.

3. Wie kann ich leere Zellen aus einem Array entfernen?
Du kannst eine Schleife verwenden, um die Werte in ein temporäres Array zu kopieren und dabei leere Zellen zu ignorieren.

4. Gibt es eine Einschränkung bei der Größe von Arrays in VBA?
Ja, die maximale Arraygröße in VBA ist durch den verfügbaren Speicher des Systems und die 2 GB Grenze für die gesamte VBA-Anwendung begrenzt.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige