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

Text-Datei importieren

Text-Datei importieren
05.07.2006 09:11:26
bernd1
Hallo,
die Frage tauchte nun mehrmals auf, habe aber in der Suche noch nichts passendes gefunden.
Ich möchte gerne eine Textdatei importieren.
Die Textdatei hat aber:
1) mehr als 65536 Zeilen
2) Die Daten in einer Zeile sind mit Tabstops und Leerzeichen getrennt.
(Konkret pro Zeile: Daten(1)_Leerzeichen_Daten(2)_Tabstop_Daten(3)_Tabstop_Daten(..)_Tabstop_Daten(n-1)_Tabstop_Daten(
Hier eine Beispielquelldatei: https://www.herber.de/bbs/user/34851.txt
)
Ich habe mir schon folgendes Beispiel
https://www.herber.de/bbs/user/23029.xls
dazu angeguckt, konnte es aber nicht an meine Verhältnisse anpassen.
In allen Excel-Tabellenblättern werden die Zeilen der Textdatei zeilenweise in eine Zelle geschrieben. Im letzten Tabellenblatt, trennt das VBA Modul die Daten, aber nicht nach dem Gewünschten. Mal trennt es bei Punkten , mal zwischen Zahlen.
Zudem fehlen beim Einlesen Daten (bspw.37391 von ingesamt 233998 Zeilen -
das Modul füllt 4 Tabellenblätter vollständig und hört dann auf - ).
Wie kann ich diese Mißstände beseitigen, zumal ich das Makro nicht ganz verstehe.
Für Hilfen wäre ich dankbar.
Gruß
Bernd

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Text-Datei importieren
05.07.2006 14:12:02
Heiko
Hallo Bernd,
hier mal mein bescheidener Versuch zur Lösung deines Problems.
Ausgangspunkt ist eine Leere Exceldatei mit nur EINEM Tabellenblatt drin.
Bei mir dauerte das einlesen von 500000 Zeilen ca 500 Sekunden, also nicht zu früh ungeduldig werden.

Sub LangeTextDatLesenV1()
Dim strPfad As String, strHelp1 As String
Dim arrInput() As String
Dim lngPos As Long, lngFileNum As Long, lngTab As Long
Dim wksSheets As Worksheet
strPfad = Application.GetOpenFilename("Textdateien (*.txt), *.txt")
If strPfad = "" Or UCase(strPfad) = "FALSCH" Or UCase(strPfad) = "FALSE" Then Exit Sub
lngFileNum = FreeFile()
Open strPfad For Binary As #lngFileNum
strHelp1 = Space(LOF(lngFileNum))
Get #lngFileNum, , strHelp1
arrInput = Split(strHelp1, vbCrLf)
Close #lngFileNum
Application.ScreenUpdating = False
lngTab = 1
For lngPos = LBound(arrInput) To UBound(arrInput)
ActiveSheet.Cells(lngTab, 1) = Replace(arrInput(lngPos), " ", vbTab)
lngTab = lngTab + 1
If lngTab > 65536 Then
ActiveWorkbook.Worksheets.Add after:=ActiveWorkbook.Worksheets(ActiveWorkbook.Worksheets.Count)
lngTab = 1
End If
Next lngPos
For Each wksSheets In ActiveWorkbook.Worksheets
wksSheets.Columns("A:A").TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
:=Array(1, 1), TrailingMinusNumbers:=True
wksSheets.Activate
wksSheets.Cells(1, 1).Activate
Next wksSheets
Application.ScreenUpdating = True
End Sub

Gruß Heiko
PS: Rückmeldung wäre nett !
Anzeige
AW: Text-Datei importieren
05.07.2006 15:01:04
fcs
Hallo Bernd
hier das Makro mit Anpassungen, die Testdaten werden bei mir (Excel97) korrekt eingelesen. Ob das auch mit den über 200000 Datenzeilen geht ? Sollte aber eigentlich.
mfg
Franz

Option Explicit
Option Base 1

Sub LargeFileImport()
Dim FileName As String
Dim FileNum As Integer
Dim ResultStr As String
Dim wsSheet As Worksheet
Dim strValues() As String
Dim lngRow As Long
Dim intSheet As Integer
Dim intCounter As Integer
FileName = Application.GetOpenFilename("Textdateien (*.txt), *.txt")
If FileName = "" Then End
FileNum = FreeFile()
Open FileName For Input As #FileNum
Application.ScreenUpdating = False
Workbooks.Add template:=xlWorksheet
lngRow = 1
intSheet = 1
Application.StatusBar = "Blatt " & intSheet & " wird eingelesen"
ReDim strValues(65536, 1)
Do While Seek(FileNum) <= LOF(FileNum)
Line Input #FileNum, ResultStr
If Left(ResultStr, 1) = "=" Then
strValues(lngRow, 1) = "'" & ResultStr
Else
strValues(lngRow, 1) = ResultStr
End If
If lngRow < 65536 Then
lngRow = lngRow + 1
Else
ActiveSheet.Range("A1:A65536") = strValues
ActiveWorkbook.Worksheets.Add after:=Worksheets(Worksheets.Count)
lngRow = 1
intSheet = intSheet + 1
ReDim strValues(65536, 1) 'Feld leeren
Application.StatusBar = "Blatt " & intSheet & " wird eingelesen"
End If
Loop
Close
ActiveSheet.Range("A1:A65536") = strValues
ReDim strValues(1) 'Feld leeren
intSheet = 0
For Each wsSheet In ActiveWorkbook.Worksheets
intSheet = intSheet + 1
Application.StatusBar = "Daten von Blatt " & intSheet & " werden bearbeitet"
With wsSheet
'Text in Spalten, Tab oder Space separiert
.Columns("A:A").TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=True, _
Semicolon:=False, Comma:=False, Space:=True, Other:=False, FieldInfo _
:=Array(1, 1)
.Range("A1").Select
End With
Next wsSheet
Application.ScreenUpdating = True
Application.StatusBar = "Fertig"
Application.StatusBar = False
End Sub


Anzeige
AW: Text-Datei importieren
06.07.2006 07:40:43
bernd1
Hallo Franz,
konnte mir nun dein Makro anschauen.
Leider bekomme ich einen Laufzeitfehler
"1004: Die Objekt-Methode im Range Objekt konnte nicht ausgeührt werden" (oder so ähnlich)
Der Fehler tritt auf bei ".Range("A1").Select" (letze Zeile hier):
For Each wsSheet In ActiveWorkbook.Worksheets
intSheet = intSheet + 1
Application.StatusBar = "Daten von Blatt " & intSheet & " werden bearbeitet"
With wsSheet
'Text in Spalten, Tab oder Space separiert
.Columns("A:A").TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=True, _
Semicolon:=False, Comma:=False, Space:=True, Other:=False, FieldInfo _
:=Array(1, 1)
.Range("A1").Select
Zudem werden nur die Daten im ersten Tabellenblatt koreekt getrennt.
In den nachfolgenden Blätter sind wieder die Daten in einer Zelle.
Dafür werden aber alle Daten eingelesen.
Gruß
Bernd
End With
Anzeige
AW: Text-Datei importieren
05.07.2006 15:35:58
bernd1
Hallo liebe Helfer,
Da ich im Moment keine Zeit habe, komme ich erst wohl am Wochenende oder nächste Woche dazu mir die Hilfen richtig anzuschauen.
Aber dennoch vielen Dank für die Hilfen im vorraus.
Melde mich nochmal, falls es noch Probleme gibt.
Vesuche zudem die Makros zu verstehen.
Gruß
Bernd
Text-Datei importieren verbesserte Version
05.07.2006 15:36:26
Heiko
Hallo Bernd,
hab noch mal ein wenig gebastelt und an der Performance gearbeitet. Nun wird auch automatisch ne neue Datei angelegt in die die Daten importiert werden, also Makro ohne Vorbedingung einfach starten.

Sub LangeTextDatLesenV3()
Dim strPfad As String, strHelp1 As String
Dim arrInput() As String, arrHelp(65535, 0)
Dim lngPos As Long, lngFileNum As Long, lngTab As Long
Dim wksSheets As Worksheet
strPfad = Application.GetOpenFilename("Textdateien (*.txt), *.txt")
If strPfad = "" Or UCase(strPfad) = "FALSCH" Or UCase(strPfad) = "FALSE" Then Exit Sub
Workbooks.Add template:=xlWorksheet
lngFileNum = FreeFile()
Open strPfad For Binary As #lngFileNum
strHelp1 = Space(LOF(lngFileNum))
Get #lngFileNum, , strHelp1
arrInput = Split(strHelp1, vbCrLf)
Close #lngFileNum
Application.ScreenUpdating = False
lngTab = 0
For lngPos = LBound(arrInput) To UBound(arrInput)
arrHelp(lngTab, 0) = arrInput(lngPos)
lngTab = lngTab + 1
If lngTab > 65535 Then
ActiveWorkbook.ActiveSheet.Range("A1:A65536") = arrHelp
ActiveWorkbook.Worksheets.Add after:=ActiveWorkbook.Worksheets(ActiveWorkbook.Worksheets.Count)
lngTab = 0
Erase arrHelp
End If
Next lngPos
ActiveWorkbook.ActiveSheet.Range("A1:A65536") = arrHelp
For Each wksSheets In ActiveWorkbook.Worksheets
wksSheets.Columns("A:A").TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=True, _
Semicolon:=False, Comma:=False, Space:=True, Other:=False, FieldInfo _
:=Array(1, 1), TrailingMinusNumbers:=True
wksSheets.Activate
wksSheets.Cells(1, 1).Activate
Next wksSheets
Application.ScreenUpdating = True
End Sub

Gruß Heiko
PS: Rückmeldung wäre nett !
Anzeige
AW: Text-Datei importieren
05.07.2006 15:39:36
bernd1
Hallo Heiko,
Da ich im Moment keine Zeit habe, komme ich erst wohl am Wochenende oder nächste Woche dazu mir die Hilfe richtig anzuschauen.
Aber dennoch vielen Dank im vorraus.
Melde mich nochmal.
Vesuche zudem das Makro zu verstehen.
Gruß
Bernd
AW: Text-Datei importieren
06.07.2006 07:21:59
bernd1
Hallo Heiko,
konnte mir etwas früher deine Hilfe angucken als gedacht.
Also erstmal werden nun alle Zeilen eingelesen.
Aber nur im ersten Tabellenblatt werden die Daten getrennt. In den anderen Tabellenblättern befindet sich wieder die komplette Zeile aus der Textdatei jeweils in einer Zelle.
Beim ersten Tbellenblatt kommt hinzu, daß zwar die Daten richtig getrennt sind, aber
zwischen den Spalten mal 1, mal 2 oder 3 Spalten leer sind ( ist ja nicht schlimm, einfach löschen).
Zudem bekomme ich ein Laufzeitfehler "1004: Daten zur Analys wurden nicht ausgewählt"
in der "For Each wksSheets In ActiveWorkbook.Worksheets"-Schleife
Postion: Debugger markiert alles und bleibt in letzter Zeile hängen.
"wksSheets.Columns("A:A").TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
:=Array(1, 1), TrailingMinusNumbers:=True
"
Gruß
Bernd
Anzeige
AW: Text-Datei importieren
06.07.2006 07:46:20
Heiko
Moin Bernd,
also bei mir läuft das Problemlos, ohne deine Textdatei zu sehen kann ich da nicht mehr viel helfen.
Mach doch mal eine Textdatei mit Originaldaten fertig die knapp unter 300k groß ist und lad sie hoch, dann schau ich mal.
Gruß Heiko
AW: Text-Datei importieren
06.07.2006 07:58:21
bernd1
Guten Morgen Heiko,
also deine Version 3 funktioniert nun, hatte erst deine erste Version getestet.
Hatte ich vergessen zu erwähnen.
Ein Problem habe ich aber noch: Ich verstehe leider nicht ganz dein Makro, da meine
VBA Kenntnisse noch ein wenig beschränkt sind auf die Standardfunktionen.
Aber dennoch vielen Dank für deine Hilfe.
Ich wünsche einen schönen Tag noch und eine schöne Woche.
Gruß
Bernd
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige