Live-Forum - Die aktuellen Beiträge
Datum
Titel
23.04.2024 14:59:21
23.04.2024 14:47:39
23.04.2024 14:23:45
Anzeige
Archiv - Navigation
1600to1604
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

sdf

sdf
17.01.2018 17:02:39
Markus
Hallo,
ich habe einen Ordner, in den regelmäßig Textdateien (Format .txt) abgelegt werden, die alle gleich aufgebaut sind.
Gibt es einen Weg, per VBA den Inhalt aller dieser Textdateien der Reihe nach in eine Exceldatei (im gleichen Ordner) zu schreiben ? Die Exceldatei ist dabei bis auf eine Überschriftszeile in Zeile 1 leer.
Ich weiss zwar, wie ich Textdateien erstellen und in diese schreiben kann aber zum Einlesen fällt mir leider kein Ansatz ein.
Vielen Dank im Voraus für jeden Tipp,
Markus

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: korrekter Betreff: Einlesen von Textdateien
17.01.2018 17:03:23
Textdateien
oT
AW: sdf
17.01.2018 17:06:38
onur
Du solltest die Excel- und eine .txt posten.
AW: sdf
17.01.2018 17:20:26
Sepp
Hallo Markus,
haben die Textdateien eine Überschrift? Was ist das Trennzeichen zwischen den Spalten?
Gruß Sepp

AW: sdf
17.01.2018 17:23:34
Markus
Hier eine Beispiel-Textdatei:
https://www.herber.de/bbs/user/119046.txt
Die Textdateien enthalten dabei jeweils unterschiedlich viele Zeilen mit Text, wobei ein Unterstrich jeweils für eine neue Spalte in Excel steht.
Die Exceldatei ist wie gesagt leer, d.h. die Texte sollen dort einfach untereinander auf Blatt1 geschrieben werden.
VG,
Markus
Anzeige
AW: sdf
17.01.2018 17:49:18
Sepp
Hallo Markus,
in ein allgemeines Modul.
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Sub importTXT()
Dim strPath As String, strFile As String, strTemp As String
Dim lngNext As Long, varLines As Variant

On Error GoTo ErrorHandler

With Application
  .ScreenUpdating = False
  .EnableEvents = False
End With

strPath = "E:\Forum\Test\" 'Pfad - Anpassen!

If Right(strPath, 1) <> "\" Then strPath = strPath = "\"

strFile = Dir(strPath & "*.txt", vbNormal)

With Sheets("Tabelle1") 'Tabellenname - Anpassen!
  Do While strFile <> ""
    lngNext = Application.Max(2, .Cells(.Rows.Count, 1).End(xlUp).Row + 1)
    strTemp = TextReadAll(strPath & strFile)
    varLines = Split(strTemp, vbLf)
    .Cells(lngNext, 1).Resize(UBound(varLines), 1) = varLines
    strFile = Dir
  Loop
  lngNext = Application.Max(2, .Cells(.Rows.Count, 1).End(xlUp).Row + 1)
  .Range("A2:A" & lngNext).TextToColumns Destination:=Range("A2"), _
    DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
    ConsecutiveDelimiter:=False, Other:=True, OtherChar:="_", _
    FieldInfo:=Array(Array(1, 1), Array(2, 4), Array(3, 4)), _
    TrailingMinusNumbers:=True
End With

ErrorHandler:

With Application
  .ScreenUpdating = True
  .EnableEvents = True
End With
End Sub

Private Function TextReadAll(ByVal FileName As String) As String
Dim FF As Integer, strText As String

On Error Resume Next

If ((GetAttr(FileName) And vbDirectory) <> vbDirectory) Then
  FF = FreeFile
  Open FileName For Binary As #FF
  strText = Space$(LOF(FF))
  Get #FF, , strText
  Close #FF
  TextReadAll = strText
End If

On Error GoTo 0
Err.Clear
End Function

Gruß Sepp

Anzeige
Text importieren - besser so!
17.01.2018 17:55:09
Sepp
Hallo Markus,
wenn in der tabelle bereits Daten vorhanden sind, dann nimm diesen Code.
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Sub importTXT()
Dim strPath As String, strFile As String, strTemp As String
Dim lngNext As Long, lngFirst As Long, varLines As Variant

On Error GoTo ErrorHandler

With Application
  .ScreenUpdating = False
  .EnableEvents = False
End With

strPath = "E:\Forum\Test\" 'Pfad - Anpassen!

If Right(strPath, 1) <> "\" Then strPath = strPath = "\"

strFile = Dir(strPath & "*.txt", vbNormal)

With Sheets("Tabelle1") 'Tabellenname - Anpassen!
  lngNext = Application.Max(2, .Cells(.Rows.Count, 1).End(xlUp).Row + 1)
  Do While strFile <> ""
    lngNext = Application.Max(2, .Cells(.Rows.Count, 1).End(xlUp).Row + 1)
    strTemp = TextReadAll(strPath & strFile)
    varLines = Split(strTemp, vbLf)
    .Cells(lngNext, 1).Resize(UBound(varLines) + 1, 1) = varLines
    strFile = Dir
  Loop
  lngNext = Application.Max(2, .Cells(.Rows.Count, 1).End(xlUp).Row + 1)
  .Range(.Cells(lngFirst, 1), .Cells(lngNext, 1)).TextToColumns Destination:=Range("A2"), _
    DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
    ConsecutiveDelimiter:=False, Other:=True, OtherChar:="_", _
    FieldInfo:=Array(Array(1, 1), Array(2, 4), Array(3, 4)), _
    TrailingMinusNumbers:=True
End With

ErrorHandler:

With Application
  .ScreenUpdating = True
  .EnableEvents = True
End With
End Sub

Private Function TextReadAll(ByVal FileName As String) As String
Dim FF As Integer, strText As String

On Error Resume Next

If ((GetAttr(FileName) And vbDirectory) <> vbDirectory) Then
  FF = FreeFile
  Open FileName For Binary As #FF
  strText = Space$(LOF(FF))
  Get #FF, , strText
  Close #FF
  TextReadAll = strText
End If

On Error GoTo 0
Err.Clear
End Function

Gruß Sepp

Anzeige
AW: Text importieren - besser so!
17.01.2018 18:17:48
Markus
Hallo Sepp,
vielen Dank dafür - das sieht super aus ! Ich probiere es mal damit !
In den Textdateien stehen Unterstriche als Spaltentrenner.
Die Exceldatei enthält nur eine Überschriftszeile in Zeile 1 auf Blatt 1 (sonst keine Daten).
VG,
Markus
AW: Text importieren - besser so!
17.01.2018 20:15:13
Sepp
Hallo Markus,
habe soeben bemerkt, dass ich da einen Blödsinn gepostet habe ;-))
So muss es lauten.
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Sub importTXT()
Dim strPath As String, strFile As String, strTemp As String
Dim lngNext As Long, lngFirst As Long, varLines As Variant

On Error GoTo ErrorHandler

With Application
  .ScreenUpdating = False
  .EnableEvents = False
End With

strPath = "E:\Forum\Test\" 'Pfad - Anpassen!

If Right(strPath, 1) <> "\" Then strPath = strPath = "\"

strFile = Dir(strPath & "*.txt", vbNormal)

With Sheets("Tabelle1") 'Tabellenname - Anpassen!
  lngFirst = Application.Max(2, .Cells(.Rows.Count, 1).End(xlUp).Row + 1)
  Do While strFile <> ""
    lngNext = Application.Max(2, .Cells(.Rows.Count, 1).End(xlUp).Row + 1)
    strTemp = TextReadAll(strPath & strFile)
    varLines = Split(strTemp, vbLf)
    .Cells(lngNext, 1).Resize(UBound(varLines) + 1, 1) = varLines
    strFile = Dir
  Loop
  lngNext = Application.Max(2, .Cells(.Rows.Count, 1).End(xlUp).Row + 1)
  .Range(.Cells(lngFirst, 1), .Cells(lngNext, 1)).TextToColumns Destination:=.Cells(lngFirst, 1), _
    DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
    ConsecutiveDelimiter:=False, Other:=True, OtherChar:="_", _
    FieldInfo:=Array(Array(1, 1), Array(2, 4), Array(3, 4)), _
    TrailingMinusNumbers:=True
End With

ErrorHandler:

With Application
  .ScreenUpdating = True
  .EnableEvents = True
End With
End Sub

Private Function TextReadAll(ByVal FileName As String) As String
Dim FF As Integer, strText As String

On Error Resume Next

If ((GetAttr(FileName) And vbDirectory) <> vbDirectory) Then
  FF = FreeFile
  Open FileName For Binary As #FF
  strText = Space$(LOF(FF))
  Get #FF, , strText
  Close #FF
  TextReadAll = strText
End If

On Error GoTo 0
Err.Clear
End Function

Gruß Sepp

Anzeige
AW: Text importieren - besser so!
18.01.2018 08:39:48
Markus
Hallo Sepp,
nochmal vielen Dank für die schnelle Antwort und den tollen Ansatz !
Ich habe es jetzt einmal ausprobiert (mit angepasstem Ordnerpfad und angepasstem Blattnamen) sowie zwei Test-Textdateien.
Die Testdateien enthielten jeweils 4 Zeilen mit Daten nach folgendem Muster text1_text2_text3, wobei der Unterstrich jeweils als Spaltentrenner fungiert.
Das Makro hat zwar etwas auf Blatt1 meiner Excel-Datei geschrieben, jedoch 5 Zeilen pro Textdatei (statt der tatsächlichen 4) und immer mit den gleichen Daten (statt mit den tatsächlich unterschiedlichen Daten) der Textdateien.
Hier mal eine Bespieldatei mit dem verwendeten Code, dem erwarteten und dem tatsächlichen Ergebnis:
https://www.herber.de/bbs/user/119058.xlsm
VG,
Markus
Anzeige
AW: Text importieren - besser so!
18.01.2018 09:34:28
Sepp
Hallo markus,
da war noch ein Fehler drin.
' **********************************************************************
' Modul: Module1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Sub importTXT()
Dim strPath As String, strFile As String, strTemp As String
Dim lngNext As Long, lngFirst As Long, varLines As Variant

On Error GoTo ErrorHandler

With Application
  .ScreenUpdating = False
  .EnableEvents = False
End With

strPath = "C:\Users\om\Desktop\"

If Right(strPath, 1) <> "\" Then strPath = strPath & "\"

strFile = Dir(strPath & "*.txt", vbNormal)

With Worksheets(1)
  lngFirst = Application.Max(2, .Cells(.Rows.Count, 1).End(xlUp).Row + 1)
  Do While strFile <> ""
    lngNext = Application.Max(2, .Cells(.Rows.Count, 1).End(xlUp).Row + 1)
    strTemp = TextReadAll(strPath & strFile)
    varLines = Split(strTemp, vbLf)
    .Cells(lngNext, 1).Resize(UBound(varLines) + 1, 1) = Application.Transpose(varLines)
    strFile = Dir
  Loop
  lngNext = Application.Max(2, .Cells(.Rows.Count, 1).End(xlUp).Row + 1)
  .Range(.Cells(lngFirst, 1), .Cells(lngNext, 1)).TextToColumns Destination:=.Cells(lngFirst, 1), _
    DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
    ConsecutiveDelimiter:=False, Other:=True, OtherChar:="_", _
    FieldInfo:=Array(Array(1, 1), Array(2, 4), Array(3, 4)), _
    TrailingMinusNumbers:=True
End With

ErrorHandler:

With Application
  .ScreenUpdating = True
  .EnableEvents = True
End With
End Sub

Private Function TextReadAll(ByVal FileName As String) As String
Dim FF As Integer, strText As String

On Error Resume Next

If ((GetAttr(FileName) And vbDirectory) <> vbDirectory) Then
  FF = FreeFile
  Open FileName For Binary As #FF
  strText = Space$(LOF(FF))
  Get #FF, , strText
  Close #FF
  TextReadAll = strText
End If

On Error GoTo 0
Err.Clear
End Function

Gruß Sepp

Anzeige
AW: Text importieren - besser so!
18.01.2018 09:42:18
Markus
Hallo Sepp,
perfekt - jetzt funktioniert es einwandfrei ! :)
Super, ist eine riesen Hilfe.
VG und vielen Dank nochmal,
Markus
AW: Text importieren - besser so!
18.01.2018 08:49:51
Markus
Hallo Sepp,
noch ein Nachtrag:
In meiner Beispieldatei sind die Überschriften falsch, richtig ist, dass Spalte A-C das Ergebnis des Makros (Ist) zeigt und Spalte F-H das erwartete Ergebnis (Soll).
VG,
Markus

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige