Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
744to748
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
744to748
744to748
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Import von Textfile, Performance Problem..read

Import von Textfile, Performance Problem..read
17.03.2006 11:56:14
Textfile,
Hallo Leute,
habe eine kleine prozedur geschrieben die mir Textfiles mit bis zu
100.000 Datensätzen in 32.500 happen einliest.
Das Problem bei der Sache, wenn eine Datei mehr als ca 10.000 Datensätze beinhaltet, geht der Import ewig lang.
Anbei der Code
Case "test"
Sheets("test").Select
Range("A2:IV65536").ClearContents
' Zeilen hat den wert 32.500
Do While (Not EOF(1) And row - 1 Line Input #1, buffer
index = index + 1
If index >= von And row - 1 Cells(row, 1) = Val(Mid(buffer, 1, 4)) '
Cells(row, 2) = Val(Mid(buffer, 5, 4)) '
Call checkfirm(row, 3, Mid(buffer, 9, 4)) '
Cells(row, 4) = Mid(buffer, 13, 6) '
Call checkstr(row, 5, Mid(buffer, 19, 10)) '
Call checkstr(row, 6, Mid(buffer, 29, 18)) '
Cells(row, 7) = Trim(Mid(buffer, 47, 3)) '
Call checknum(row, 8, Mid(buffer, 50, 13)) '
Call checknum(row, 9, Mid(buffer, 63, 13)) '
Call checknum(row, 10, Mid(buffer, 76, 13)) '
Call checknum(row, 11, Mid(buffer, 89, 13)) '
Call checknum(row, 12, Mid(buffer, 102, 13)) '
Call checknum(row, 13, Mid(buffer, 115, 13)) '
Call checknum(row, 14, Mid(buffer, 128, 13)) '
Cells(row, 15) = Trim(Mid(buffer, 141, 13)) '
Cells(row, 16) = Trim(Mid(buffer, 154, 13)) '
Cells(row, 17) = Trim(Mid(buffer, 167, 13)) '
Cells(row, 18) = Trim(Mid(buffer, 180, 13)) '
Cells(row, 19) = Trim(Mid(buffer, 193, 13)) '
Cells(row, 20) = Trim(Mid(buffer, 206, 13)) '
Cells(row, 21) = Trim(Mid(buffer, 219, 13)) '
Cells(row, 22) = Trim(Mid(buffer, 232, 13)) '
Call checknum(row, 23, Mid(buffer, 245, 9)) '
Call checknum(row, 24, Mid(buffer, 254, 9)) '
Call checknum(row, 25, Mid(buffer, 263, 9)) '
Cells(row, 26) = Trim(Mid(buffer, 272, 1)) '
Cells(row, 27) = Mid(buffer, 273, 1) '
Cells(row, 28) = Mid(buffer, 274, 1) '
Call checkstr(row, 29, Mid(buffer, 275, 18)) '
Call checknum(row, 30, Mid(buffer, 293, 9)) '
Cells(row, 31) = Mid(buffer, 302, 3) '
row = row + 1
End If
Loop
Range("A1").Select
Wenn die die mini Subs am Anfang rausnehm in den einzelnen Zeilen, gehts zwar schneller aber nicht wirklich viel.
Kann ich hier optimieren? warum so langsam hier.
Andere Methode besser ?
Dan bin ich auf die Methode mit Query Tables gestoßen.
Der Import geht damit sehr schnell, aber er importiert das ganze File,
was bei FIles mit Datensätze > 65xxx fehler bringt.
Wie kann ich bei unteren Methode EndRow festlegen ?
Bei MSDN in Library habe ich leider nichts passendes gefunden?
With ActiveSheet.QueryTables.Add(Connection:="TEXT;C:\Users\test\My Documents\test.TXT", Destination:=Range("A2"))
.Name = "test"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlOverwriteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 850
.TextFileStartRow = 1
.TextFileEndRow = 200
.TextFileParseType = xlFixedWidth
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = True
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = False
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, _
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
.TextFileFixedColumnWidths = Array(4, 4, 4, 6, 10, 18, 3, 13, 13, 13, 13, 13, 13, 13, 13, _
13, 13, 13, 13, 13, 13, 13, 9, 9, 9, 1, 1, 1, 18, 9, 3)
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Import von Textfile, Performance Problem..read
17.03.2006 12:20:43
Textfile,
Hallo,
ich würde das alles erst mal in ein Array einlesen und dann das komplette Array in die Tabelle schreiben, da das Zelleweise Schreiben in die Tabelle sehr viel Zeit braucht.
Gruß aus’m Pott
Udo

AW: Import von Textfile, Performance Problem..read
17.03.2006 12:21:33
Textfile,
Hallo
Um eine vernünftige Antwort geben zu können, müsste man wissen,
Was ist
1. checkfirm
2. checknum
3. Wie ist der Aufbau des Textfiles
Unter Umständen geht es wesentlich schneller, alle Zeilen in einen String einzulesen und mit "SPLIT" in ein Array zu schreiben und zum Schluss nur noch das Array in die Tabelle zu kopieren.
Aber wie gesagt, ohne Info zu den Fragen nicht möglich etwas zu sagen
Bei einer Prozedur die ich mal geschrieben habe, wird ein Textfile mit 370'000 Datensätzen und 50 Spalten in knapp 45 Sekunden komplett eingelesen.
Gruss Rainer
Anzeige
AW: Import von Textfile, Performance Problem..read
17.03.2006 13:29:41
Textfile,
Hallo,
anbei die beiden Funktion Checknum, checkfirm
Wenn ich die beiden Funktionen weglass beim Importaufruf, geht es zwar schneller aber nur minimal.

Function checknum(row As Long, col As Integer, value As String)
value = Trim(value)
If value = "" Then
Cells(row, col) = ""
Else
Cells(row, col) = Val(Trim(value))
End If
End Function


Function checkfirm(row As Long, col As Integer, value As String)
value = Trim(value)
If IsNumeric(value) Then
Cells(row, col) = Val(value)
Else
Cells(row, col) = Trim(value)
End If
End Function

Zum Aufbau vom Textfile:
jede Zeile hat ne Länge von 305
Trennzeichen gibt es keine, in unregelmäßigen Abständen steht was oder auch nicht, oder auch leerzeichen. Im Endeffekt soll nach einem vorgegeben Muster(siehe oben), der Inhalt in verschiedene Excelspalten eingelesen werden.
Gibt es für die zweite Lösung, die ich angegeben hab, die auch schnell arbeitet, eine Möglichkeit eine Endrow einzugeben? Damit wär mir viel geholfen.
.TextFileEndRow gibt es leider nicht, ist oben im Code auch falsch!
Anzeige
AW: Import von Textfile, Performance Problem..read
17.03.2006 20:34:32
Textfile,
Hallo
Ohne das ganze jetzt komplett zu überprüfen, würde ich sagen, die Prüfungen als solches sind zu komplex
Probiers mal so
Anstelle von z.B.
Call checknum(row, 8, Mid(Buffer, 50, 13)) '
Schreib die gleiche Anweisung so
Cells(row, 8) = Trim(Mid(Buffer, 60, 13)) * 1
Damit sparst du einen Aufruf und zwei Prüfungen, hast aber das gleiche Ergebnis
Gruss Rainer

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige