Anzeige
Archiv - Navigation
700to704
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
700to704
700to704
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Textimport Code-Optimierung ?

Textimport Code-Optimierung ?
02.12.2005 14:08:55
Thias
Mahlzeit!
Ich habe hier einen VBA-Code für ein Macro, dass mir aus einer .txt Datei die Rohdaten einliest. Die Rohdaten haben den Aufbau Spalte1;Spalte1 -Tab- Spalte3;Spalte4 -Tab- usw.
Insgesamt sind es nach dem importieren dann 36 Spalten mit einer Anzahl zwischen 1000 und 4000 Zeilenwerten.
Das Macro funktioniert auch einwandfrei, nur ist die Abarbeitungszeit mit gut 5 Minuten deutlich langsamer als die Excel Import-Funktion (Menü Daten -> Externe Daten importieren -> Daten impportieren). Dort dauert es nichtmal eine Minute.
Hat der unten angegebene VBA Code noch optimierungsbedarf, oder ist es mittels VBA schlicht nicht möglich, die Daten schneller zu importieren. Man kann zwischenzeitlich zwar immer nett zum Klo gehen, nur muss ich leider nicht so oft, wie ich dieses Macro gerne nutzen würde.
Vielleicht kann mir ja einer der anwesenden Experten den Code optimieren, wenn möglich.
Gruß Thias
------------------------------------------------------------------------------

Sub TextImport()
Dim iRow As Integer, iCol As Integer                'Variablendeklaration
Dim sFile As String, sText As String                '--------dito--------
ChDir "Y:\Eigene Dateien\Z4A 20kN Zugkraft"   'Pfadangabe für die zu öffnende Datei
sFile = Range("B1").Value       'Zelle, in der der Name der Rohdaten.txt steht
If Dir(sFile) = "" Then
Beep
MsgBox "Datei wurde nicht gefunden!", , "Warnung!"
Exit Sub
End If
iRow = 11   'Reihe
iCol = 2    'Spalte
Close
Open sFile For Input As #1
Do Until EOF(1)
Line Input #1, sText
sText = Replace(sText, Chr(9), ";", 1, -1)
Do While InStr(sText, ";")
Cells(iRow, iCol).Value = Left(sText, InStr(sText, ";") - 1)
sText = Right(sText, Len(sText) - InStr(sText, ";"))
iCol = iCol + 1
Loop
Cells(iRow, iCol).Value = sText
iRow = iRow + 1
iCol = 2
Loop
Close
MsgBox "import complete!", vbInformation, "Hinweis!"
End Sub

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

Betreff
Datum
Anwender
Anzeige
AW: Textimport Code-Optimierung ?
02.12.2005 15:05:53
Matthias
Hallo Thias,
schau dir mal die Split()-Funktion an. Damit kann man sehr schön Zeichenketten mit Trennzeichen in Arrays schreiben.
So im Groben:

Dim Feld
Line Input #1, sText
Feld = Split(sText, ";")
For i=0 to UBound(Feld)
Debug.Print Feld(i)
Next i

Gruß Matthias
AW: Textimport Code-Optimierung ?
02.12.2005 15:14:14
Heiko
Hallo Thias,
wenn es wirklich 36 Spalten also von B bis AK sind, dann z.B. so.

Sub TextImportHS()
Dim iRow As Integer                     'Variablendeklaration
Dim sFile As String, sText As String    '--------dito--------
ChDir "H:\EXCEL\EXCEL Privat\Beispiele\Dat_Test_Dateien"
sFile = "Spalte.txt"
If Dir(sFile) = "" Then
Beep
MsgBox "Datei wurde nicht gefunden!", , "Warnung!"
Exit Sub
End If
iRow = 11   'Reihe
Application.ScreenUpdating = False
Open sFile For Input As #1
Do Until EOF(1)
Line Input #1, sText
' Wenn es keine 36 Spalten sind, dann das AK entsprechend anpassen.
Range("B" & iRow & ":AK" & iRow) = Split(Replace(sText, Chr(9), ";", 1), ";")
iRow = iRow + 1
Loop
Close
Application.ScreenUpdating = True
MsgBox "import complete!", vbInformation, "Hinweis!"
End Sub

Gruß Heiko
PS: Rückmeldung wäre nett !
Anzeige
AW: Textimport Code-Optimierung ?
02.12.2005 16:06:30
Thias
Hallo Heiko,
Deine Änderung ist tatsächlich super schnell! Komischerweise werden jedoch immer 2 Spalten als Text importiert (so wie es sein soll), dann zwei Spalten als Zahl (das hätte ich weniger gern), dann wieder 2 Spalten als Text, usw - bis zu den Spalten AJ und AK, in denen wieder Zahlen stehen. Allerdings kann ich aus dem Quelltext nicht abstrahieren, warum das so ist.
Kannst Du den entsprechenden Teil evtl. ausfindig machen und eliminieren, so dass alle Spalten als Text importiert werden? Oder ist es evtl. möglich, dass die Zahlen nicht mit dem berühmt-berüchtigten Punkt importiert werden, sondern gleich mit Komma? Denn zumindest das hat in meinem Makro funktioniert (wenn auch unerträglich langsam! *g*).
Wenn alles als Text importiert wird (mit dem Punkt), kann ich mir zur Not noch mit dem Macro-Rekorder ein "Suche den . und ersetze durch ,"-Makro zusammenbasteln.
Gruß Thias
Anzeige
AW: Textimport Code-Optimierung ?
02.12.2005 17:26:33
Heiko
Hallo Thias,
was hältst du denn von einem weiteren Replace.
also diese Zeile
Range("B" & iRow & ":AK" & iRow) = Split(Replace(sText, Chr(9), ";", 1), ";")
so ändern.
Range("B" & iRow & ":AK" & iRow) = Split(Replace(Replace(sText, Chr(9), ";", 1), ";"), ".", ",")
Wenn das nicht hilft, dann muss du mal einen Ausschnitt aus der Textdatei hochladen, damit ich mir die Daten mal anschauen kann.
Komme aber vor Montag Morgen, wohl nicht dazu.
Gruß Heiko
PS: Rückmeldung wäre nett
AW: Textimport Code-Optimierung ?
05.12.2005 07:59:44
Thias
Moin Heiko,
wenn ich die Zeile ersetze, dann kommt beim kompilieren die Fehlermeldung: "Argument ist nicht optional".
Ein .txt-File, wie ich es nutzen muss, habe ich unter https://www.herber.de/bbs/user/28954.txt hochgeladen, damit Du Dir evtl. ein besseres Bild vom Aufbau der Daten machen kannst.
Gruß Thias
Anzeige
AW: Textimport Code-Optimierung ?
05.12.2005 11:21:45
Heiko
Hallo
also so sieht meine aktuelle Version nun aus:

Sub TextImportHS()
Dim sFile As String, sText As String
Dim arrInput() As String, arrhelp() As String
Dim intI As Integer
ChDir "H:\EXCEL\Muell"
sFile = "Spalte.txt"
If Dir(sFile) = "" Then
Beep
MsgBox "Datei wurde nicht gefunden!", , "Warnung!"
Exit Sub
End If
Application.ScreenUpdating = False
Open sFile For Binary As #1
sText = Space(LOF(1))
Get #1, , sText
arrInput = Split(sText, vbCrLf)
Close #1
For intI = 0 To UBound(arrInput)
arrhelp = Split(Replace(Replace(arrInput(intI), Chr(9), ";"), ".", ","), ";")
Range(Cells(intI + 12, 2), Cells(intI + 12, UBound(arrhelp) + 2)) = arrhelp
Next intI
Cells.NumberFormat = "@"
Application.ScreenUpdating = True
MsgBox "import complete!", vbInformation, "Hinweis!"
End Sub

Da wird dann aus dem "." ein ",". Wobei ich noch nichzt so ganz verstanden habe warum das für dich ein Problem ist, ob Text oder Zahl. Geht es nur um die Darstellung im Tabellenblatt oder willst du die Daten noch weiter verarbeiten.
Übrigens ein mit dem Makrorekorder aufgezeichnetes Progrämmchen, (Daten - Externe Daten importieren ) ist noch schneller als meine Version.
Sieht dann so aus:

Sub Makro1()
With ActiveSheet.QueryTables.Add(Connection:="TEXT;H:\EXCEL\Muell\Spalte.txt" _
, Destination:=Range("B11"))
.Name = "Spalte_2"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 850
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = True
.TextFileSemicolonDelimiter = True
.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, 1, 1, 1, 1)
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With
End Sub

Gruß Heiko
PS: Rückmeldung wäre nett !
Anzeige
AW: Textimport Code-Optimierung ?
05.12.2005 13:26:00
Thias
Hallo Heiko,
so funktioniert das Makro ganz hervoragend! Vielen Dank.
Und ja - ich verwende die Zahlen weiter. Primär möchte ich aber das Komma statt den Punkt haben wegen der übersichtlicheren Darstellung. Was müsste ich denn ändern, damit ich beim Import Zahlen (mit dem Komma) erhalte, statt Text? Einfach die Stringvariable "sText" in eine Integervariable ändern? Wohl kaum, oder?
Hatte mir auch erst überlegt, den Makrorecorder zu nutzen um der Importfunktion auf die Spur zu kommen. Allerdings hat die Rohdaten.txt jedesmal einen anderen Namen! Den müsste ich dann ja auch jedesmal umständlich im Makro ändern. So kann ich den Namen bequem in Zelle B2 eingeben und das Makro ablaufen lassen. Schnell genug ist es so auf jeden Fall.
Wenn Du mir also noch helfen könntest, wie ich statt des Textes gleich alles als Zahl bekomme, dann wäre ich eigentlich rundum zufriedengestellt. ;-)
Gruß Thias
PS: Könntest Du evtl. noch ein paar Zeilenkommentare an das Makro einfügen, damit ich es besser verstehe? Ich kenne leider nur wenige VBA Befehle bis jetzt und versuche immer Parallelen zu JAVA zu finden, um mir es verständlich zu machen. Allerdings mit wenig Erfolg. Wenn Du dazu keine Lust hast, ist das aber natürlich auch kein Problem.
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige