PDA

Vollständige Version anzeigen : Maschinendaten (.txt) auslesen


Richie889
30.09.2016, 00:23
Guten Tag

seit ein paar Monaten muss ich mich beruflich mit der VBA Programmierung in Excel befassen, deshalb habe ich mich hier angemeldet ;) .

Meine aktuelle Aufgabe ist es Maschinendaten auszulesen.

Die Ausgangslage ist ein Ordner mit einer .xls Datei. Diese Datei soll mittels einem Makro Maschinendaten aus einer .txt Datei auslesen. Die Anzahl der .txt Dateien richtet sich nach dem jeweiligen Versuch und ist somit variabel.
Ich bin soweit, dass es mir die Namen der .txt Dateien auflistet und aus dieser Auflistung heraus jeweils ein "Worksheet" mit dem .txt Dateinamen erstellt.
Was ich nun verzweifelt versuche, ist es die Maschinendaten aus den .txt Dateien auf das jeweilige Worksheet zu verteilen.

Ich hoffe ihr könnt mir helfen.

d3nz
30.09.2016, 07:26
Guten Morgen Riechie889,

ich habe mich mit sowas Ähnlichem auch vor ein paar Monaten beschäftigt.
Ich weiß ja nicht wie deine Textdateien aufgebaut sind, aber google mal in dem Zusammenhang .CSV - Datei einlesen.

Wenn du dann nicht weiter kommst schildere hier mal wo genau es hakt, dann kann man besser helfen.

Edit: Vielleicht hilft dir das auch schon weiter. http://www.ms-office-forum.net/forum/showthread.php?t=333042

Fennek11
30.09.2016, 09:49
Hallo,

der Hinweis eben ist sicher richtig, aber meine Versuche mit "Ado" waren eher schwierig.

Es geht auch einfacher: Meistens lassen sich *.txt einfach mit Workbooks.open öffnen. Da solche Fragestellungen fast täglich in jedem Forum gestellt werden, gibt es viele Beispielcodes, auch für diverse "Problemfälle".

mfg

Richie889
30.09.2016, 10:47
Hi

also ich kann "eine" Textdatei auslesen aber mir fehlt das Wissen für eine Schleife die dies für "alle" Textdateien in dem Ordner wiederholt und die Inhalte jeweils in das dafür vorgesehene Tabellenblatt packt.
Ich vermute der Code müsste ebenfalls die Anzahl der .txt Dateien ermitteln, diese einzeln einlesen und anschließend fortlaufend (Auch mit einer Schleife?) auf die vorhandenen Worksheets verteilen.
Optional wäre noch ein anschließendes Trennen (Semikolon) der jeweiligen Datensätze.

ebs17
30.09.2016, 10:53
Was ich nun verzweifelt versuche, ist es die Maschinendaten aus den .txt Dateien auf das jeweilige Worksheet zu verteilen.
Wenn man sich statt des Versuchens und Probierens gleich auf zielgerichtetes Arbeiten verlegen will, würde man sich als erstes mit den Datenstrukturen innerhalb einer Textdatei als auch mit der Struktur des Zielarbeitsblattes beschäftigen.
Also auf deutsch: Zeigen (Originaldateien, nicht Bilder).

Fennek11
30.09.2016, 10:57
Hallo,

der -ungeprüfte- Code öffnet nacheinander alle txt-Dateien eines Ordners:


sub einlesen()
sPath = "c:\temp\" 'anpassen
sFile = dir(sPath & "*.txt")
do while len(sFile)
with workbooks.open(sPath & sFile)
'hier die copy/paste - Befehle
.close 0
end with
sFile = dir
loop


mfg

Richie889
30.09.2016, 10:59
Wenn man sich statt des Versuchens und Probierens gleich auf zielgerichtetes Arbeiten verlegen will, würde man sich als erstes mit den Datenstrukturen innerhalb einer Textdatei als auch mit der Struktur des Zielarbeitsblattes beschäftigen.
Also auf deutsch: Zeigen (Originaldateien, nicht Bilder).

Ein zielgerichtetes Arbeiten ist aber nur dann möglich, wenn man sich damit auskennt. Ansonsten bleibt nur Trial and Error, genau der Grund wieso ich hier Hilfe suche.
Was die Dateien im genauen betrifft, kann und darf ich hier nix posten.
Jede Textdatei ist aber gleich aufgebaut, eine Spalte (A) und 204 Zeilen.
Aber wie bereits gesagt, ist mein Problem nur das zählen der Dateien im Ordner und das anschließende auslesen im Loop.

Richie889
30.09.2016, 13:30
Ich habe hier etwas vielversprechendes gefunden und versucht anzupassen bzw. zu testen. Wenn ich das Makro starte, kann ich die Textdateien auswählen, allerdings wird dann nur eine neue Datei geöffnet und ansonsten passiert nix.
Vielleicht könnt Ihr mir helfen dieses Beispiel anzupassen.

Sub TextImport2()
'Daten jeder Text-Datei auf eigenes Blatt
Dim wks As Worksheet, Zeile1 As Long, Zeile2 As Long, Dateien As Variant, Text As Variant
Dim I As Integer, J As Integer, Spalte As Integer, Tabname As String
' Auswahldialog für Dateien anzeigen
Dateien = Application.GetOpenFilename(FileFilter:="Textfiles (*.txt),*.txt", _
Title:="Bitte einzulesende Text-Dateien auswählen, Mehrfachauswahl ist möglich", MultiSelect:=True)
On Error GoTo Fehler ' Fängt Fehler ab, wenn Abbrechen gewählt wurde
If UBound(Dateien) > 0 Then
' Neues Mappe erstellen mit 1. Blatt
Workbooks.Add Template:=xlWBATWorksheet
For I = 1 To UBound(Dateien)
Set wks = ActiveSheet
'Tabellenname = Name Textdatei ohne Pfad und Endung .txt
Tabname = ""
For J = Len(Dateien(I)) - 4 To 1 Step -1
If Mid(Dateien(I), J, 1) <> "\" Then
Tabname = Mid(Dateien(I), J, 1) & Tabname
Else
Exit For
End If
Next
Spalte = 0 'Anzahl Spalten mit Überschriften-Titeln
ZeileUe = 1
wks.Name = Tabname
Zeile1 = ZeileUe + 1
Zeile2 = Zeile1
'Daten einlesen
Open Dateien(I) For Input Access Read As #1
Do Until EOF(1)
Line Input #1, Text
If Left(Text, 1) = "[" Then 'Header
'Überschrifte einfügen
Spalte = Spalte + 1
wks.Cells(ZeileUe, Spalte) = Text
Zeile = Zeile1 'Zeilenzähler setzen
Else
wks.Cells(Zeile, Spalte) = Text
If Zeile > Zeile2 Then Zeile2 = Zeile
Zeile = Zeile + 1
End If
Loop
Close #1
wks.Range("A2").Select
ActiveWindow.FreezePanes = True
Zeile1 = Zeile2 + 1
Zeile2 = Zeile1
If I < UBound(Dateien) Then
' Neues Blatt einfügen
Worksheets.Add After:=Sheets(Sheets.Count)
End If
Next
End If
Fehler:
End Sub

Fennek11
30.09.2016, 14:57
Hallo,

gibt es einen Grund, warum du meinen Vorschlag von weiter oben nicht versuchst hast?

Der eben gezeigte Ansatz könnte auch funktionieren, aber ich halte ihn für umständlicher.

mfg

Richie889
30.09.2016, 15:53
Wie gesagt, da ich so wenig Ahnung habe arbeite ich per Trial & Error. Mittlerweile habe ich es aber hinbekommen.

Vielleicht hilft es jemand mal weiter

Sub Alle_Textdateien() ' Erstellt für jede .txt Datei ein Blatt, liest die Daten ein und cuttet sie
Dim strExt As String
Dim ZuÖffnendeDatei As String
Dim strPath As String
Dim strFile As String

Application.ScreenUpdating = False ' Verhindert das Sichtbare aktualisieren

strExt = "*.txt" 'Dateiextension ggf. anpassen
ZuÖffnendeDatei = Application.GetOpenFilename("Textdateien (" & strExt & "), " & strExt, _
Title:="Verzeichnisauswahl, erste Datei auswählen")
'If ZuÖffnendeDatei = False Then Exit Sub
'Die ausgewählte Datei ist egal. es wird hier nur das Verzeichnis der Datei ausgewertet
strPath = CurDir & "\"
If strPath = "" Then
Exit Sub
Else
ChDir strPath
strFile = Dir(strPath & strExt) 'hier wird die erste Datei gefunden
Do While Len(strFile) > 0
Workbooks.OpenText Filename:=strPath & strFile, DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, _
Tab:=False, Semicolon:=True, Comma:=False, _
Space:=False, Other:=False, trailingMinusNumbers:=True
Sheets(1).Move After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
'...weiter mit Änderungen an der Tabelle
'...
strFile = Dir() ' nächste Datei
Loop
Sheets("Daten auslesen").Select
Range("A1").Select
End If
End Sub