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

VBA automatisierte Verarbeitung TXT Dateien

VBA automatisierte Verarbeitung TXT Dateien
15.02.2016 14:27:45
Tom
Hallo VBA-Crew,
ich benötige zur Lösung meiner VBA Bearbeitung eure Hilfe und Hoffe ich bin hier richtig.
1.) Mit meinem MAKRO möchte ich eine große Anzahl von Textdateien auswählen und als Array einlesen. Hierzu erfolgt über ein Formular die Auswahl des Ordnerverzeichnis und ggf. die Mehrfachauswahl der betreffenden Textdateien. Leider funktioniert aktuell nur das einlesen und verarbeiten einer Textdatei.
2.) Ist es möglich aus der Ausgangstextdatei nur bestimmter Suchbegriffe auszulesen und in das Array zu Überführen?
Beispiel: Es gibt in der Datei tausende Segmente die mit dem String „QTY+79:“ beginnen dann folgt ein Verbrauchswert und danach kommt ein Hochkomma als Begrenzungskonstante. Ich möchte immer nur den Verbrauchswert ermitteln der zwischen dem Start String und der Begrenzungskonstante steht und diese alle in ein Array überführen.
Ist soetwas überhaupt möglich oder muss ich eine weitere Bearbeitung und Auslesung erst durchführen wenn das Array in ein Excel Arbeitsblatt kopiert wurde?
P.S: unter dem folgenden Link befindet sich die ZIP-Datei mit: der MAKRO Datei, Beispiel Textdatei, Screenshots zur weiteren Erklärung der Problemstellung.
https://www.herber.de/bbs/user/103563.zip
Gruß
Tom

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA automatisierte Verarbeitung TXT Dateien
16.02.2016 08:42:26
JoWE
Hallo Tom,
Du könntest die Textdatei beispielsweise erst einmal kopieren (um die Originaldatei zu behalten) und dann die Kopie "vorbehandeln" indem zunächst via VB-Script mittels 'suchen und ersetzen' hinter jede Auftreten von "QTY+79:" eine Absatzmarke gesetzt wird. Danach können die so entstehenden Datensätze gelesen, der gesuchte Teil separiert und in eine Tabelle geschrieben werden.
Ich könnte es mir so vorstellen:
Option Explicit
Sub prepare()
Dim objFileSystem
Dim strPath
Dim strFile
Dim strNewFile
Dim objFile
Dim strContent
Dim strSearch
Dim strReplace
Dim Zeile As Long, Spalte As Long
Dim InputData As String
strPath = "C:\Daten\automatisierte_Txt_import_Mehrfachauswal\" 'anpassen
strFile = "Test.txt" 'anpassen
strNewFile = "changedText.txt" 'anpassen
strSearch = "QTY+79:"
strReplace = "QTY+79:" & Chr(13) & Chr(10)
Set objFileSystem = CreateObject("Scripting.FileSystemObject")
objFileSystem.CopyFile strPath & strFile, strPath & strNewFile
Set objFile = objFileSystem.OpenTextFile(strNewFile, 1)
strContent = Replace(objFile.ReadAll, strSearch, strReplace)
Set objFile = objFileSystem.OpenTextFile(strNewFile, 2)
objFile.Write (strContent)
objFile.Close
Set objFile = Nothing
Set objFileSystem = Nothing
'jetzt in Tabelle schreiben
Zeile = 2
Spalte = 1
Open strNewFile For Input As #1
Do Until EOF(1)
On Error Resume Next
Line Input #1, InputData
Sheets("Tabelle1").Cells(Zeile, Spalte) = _
Left(InputData, InStr(1, InputData, "'") - 1)
Zeile = Zeile + 1
Loop
Close #1
End Sub
Gruß
Jochen

Anzeige
AW: Noch ne Änderung!
16.02.2016 08:54:02
JoWE

Option Explicit
Sub prepare()
Dim objFileSystem
Dim strPath
Dim strFile
Dim strNewFile
Dim objFile
Dim strContent
Dim strSearch
Dim strReplace
Dim Zeile As Long, Spalte As Long
Dim InputData As String
strPath = "C:\Daten\" 'anpassen
strFile = "Textdatei_TL_20160211_BSP.txt" 'anpassen
strNewFile = strPath & "changedText.txt" 'anpassen
strSearch = "QTY+79:"
strReplace = "QTY+79:" & Chr(13) & Chr(10)
Set objFileSystem = CreateObject("Scripting.FileSystemObject")
objFileSystem.CopyFile strPath & strFile, strNewFile
Set objFile = objFileSystem.OpenTextFile(strNewFile, 1)
strContent = Replace(objFile.ReadAll, strSearch, strReplace)
Set objFile = objFileSystem.OpenTextFile(strNewFile, 2)
objFile.Write (strContent)
objFile.Close
Set objFile = Nothing
Set objFileSystem = Nothing
'jetzt in Tabelle schreiben
Zeile = 2
Spalte = 1
Open strNewFile For Input As #1
Do Until EOF(1)
On Error Resume Next
Line Input #1, InputData
Sheets("Tabelle1").Cells(Zeile, Spalte) = _
Left(InputData, InStr(1, InputData, "'") - 1)
Zeile = Zeile + 1
Loop
Close #1
End Sub
Gruß
Jochen

Anzeige
AW: Noch ne Änderung!
16.02.2016 16:26:47
Tom
Hallo Jochen,
vielen Dank für deinen Lösungsansatz. Meine Problemstellung lässt sich meiner Meinung nach jedoch damit nicht bewältigen. Daher habe ich nochmal überlegt. Ich habe die Textdatei komplett eingelesen mit dem Trennzeichen Hochkomma. Das Array habe ich auf ein temp Arbeitsblatt ausgegeben.
Meine Idee war nun per Schleife die einzelnen Datensätze per Left Funktion auslesen und mit dem Wert der Variablen abgleichen. Wirft die LEft funktion eine Übereinstimmung (strSearch01 = "QTY+79:") dann soll der aktive Zellwer mit der Mid funktion nur den Verbrauchswert ermitteln und in ein anderes Arbeitsblatt überführen. Leider scheitere ich daran ... :(
Userbild
Bsp: Zelle C1 = DTM+137:201602111409:203
Zelle C2 = DTM+163:201601010000?+01:303
Suchwert -> Zelle C3 = QTY+79:0.013
Sub find_String_copy_partly_to_new_Sheet()
Dim Counter As Long
Dim zaehler As Long
'Dim Zeile As Long
Dim strActiveCell As String
Dim Address As String
Dim strSearch01
Dim strSearch02
Dim strSearch03
Dim colcount As Long
Counter = Worksheets(3).UsedRange.count
strActiveCell = ActiveCell.Value
Address = ActiveCell.Address
strSearch01 = "QTY+79:"
strSearch02 = "LOC+172+:"
strSearch03 = "LIN+1'PIA+5+1-1?"
Worksheets(3).Range("c:c").Activate
colcount = 3
zaehler = 1
For zaehler = 1 To Counter
' Hier soll mit der Leftfunktion ein Abgleich der ersten 7 Stringzeichen durchgeführt werden.
' stimmen diese mit dem String aus der variablen strSearch01 = "QTY+79:" überein soll mit der
'Mid-Funktion nur der letze String Teil der Zelle in ein anderes arbeitsblatt kopiert werden
If Worksheets(3).Cells(zaehler, colcount).Value = Left(ActiveCell.Value, 7) = strSearch01  _
Then
ActiveCell.Mid(ActiveCell.Value, 7, 4).Copy Destination:=Worksheets("Daten_Import").Range(" _
C1").Offset(1, 0)
zaehler = zaehler + 1
Else
zaehler = zaehler + 1
End If
Next zaehler
End Sub

Anzeige
AW: Noch ne Änderung!
16.02.2016 20:10:03
JoWe
Hallo Tom,
ich bleibe bei meinem Ansatz: Mit kopieren und geringen Änderungen war er leicht anzupassen:
Option Explicit
Sub prepare()
Dim objFileSystem
Dim strPath
Dim strFile
Dim strNewFile
Dim objFile
Dim strContent
Dim strSearch01
Dim strReplace01
Dim strSearch02
Dim strReplace02
Dim strSearch03
Dim strReplace03
Dim Zeile As Long, Spalte As Long
Dim InputData As String
strPath = "C:\Temp\" 'anpassen
strFile = "Textdatei_TL_20160211_BSP.txt" 'anpassen
strNewFile = strPath & "changedText1.txt" 'anpassen
strSearch01 = "QTY+79:"
strReplace01 = "QTY+79:" & Chr(13) & Chr(10)
strSearch02 = "LOC+172+"
strReplace02 = "LOC+172+" & Chr(13) & Chr(10)
strSearch03 = "LIN+1'PIA+5+1-1?:"
strReplace03 = "LIN+1'PIA+5+1-1?;" & Chr(13) & Chr(10)
'Suchen und Ersetzen zum Ersten:
'temporäre Datei aus der Originaldatei erstellen
'Suchen und ersetzen mit strSearch01 und strReplace01 durchführen
Set objFileSystem = CreateObject("Scripting.FileSystemObject")
objFileSystem.CopyFile strPath & strFile, strNewFile
Set objFile = objFileSystem.OpenTextFile(strNewFile, 1)
strContent = Replace(objFile.ReadAll, strSearch01, strReplace01)
Set objFile = objFileSystem.OpenTextFile(strNewFile, 2)
objFile.Write (strContent)
objFile.Close
Set objFile = Nothing
Set objFileSystem = Nothing
'Suchen und Ersetzen zum Zweiten:
'temporäre Datei aus der ersten temporären Datei erstellen
'Suchen und ersetzen mit strSearch02 und strReplace02 durchführen
strFile = strPath & "changedText1.txt" 'anpassen
strNewFile = strPath & "changedText2.txt" 'anpassen
Set objFileSystem = CreateObject("Scripting.FileSystemObject")
objFileSystem.CopyFile strFile, strNewFile
Set objFile = objFileSystem.OpenTextFile(strNewFile, 1)
strContent = Replace(objFile.ReadAll, strSearch02, strReplace02)
Set objFile = objFileSystem.OpenTextFile(strNewFile, 2)
objFile.Write (strContent)
objFile.Close
Set objFile = Nothing
Set objFileSystem = Nothing
'Suchen und Ersetzen zum Dritten:
'temporäre Datei aus der zweiten temporären Datei erstellen
'Suchen und ersetzen mit strSearch03 und strReplace03 durchführen
strFile = strPath & "changedText2.txt" 'anpassen
strNewFile = strPath & "changedText3.txt" 'anpassen
Set objFileSystem = CreateObject("Scripting.FileSystemObject")
objFileSystem.CopyFile strFile, strNewFile
Set objFile = objFileSystem.OpenTextFile(strNewFile, 1)
strContent = Replace(objFile.ReadAll, strSearch03, strReplace03)
Set objFile = objFileSystem.OpenTextFile(strNewFile, 2)
objFile.Write (strContent)
objFile.Close
Set objFile = Nothing
Set objFileSystem = Nothing
'jetzt die gesuchten Daten in Tabelle schreiben
Zeile = 2
Spalte = 1
Open strNewFile For Input As #1
Do Until EOF(1)
On Error Resume Next
Line Input #1, InputData
If Left(InputData, 2) = "::" Then GoTo sprung
Sheets("Tabelle1").Cells(Zeile, Spalte) = _
Replace(Left(InputData, InStr(1, InputData, "'") - 1), ":SRW", "")
Zeile = Zeile + 1
sprung:
Loop
Close #1
'Schließlich die überflüssigen temporären "changedText-Dateien" löschen
Dim fileNumber As Integer
Set objFileSystem = CreateObject("Scripting.FileSystemObject")
For fileNumber = 1 To 3
objFileSystem.DeleteFile strPath & "changedText" & fileNumber & ".txt"
Next
Set objFileSystem = Nothing
End Sub
Gruß
Jochen

Anzeige
AW: Noch ne Änderung!
17.02.2016 18:51:46
Tom
Hallo Jochen,
vielen Dank die Lösung von der funktioniert, sodass ich die kryptischen Segmentbezeichnungen nicht mehr in meiner Ausgabe Datei habe :)
Abschließend wollte ich noch ermitteln welche Verbrauchswerte alle zu einem Gerat gehören.
Bsp.: in dem folgendem Bild habe ich den Zustand dargestellt. Ich habe per Schleife jeweils in Spalte B einen "Marker" gesetzt und diesen hoch zaehlt. Dadurch weiß ich, dass zum Gerät Bsp.: Zelle A2 die Verbrauchswerte bis Zelle A2979 gehören. Gerät 2 hat z.B. die Range 2980 bis 5957 und so weiter.
Aktuell hänge ich an der Schleife die anhand des in Spalte B gesetzten Markers den Range Bereich ermittelt und das Gerät inkl. aller dazugehörigen Verbrauchswerte in Arbeitsblatt Spalte A schreibt. Gerät 2 inkl. aller Werte soll dann auf dem Arbeitsblatt in Spalte B etc...
Anbei noch die Makro Datei zum Test
Problem bei Sub Schleife_Range_Ermittlung()
https://www.herber.de/bbs/user/103647.zip
Aktuell:
Userbild
Zielformat:
Userbild
Vielen Dank für deine kompetente Hilfe
Gruß
Tom

Anzeige
AW: Noch ne Änderung!
18.02.2016 08:49:48
JoWE
Hallo Tom,
Du schreibst "Aktuell hänge ich an der Schleife die ..." und erwähnst ein bestimmtes Makro.
Jedoch sehe ich in der angehängten Arbeitsmappe genau dieses Makro nicht.
Allerdings stellt sich die Frage, ob das Ziel nicht auch mit Excel-Standardfunktionen zu lösen ist.
Ich denke da an Auto- und/oder Spezialfilter sowie an den Sverweis. Evtl. hilft ja auch eine Pivot-Tabelle?
Gruß
Jochen

AW: Noch ne Änderung!
18.02.2016 12:13:09
Tom
Hallo Jochen,
du hast Recht ich habe ausversehen den falschen Link angegeben, sodass es sich nicht um das korrekte MAKRO handelte ... Leider kann ich den Text der Schleife hier ins Formular nicht reinkopieren dabei gibt es hier einen Formularfehler daher hänge ich nun das korrekte Makro mit der betreffenden Schleife an.
Problem bei Sub Schleife_Range_Ermittlung() immer wieder die nächsten dynamischen Range Bereich auszuwählen. Ich habe schon einige variablen in die Schleife integriert die hochgezählt werden. Problematisch ist die Variable "Starcounter" diese muss jeweils hochgesetzt werden
auf die gefundene Zelle in Spalte "B5958" müsste Startcounter A5958 sein.
https://www.herber.de/bbs/user/103674.xlsm

Anzeige
AW: Noch ne Änderung!
19.02.2016 10:57:15
JoWE
Hallo Tom,
wenn es Dir nur darum geht, die vorhandenen Daten aus der Tabelle 'Temp_Verlauf' in die Tabelle 'Werte' je Gerät in eine eigene Spalte einzuordnen, könnte es vielleicht so gelingen:
Option Explicit
Sub ordnen()
Dim sp As Long
Dim zeile As Long
Dim ze As Object
Dim shSource As Worksheet
Dim shDest As Worksheet
Set shSource = ThisWorkbook.Sheets("Temp_Verlauf")
Set shDest = ThisWorkbook.Sheets("Werte")
sp = 1
zeile = 2
With shSource
For Each ze In .Range("A2:A" & .Cells(Rows.Count, 1).End(xlUp).Row)
If Not IsNumeric(ze) And InStr(1, ze, ".") = 0 Then
shDest.Cells(1, sp) = .Cells(ze.Row, 1)
sp = sp + 1
zeile = 2
Else
shDest.Cells(zeile, sp - 1) = .Cells(ze.Row, 1)
zeile = zeile + 1
End If
Next
End With
End Sub
Gruß
Jochen

Anzeige
AW: Noch ne Änderung!
20.02.2016 17:18:37
Tom
Hallo Jochen,
die Sortierung der Daten aus dem Temp Arbeitsblatt in das Werte Arbeitsblatt funktioniert tadellos. Ich möchte mich nochmal bei dir für deine kompetente Unterstützung bei der Problemlösung der betreffenden Fragestellungen bedanken.
Gruß
Tom

AW: Danke für die Rückmeldung
20.02.2016 17:38:24
JoWE

AW: VBA automatisierte Verarbeitung TXT Dateien
16.02.2016 12:24:24
Tom
Hallo Jochen,
vielen Dank für deinen Lösungsansatz. Ich habe den Code getestet es fehlte noch die variable für die Pfadangabe damit er die Datei findet das hatte ich noch ergänzt. Ich habe jedoch 3 Stringbegriffe nach denenen gesucht werden soll ist das auch moeglich mit der replace funktion gleich meherere String/Replace Vorgänge in der Datei vorzunehmen?
2.) "LOC+172+" >unbekannter/gesuchter StringHochkomma
3.) "LIN+1'PIA+5+1-1?:" >unbekannter/gesuchter String":SRW'"
ggf.nur Hochkomma als Begrenzungskonstante
Wenn es nicht möglich ist mehrere replace Vorgänge durchzuführen war meine Idee doch erst die Datei in einem Array per Begrenzungskonstante Hochkomma zu schreiben und in ein Excel Arbeisblatt zu überführen. Danach per Schleife jede einzelne Zeile nach den Suchstrings bzw Replace Vorgang vornehmen?

Sub prepare()
Dim objFileSystem
Dim strPath
Dim strFile
Dim strNewFile
Dim objFile
Dim strContent
Dim strSearch
Dim strSearch02 As String
Dim strSearch03 As String
Dim strReplace
Dim strReplace02
Dim strReplace03
Dim Zeile As Long, Spalte As Long
Dim InputData As String
strPath = "C:\Daten\" 'anpassen
strFile = "Testdatei01.txt" 'anpassen
strNewFile = "temp_" & strFile & ".txt" 'anpassen
strSearch = "QTY+79:"
strReplace = "QTY+79:" & Chr(13) & Chr(10)
strSearch02 =  "LOC+172+:"
strReplace02 = "LOC+172+:" & Chr(13) & Chr(10)
strSearch03 =  "LIN+1'PIA+5+1-1?" & ":SRW"
strReplace03 = "LIN+1'PIA+5+1-1?" & Chr(13) & & ":SRW" & Chr(10)
Set objFileSystem = CreateObject("Scripting.FileSystemObject")
objFileSystem.CopyFile strPath & strFile, strPath & strNewFile
Set objFile = objFileSystem.OpenTextFile(strPath & strNewFile, 1)
strContent = Replace(objFile.ReadAll, strSearch,strSearch02,strSearch03,  _
strReplace, strReplace02,strReplace03)
Set objFile = objFileSystem.OpenTextFile(strPath & strNewFile, 2)
objFile.Write (strContent)
objFile.Close
Set objFile = Nothing
Set objFileSystem = Nothing
'jetzt in Tabelle schreiben
Zeile = 2
Spalte = 3
Open strPath & strNewFile For Input As #1
Do Until EOF(1)
On Error Resume Next
Line Input #1, InputData
Worksheets(3).Cells(Zeile, Spalte) = _
Left(InputData, InStr(1, InputData, "'") - 1)
Zeile = Zeile + 1
Loop
Close #1
End Sub
Danke & Gruß
Tom
Anzeige

309 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige