Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

ReDim Preserve 2-dimensionaler Array

Forumthread: ReDim Preserve 2-dimensionaler Array

ReDim Preserve 2-dimensionaler Array
12.12.2016 11:11:01
Anton
Guten Morgen Zusammen,
ich versuche eine Textdatei Zeilenweise in einen Array einlesen und habe dafür folgenden Code:
Sub TXTEinlesen()
Dim arr() As String
Dim arr2() As Variant
Dim File As String
Dim z As Long
Dim row As Long
Dim I As Long
File = "C:\Users\Anton\Desktop\109950.txt"
Open File For Input As #1
I = 0
row = 0
z = 0
ReDim arr2(row, z)
Do Until EOF(1)
ReDim Preserve arr(I)
Line Input #1, arr(I)
arr = Split(Application.WorksheetFunction.Trim(arr(I)), " ")
I = I + 1
For z = LBound(arr) To UBound(arr)
arr2 = ReDimPreserve(arr2(), row, z)
arr2(row, z) = arr(z)
Next z
row = row + 1
Loop
Close #1
End Sub

'redim preserve both dimensions for a multidimension array *ONLY
Public Function ReDimPreserve(aArrayToPreserve As Variant, nNewFirstUBound As Long,  _
nNewLastUBound As Long) As Variant
Dim nFirst As Long
Dim nLast As Long
Dim nOldFirstUBound As Long
Dim nOldLastUBound As Long
ReDimPreserve = False
'check if its in array first
If IsArray(aArrayToPreserve) Then
'create new array
ReDim aPreservedArray(nNewFirstUBound, nNewLastUBound)
'get old lBound/uBound
nOldFirstUBound = UBound(aArrayToPreserve, 1)
nOldLastUBound = UBound(aArrayToPreserve, 2)
'loop through first
For nFirst = LBound(aArrayToPreserve, 1) To nNewFirstUBound
For nLast = LBound(aArrayToPreserve, 2) To nNewLastUBound
'if its in range, then append to new array the same way
If nOldFirstUBound >= nFirst And nOldLastUBound >= nLast Then
aPreservedArray(nFirst, nLast) = aArrayToPreserve(nFirst, nLast)
End If
Next
Next
'return the array redimmed
If IsArray(aPreservedArray) Then ReDimPreserve = aPreservedArray
End If
End Function
Die Funktion habe nach etwas Recherche bei Stackoverflow http://stackoverflow.com/questions/16369217/redim-preserve-to-a-multi-dimensional-array-in-visual-basic-6 gefunden
Sobald ein Zeilenwechsel stattfindet, werden die vorherigen Einträge überschrieben bzw. gelöscht. Ich habe viel Zeit damit verbracht, dass ganze zu verstehen. Leider komme ich nicht drauf. Kann mir von euch vielleicht wer einen Tipp geben?
Hier die Textfile: https://www.herber.de/bbs/user/109990.txt
Vielen Dank schon mal.
LG Anton
Anzeige

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
ohne ReDim Preserve
12.12.2016 12:55:02
Rudi
Hallo,
Sub TXTEinlesen()
Dim arr() As String
Dim arr2() As Variant
Dim File As String
Dim z As Long
Dim row As Long
Dim vTmp, sTmp As String, iMax As Integer
File = "C:\Users\Anton\Desktop\109950.txt"
Open File For Input As #1
Do While Not EOF(1)
Line Input #1, sTmp
vTmp = vTmp & vbCrLf & sTmp
iMax = WorksheetFunction.Max(iMax, UBound(Split(sTmp)))
Loop
Close #1
vTmp = Mid(vTmp, 2)
vTmp = Split(vTmp, vbCrLf)
ReDim arr(UBound(vTmp), iMax)
For row = LBound(vTmp) To UBound(vTmp)
arr2 = Split(vTmp(I))
For z = LBound(arr2) To UBound(arr2)
arr(row, z) = arr2(z)
Next
Next
End Sub
Gruß
Rudi
Anzeige
AW: ReDim Preserve 2-dimensionaler Array
12.12.2016 12:55:37
Zwenn
Hallo Anton,
Du solltest ReDimPreserve vermeiden und ausschließlich ReDim verwenden. ReDimPreserve ist langsam und benötigt relativ viele Recourcen, weil es den gesamten Array Inhalt zwischenspeichern muss, ein neues Array erstellt, die gesicherten Werte in das neue Array übernimmt und das Backup Array löscht. ReDim kickt einfach das alte Array und erstellt ein neues leeres mit gleichem Namen.
Um nur mit ReDim auszukommen, musst Du also vor der echten Dimensionierung feststellen, wieviele Zeilen und Spalten Dein Array haben muss, in dass Du Deinen Text aufnehmen willst. Ich verlinke Dir mal einen älteren Beitrag von mir, in dem die beiden Funktionen GetNumberOfRowsInCsvFile und GetNumberOfColumnsInCsvFile in der verlinkten Excel Datei enthalten sind.
Vielleicht kannst Du damit etwas anfangen.
https://www.herber.de/cgi-bin/callthread.pl?index=1493668#1493717
Viele Grüße,
Zwenn
Anzeige
AW: ReDim Preserve 2-dimensionaler Array
12.12.2016 13:03:53
Anton
@Rudi: Danke für Deinen Vorschlag. Werde ich heute Abend gleich mal ausprobieren!
@Zwenn: Danke für die ausführliche Erklärung. Jetzt weiß ich schon mal das Redim Preserve mit Vorsicht zu genießen ist. Dein Beispiel schaue ich mir ebenso heute Abend im Detail an.
Schöne Grüße,
Anton
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige

Infobox / Tutorial

ReDim Preserve für 2-dimensionale Arrays in VBA


Schritt-für-Schritt-Anleitung

Um ein 2-dimensionales Array in VBA mithilfe von ReDim Preserve zu verwenden, kannst du die folgende Schritt-für-Schritt-Anleitung befolgen:

  1. Deklariere die Arrays: Beginne mit der Deklaration deines Arrays. In diesem Beispiel verwenden wir arr2() als 2-dimensionales Array:

    Dim arr() As String
    Dim arr2() As Variant
  2. Öffne die Datei: Verwende Open, um die Textdatei zeilenweise einzulesen.

    File = "C:\Users\Anton\Desktop\109950.txt"
    Open File For Input As #1
  3. Lese die Daten: Erstelle eine Schleife, um die Datei zu lesen und die Daten in das Array zu speichern.

    Do Until EOF(1)
       Line Input #1, sTmp
       arr = Split(sTmp, " ")
       ' Hier kommt die ReDim Preserve Logik
    Loop
  4. Verwende ReDim Preserve: Wenn du einen neuen Wert hinzufügst, verwende ReDim Preserve, um die vorherigen Werte zu erhalten.

    ReDim Preserve arr2(row, z)
  5. Schließe die Datei: Vergiss nicht, die Datei nach dem Lesen zu schließen.

    Close #1

Häufige Fehler und Lösungen

  • Problem: Daten werden überschrieben.

    • Lösung: Stelle sicher, dass du ReDim Preserve korrekt anwendest. Wenn du das Array nicht richtig dimensionierst, können vorherige Daten verloren gehen.
  • Problem: Laufzeitfehler bei Ubound.

    • Lösung: Überprüfe, ob das Array überhaupt Werte enthält, bevor du UBound verwendest. Ein leerer Array kann zu einem Fehler führen.

Alternative Methoden

Eine Alternative zu ReDim Preserve ist die Verwendung von ReDim in Kombination mit der Bestimmung der endgültigen Größe des Arrays. Dies kann die Leistung verbessern, da ReDim Preserve langsam sein kann, da es die Inhalte in ein neues Array kopieren muss.

Hier ein Beispiel, das die Größe im Voraus festlegt:

Dim totalRows As Long
Dim totalCols As Long
' Bestimme die Anzahl der Zeilen und Spalten
ReDim arr(totalRows, totalCols)

Praktische Beispiele

Ein praktisches Beispiel für das Einlesen einer Textdatei in ein 2-dimensionales Array könnte wie folgt aussehen:

Sub TXTEinlesen()
   Dim arr() As String
   Dim arr2() As Variant
   Dim File As String
   Dim z As Long, row As Long
   File = "C:\Users\Anton\Desktop\109950.txt"
   Open File For Input As #1
   row = 0

   Do Until EOF(1)
       Line Input #1, sTmp
       arr = Split(sTmp, " ")
       ReDim Preserve arr2(row, UBound(arr))
       For z = LBound(arr) To UBound(arr)
           arr2(row, z) = arr(z)
       Next z
       row = row + 1
   Loop
   Close #1
End Sub

Tipps für Profis

  • Vermeide ReDim Preserve wo möglich: Wenn du die Größe deines Arrays im Voraus kennst, ist es effizienter, ReDim zu verwenden.
  • Nutze UBound und LBound: Diese Funktionen sind nützlich, um die Grenzen eines Arrays zu bestimmen, um Fehler zu vermeiden.
  • Debugging: Verwende Debug.Print oder das Überwachungsfenster, um die Werte deines Arrays zu überprüfen, während du den Code schreibst.

FAQ: Häufige Fragen

1. Was ist der Unterschied zwischen ReDim und ReDim Preserve? ReDim löscht alle vorherigen Werte im Array, während ReDim Preserve die bisherigen Werte beibehält, was es langsamer macht.

2. Wie kann ich ein Array in VBA dimensionieren? Du kannst ein Array in VBA mit Dim arr() As Type deklarieren und dann mit ReDim die Größe festlegen.

3. Können Arrays mehrdimensional sein? Ja, in VBA kannst du sowohl eindimensionale als auch mehrdimensionale Arrays erstellen, z.B. 2D-Arrays mit Dim arr(,) As Variant.

Diese Anleitung hilft dir dabei, ReDim Preserve effektiv in deinen VBA-Projekten zu nutzen.

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