Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1764to1768
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

TXT Import Spalten trennen geht nicht

TXT Import Spalten trennen geht nicht
10.06.2020 15:10:25
Anni
Guten Tag,
Mit diesem Code impotiere ich mehrere txt Dateien die in einem Ordner liegen in Excel.
Mein Problem: Es trennt die Spalten nach fester Breite und nicht wie ich es brauche nach Trennzeichen.
Der Fehler liegt wohl im Fett markierten Teil. Ich möchte nach Comma trennen aber es importiert mir halt immer nach fester Breite egal wie ich den Code dort anpasse.
Gibt es einen Code mit dem ich beim Import auf "ursprünglicher Datentyp" getrennt stellen kann? Wenn ich manuell importiere kann ich das natürlich händisch einstellen.
Sub ImportiereTXTDateien()
Const TXTPFAD = "U:\Txt"
Dim wbTarget As Workbook, wbSource As Workbook, ws As Worksheet, ts As Worksheet, f As _ Object, i As Integer, fso As New FileSystemObject
Set fso = CreateObject("Scripting.Filesystemobject")
Set wbTarget = ActiveWorkbook
Application.DisplayAlerts = False
'Lösche alle Worksheets bevor wir alle neu anlegen
While wbTarget.Worksheets.Count > 1
wbTarget.Worksheets(1).Delete
Wend
wbTarget.Worksheets(1).Name = ("Daten")
wbTarget.Worksheets(1).Range("A:ZZ").Clear
For Each f In fso.GetFolder(TXTPFAD).Files
If LCase(Right(f.Name, 3)) = "txt" Then
Workbooks.OpenText Filename:=f.Path
Set wbSource = ActiveWorkbook
On Error Resume Next
Set ws = wbTarget.Worksheets(f.Name)
If Err 0 Then
Set ws = wbTarget.Worksheets.Add
ws.Name = f.Name
ws.Range("A:ZZ").Clear
End If
wbSource.Worksheets(1).Range("A:A").TextToColumns Destination:=ws.Range("A1"), _ DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Semicolon:=False, Comma:=True, TrailingMinusNumbers:=True, TabDelimiter:=True, SpaceDelimiter:=False, TrailingMinusNumbers:=True, DecimalSeparator:=",", ThousandsSeperator:="."
wbSource.Worksheets(1).Range("A:ZZ").Copy Destination:=ws.Range("A1")
wbSource.Close True
End If
Next
Set fso=Nothing End Sub
kann mir dort jemand weiterhelfen?
Gruß Anni

20
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: nur eine Idee
10.06.2020 15:38:15
Fennek
Hallo,
ohne es an einem Beispiel getestet zu haben:
Versuche das Text-in-Spalten ohne das Dezimal-Zeichen "Komma" und gib zuerst alle Spalten als Text aus. Wenn das gehen sollte, kann man mit Replace alle Punkte in Komma wechseln und dann als Standard formatieren.
"on error resume next" sollte man während des debuggens nicht einsetzen, damit man die Fehler besser erkennt.
Kannst Du eine kleine Txt-Beispieldatei hochladen?
mfg
AW: nur eine Idee
10.06.2020 16:30:10
Anni
Hallo,
Hier eine Beispiel Datei
https://www.herber.de/bbs/user/138195.txt
Es trennt einmal nach dem Datum 2015/01/01 und einmal nach PANLAM1,da dort Leerzeichen sind.
Soll aber nach jedem Komma getrennt werden.
"Versuche das Text-in-Spalten ohne das Dezimal-Zeichen "Komma" und gib zuerst alle Spalten als Text aus."
Tut mir leid ich weiß nicht was genau Sie da jetzt meinen. Meine VBA Kenntnisse sind nicht so groß.
Anzeige
AW: Beispiel-Code
10.06.2020 16:52:55
Fennek
Es gibt 2 Arten von Problemen
- in Zeile 7 wird die Zeit 41:30.036 wegen der 0 nach dem Punkt nicht richtig erkannt
- die Anzahl der Komma unterscheidet sich, wenn ein "a" steht
Der Code öffnet die Datei so gut es geht, bedarf aber noch etwas nacharbeit

Sub Makro2()
Pfad = "c:\temp\"
file = Pfad & "138795.txt"
Workbooks.OpenText Filename:=file, Origin:=65001, StartRow:=1, DataType:=xlDelimited,  _
TextQualifier:= _
xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, Semicolon:=False _
, Comma:=True, Space:=False, Other:=False, FieldInfo:=Array(Array(1, 2), _
Array(2, 1), Array(3, 1), Array(4, 2), Array(5, 1), Array(6, 1), Array(7, 1), Array(8,  _
1), _
Array(9, 1)), TrailingMinusNumbers:=True
End Sub
mfg
----
PS: Hoffentlich fügt die Forensoftware keinen Zeilenumbruch ein
Anzeige
AW: Beispiel-Code
10.06.2020 17:23:14
Anni
Danke das hat soweit geklappt. Nur klappt es nicht wenn ich den Code in meinen bereits bestehenden einbaue. Gibt es noch eine andere Möglichkeit alle Txt Dateien eines Ordners in ein Excel Sheet aneinander gereit einzufügen? Möglicherweise wenn ich
File=Pfad&"*txt" oder ähnlich schreibe?
mfg
AW: Schleife
10.06.2020 17:33:09
Fennek
Im ursprünglichen Code gab es die Schleife mit FSO:

For Each f In fso.GetFolder(TXTPFAD).Files
Prüfe, f.name oder f.fullname den vollständigen "Pfad und Datei-Namen" ergibt. Das wird dann in "Workbook.OpenText" eingegeben.
mfg
AW: Schleife
10.06.2020 17:56:54
Anni
f.Name ergibt nicht den Pfad und Dateinamen... Das ist mir bisher nicht aufgefallen. Auch die Tabellenblätter werden demnach nicht benannt. Da ich die aber eh zum Teil raus lösche war mir das egal.
Sie können sicher nicht auf Anhieb sehen, wo nun der Fehler liegt, dass er sich nicht den Pfad richtig zieht? Ansonsten würde ich mich für die Hilfe bedanken und versuche es weiter.
mfg
Anzeige
AW: kompletter Code
10.06.2020 18:49:03
Fennek
Hallo,
für wenige Dateien ist dieser Code geeignet. Jede txt-Datei des Ordners wird in ein Sheet importiert:

Sub F_en()
Dim FSO As Object: Set FSO = CreateObject("Scripting.FileSystemObject")
Dim WB As Workbook
Application.ScreenUpdating = False
Pfad = "c:\users\office\desktop"
For Each file In FSO.GetFolder(Pfad).Files
If FSO.getextensionname(file) = "txt" Then
Workbooks.OpenText Filename:=file, Origin:=65001, StartRow:=1, _
DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
ConsecutiveDelimiter:=False, Tab:=False, Semicolon:=False, _
Comma:=True, Space:=False, Other:=False, _
FieldInfo:=Array(Array(1, 2), Array(2, 1), Array(3, 1), _
Array(4, 2), Array(5, 1), Array(6, 1), Array(7, 1), Array(8, 1), _
Array(9, 1)), TrailingMinusNumbers:=True
ActiveSheet.Move , ThisWorkbook.Sheets(Sheets.Count)
End If
Next file
Set FSO = Nothing
End Sub
mfg
Anzeige
AW: kompletter Code
11.06.2020 08:10:57
Anni
Hallo Fennek,
danke für den Code.:) hat geklappt. Ist es auch möglich die Listen zusammenzufügen auf einem Sheet, ohne dass immer ein neues hinzugefügt wird? Einfach komplett untereinander aneinandergereiht?
mfg Anni
AW: kompletter Code 2
11.06.2020 10:55:00
Fennek
Hallo,
da nicht angegeben wurde, wohin die Daten sollen, wählte ich die für mich einfachste Lösung. Gestern konnte ich die Text-Datei NICHT mit 'set wb = workbooks.OpenText(file)' öffnen. Daher ist es einfacher den bestehenden Code zu ergänzen.
Lege ein neues, leeres Sheet an der Position 1 (ganz links) an. Dann
Sub Main
for i = 2 to sheets.count
sheets(i).usedrange.cells.copy activesheet.cells(rows.count, 1).end(xlup).offset(1)
next i
End Sub

Mit LibreOffice getestet.
mfg
Anzeige
AW: kompletter Code 2
11.06.2020 11:42:48
Anni
Danke dafür. Ich habe trotdem noch ein Problem.
Ich habe eine Tabelle Daten gesamt. Führe ersten Code aus
Tabellenblätter kommen hinzu
Führe zweiten Code aus
in Tabelle Daten werden alle Daten der Sheets 2-Ende komplett aufgelistet.
Bis dahin alles gut.
Jetzt möchte ich die gerade herein geladenen Tabellenblätter löschen, damit nur noch die Tabelle Daten gesamt dort steht.
Dies mache ich mit:
Application.DisplayAlerts = False
For Each ws In ThisWorkbook.Worksheets
If ws.Name = "BR*" Then 'bei mir fangen die txt Dateien alle mit "BR" an
ws.Delete
End If
Next
Application.DisplayAlerts = True
Er überspringt aber immer ws.Delete. Ich weiß nicht warum.
Er erkennt die Tabellenblätter aber springt dann gleich auf End if
Weißt du wo der Fehler liegt?
Anzeige
AW: kompletter Code 2
11.06.2020 11:58:55
ralf_b
so zum beispiel
Sub Main
for i = sheets.count to 2  'das erste soll ja bleiben
sheets(i).usedrange.cells.copy activesheet.cells(rows.count, 1).end(xlup).offset(1)
next i
for i = sheets.count to 2  'das erste soll ja bleiben
sheets(i).delete
next i
End Sub

AW: kompletter Code 2
11.06.2020 12:44:27
Anni
Die Idee hatte ich auch gerade. Komischerweise löscht er auch dort die Seiten nicht raus. :(
AW: kompletter Code 2
11.06.2020 13:04:43
ralf_b
dann stimmt was mit dem bezug auf das Arbeitsblatt nicht. du kannst dir ja in der schleife den namen des blattes ausgeben lassen , dann siehst du ob du das richtige hast.
msgbox sheets(i).name
Anzeige
AW: kompletter Code 2
11.06.2020 13:05:55
Anni
Mit
for i = 2 to sheets.count
sheets(i).delete
löscht er es jetzt (2 to sheets.count vertauscht) aber bei der letzten Tabelle stoppt er immer und zeigt den Fehler Index außerhalb des gültigen Bereiches. Wie bekomme ich die letzte jetzt noch weg?
Das Problem ist auch, dass wenn ich nun andere wichtige Tabellenblätter dahinter stehen hätte würde es natürlich alle löschen. Deswegen hatte ich das mit "Lösche alle die den Namen "..." hatten genommen. Aber das funktioniert ja irgendwie nicht.:/
AW: kompletter Code 2
11.06.2020 13:14:06
ralf_b
das mit den namen funktioniert schon,
wenn du von vorne weg löschst als von 1 bis x , dann werden es natürlich immer weniger blätter. der wert sheets.count ändert sich dann ja auch. irgendwann bis du mit dem schleifenzähler ausserhalb des sheets.count bereiches. ergo fehler.
deshalb lösche ich die blätter von hinten her, also von max zu min. da der index dann keine fehler macht. ich ging davon aus das in der mappe keine weiteren blätter drin sind außer das Daten gesamt.
sonst bleibt dir nur der namensvergleich. nutze dann
If Sheets(i).Name Like "Ber*" Then Sheets(i).delete
Anzeige
AW: kompletter Code 2
11.06.2020 13:25:13
Anni
Also mit der Msg box bekomme ich die richtigen Namen raus. Die heißen also alle richtig.
Ich habe im moment keine anderen Tabellenblätter hinter den eingefügten die weg sollen. Daher müsste es ja eigentlich alle weg löschen.
Mit der If Anweisung kommt auch Index außerhalb des gültigen Bereiches.
Bei i steht im Lokalfenster, dass i = 5 ist obwohl nur 4 Tabellenblätter existieren.
Auf Hidden ist eigentlich keins gesetzt.
AW: kompletter Code 2
11.06.2020 13:32:28
Anni
Bzw er löscht das letzte Blatt wieder nicht mit if Sheets (i) .... then.
weil ich ja wieder i=2 to Sheets.Count angebe.
bei Sheets.Count+1 oder -1 funktioniert es auch nicht.
Anzeige
AW: kompletter Code 2
11.06.2020 14:06:06
ralf_b
dann nimm das Konstrukt.
For Each ws In ThisWorkbook.Worksheets
If ws.Name like  = "BR*"
ws.Delete
End If
Next

AW: kompletter Code 2
11.06.2020 14:12:51
Anni
Danke!
Es hat endlich geklappt:)
Da kann ich heute beruhigt schlafen.
mfg Anni
AW: Kompletter Code anpassen
15.06.2020 12:03:44
Anni
Hallo
ich habe noch eine Frage zu dem Code von Fennek.(siehe unten)
Die txt Dateien die ich dort Importiere (siehe auch Verlauf Beispieldatei) haben Werte wie "+/- 6.5".
Ich brauche diese mit Komma --> 6,5 dazu hätte ich einfach in den Code eigefügt:
DecimalSeparator:=".", ThousandsSeparator:=",", _
Funktioniert aber leider nicht und gibt mir immer noch "." aus. Was mache ich da falsch?
Sub F_en()
Dim FSO As Object: Set FSO = CreateObject("Scripting.FileSystemObject")
Dim Pfad As String, file As Object
Pfad = "X:...."
For Each file In FSO.GetFolder(Pfad).Files
If FSO.getextensionname(file) = "txt" Then
Workbooks.OpenText Filename:=file, Origin:=65001, StartRow:=1,
DataType:=xlDelimited, TextQualifier:=xlDoubleQuote,'(hier eingefügt) _
ConsecutiveDelimiter:=False, Tab:=False, Semicolon:=False, _
Comma:=True, Space:=False, Other:=False, _
FieldInfo:=Array(Array(1, 2), Array(2, 1), Array(3, 1), _
Array(4, 2), Array(5, 1), Array(6, 1), Array(7, 1), Array(8, 1), _
Array(9, 1)), TrailingMinusNumbers:=True
ActiveSheet.Move , ThisWorkbook.Sheets(Sheets.Count)
End If
Next file
Set FSO = Nothing
End Sub
mfg Anni

304 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige