Anzeige
Archiv - Navigation
1528to1532
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

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

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

51 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige