Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: VBA für jede Zeile einzelne Textdatei erzeugen

VBA für jede Zeile einzelne Textdatei erzeugen
29.03.2017 14:34:43
Stefanie
Hallo zusammen,
ich befinde mich zurzeit im Praxissemester und habe für mich eine sehr komplexe Aufgabe bekommen:
Ich habe eine Datei, zu der für jede Zeile eine neue Textdatei erzeugt werden soll.
Diese sollen dann alle in einem Ordner gespeichert werden.
Ich habe es soweit hinbekommen, dass bei jedem Schleifendurchlauf eine Textdatei erzeugt wird, allerdings ist diese gefüllt mich chinesischen Zeichen ? :D
Außerdem gibt es noch die Nebenbedingung, dass wenn in Spalte 1, untereinander zwei oder mehrere gleiche Werte sind, diese in eine Textdatei gepackt werden und nicht extra Textdateien erzeugt werden.
Ich wäre euch wirklich sehr hilfreich, wenn ihr mir helfen könntet.
Am Mittwoch kommt eine externe Firma, denen ich das vorstellen muss ..
Liebe Grüße :*
Anzeige

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: 3 Fragen tiefer
29.03.2017 14:40:40
Fennek
Hi,
eine ähnliche Frage wurde heute schon einmal gestellt.
Ohne eine kleine Bsp-Datei ist es schwer zu sagen, was verbessert werden sollte.
mfg
AW: VBA für jede Zeile einzelne Textdatei erzeugen
30.03.2017 08:23:58
Stefanie
Oh ja sorry, dass habe ich total vergessen ..
Also in der oberen Datei werden genau die Spalten ausgegeben, die ich benötige, das funktioniert und im unteren Teil wird bei jedem SChleifendurchlauf eine Textdatei erzeugt, ich habe hier nur 3 angegeben aber eigentlich soll für jede Zeile eine erzeugt werden.
Ganz unten habe ich versucht die beiden Codes miteinander zu verknüpfen, aber es funktioniert nicht ..
Was kann ich an dem Code verbessern oder anders machen ?
Liebe Grüße :*
'**********************************Gibt die richtigen Spalten aus ************************************************
Sub imaSchnittstelle()
'Variablen deklarieren
Dim i As Long
Dim Pfad As String
Dim TD As Integer
Dim sLine As Variant
Application.DisplayAlerts = False 'Bildschirmaktualisierungen ausschalten, Makro wird schneller  _
ausgeführt und Bildschirm flackert nicht
lz = Sheets("KFL_allePrgr_23032017").UsedRange.SpecialCells(xlCellTypeLastCell).Row 'ermittelt  _
die letzte Zeile des Tabellenblattes
Pfad = "C:\Desktop\Test.txt" 'Hier wird die Datei gespeichert: kann geändert werden
TD = FreeFile() 'gibt Wert von Typ Integer zurück, der nächste verfügbare Dateinummer darstellt
'Öffnet die Datei zum reinschreiben
Open Pfad For Output As TD 'kann auch Append benutzt werden: Output überschreibt vorhandene  _
Datei & Append fügt neue Zeile hinzu
'Schleife: Anweisung wird von Zeile 9 bis zur letzten Zeile durchgeführt
For i = 9 To lz
Print #TD, Cells(i, 1) & ";" & Cells(i, 10) & ";" & Cells(i, 10) & ";" & Cells(i, 18) & ";" &  _
Cells(i, 17) & ";" & Cells(i, 5) & ";" & Cells(i, 9) & ";" & Cells(i, 16) & ";" & Cells(i, 11) & ";" & Cells(i, 20) & ";" & Cells(i, 21)
Next i 'nächste Zeile
Application.DisplayAlerts = True 'Bildschirmaktualisierungen wieder einschalten
MsgBox "Die Textdateien wurden im Verzeichnis ... gespeichert !" 'Benachrichtigungsfenster am  _
Ende des  Makros
End Sub

'**********************************Erstellt bei jedem Schleifendurchlauf eine Textdatei******************************************
Sub WorksheetsErstellenSchleife()
'Datei erstellen
Dim i As Integer
Dim Pfad As String
Pfad = "C:\Desktop"
For i = 1 To 3
Workbooks.Add
With ActiveWorkbook
.SaveAs Pfad & "Test" & i & ".txt"
'.Worksheets("Tabelle1").Cells(1, 1).Value = "Test"
.Close True
End With
Next
End Sub
__________________________________
Sub imaSchnittstelle()
'Variablen deklarieren
Dim i As Long
Dim Pfad As String
Dim TD As Integer
Dim sLine As Variant
Dim m As Integer
Application.DisplayAlerts = False 'Bildschirmaktualisierungen ausschalten, Makro wird schneller  _
ausgeführt und Bildschirm flackert nicht
lz = Sheets("KFL_allePrgr_23032017").UsedRange.SpecialCells(xlCellTypeLastCell).Row 'ermittelt  _
die letzte Zeile des Tabellenblattes
Pfad = "C:\Desktop\Test.txt" 'Hier wird die Datei gespeichert: kann geändert werden
TD = FreeFile()
'Öffnet die Datei zum reinschreiben
Open Pfad For Output As TD 'kann auch Append benutzt werden: Output überschreibt vorhandene  _
Datei & Append fügt neue Zeile hinzu
'Schleife: Anweisung wird von Zeile 9 bis zur letzten Zeile durchgeführt
For i = 9 To lz
Workbooks.Add
With ActiveWorkbook
.SaveAs Pfad & "TestTest" & i & ".txt"
.Worksheets("KFL_allePrgr_23032017").Cells(1, 1).Value = "Test"
.Close False
Print #TD, Cells(i, 1) & ";" & Cells(i, 10) & ";" & Cells(i, 10) & ";" & Cells(i, 18) & ";" &  _
Cells(i, 17) & ";" & Cells(i, 5) & ";" & Cells(i, 9) & ";" & Cells(i, 16) & ";" & Cells(i, 11) & ";" & Cells(i, 20) & ";" & Cells(i, 21)
Next i 'nächste Zeile
Application.DisplayAlerts = True 'Bildschirmaktualisierungen wieder einschalten
MsgBox "Die Textdateien wurden im Verzeichnis ... gespeichert !" 'Benachrichtigungsfenster am  _
Ende des  Makros
End Sub

Anzeige
AW: auf die Schnelle
30.03.2017 08:56:59
Fennek
Hallo,
in einem Text-Editor habe ich den Code etwas umgeschrieben, bis auf "close #1" sollte die Syntax stimmen.

Sub imaSchnittstelle()
lz = Sheets("KFL_allePrgr_23032017").cells(rows.count,"A").end(xlup).row
Pfad = "C:\Desktop\"
for i = 9 to lz
Open Pfad & "Test" & i & ".txt" For Output As #1
Print #1, Cells(i, 1) & ";" & Cells(i, 10) & ";" & Cells(i, 10) & ";" & Cells(i, 18) & ";" &  _
Cells(i, 17) & ";" & Cells(i, 5) & ";" & Cells(i, 9) & ";" & Cells(i, 16) & ";" & Cells(i, 11) & _
";" & Cells(i, 20) & ";" & Cells(i, 21)
close #1
Next i 'nächste Zeile
End Sub
Die ursprünglich genannte Bedingung "alle Zellen eines Falls zusammen zu speichern" ist nicht berücksichtigt, das würde auch einen völlig anderen Ansatz erfordern.
mfg
Anzeige
AW: auf die Schnelle
30.03.2017 09:08:05
Stefanie
Hallo Fennek, vielen vielen vieeeelen Dank !
Ich sitze schon seit Tagen dran und nur die paar Zeilen Code waren eig die Lösung, unglaublich :D
Danke !
Ja, dass mit der Nebenbedingung hatte ich noch nicht berücksichtigt, weil ich das andere noch nicht hinbekommen hatte ..
Dann setz ich mich jetzt mal da dran ..
Melde mich, wenn ich da nicht weiterkommen, hoffe kannst mir da auch helfen :)
Wunderschönen Tag wünsche ich dir :)
Anzeige
AW: VBA für jede Zeile einzelne Textdatei erzeugen
30.03.2017 14:36:06
Stefanie
Hallo, ich habe es leider nicht geschafft.
Das bezieht sich nur auf die Spalte 1:
Wenn zwei oder mehrere Werte untereinander gleich sind, dann sollen diese in eine Textdatei gepackt werden.
 If AcitveCell = ActiveCell + 1 Then 

So sieht momentan mein Ansatz aus, aber ich komme bei diesem Then nicht weiter
Außerdem weiß ich auch nicht, ob dieses ActiveCell + 1 genau das bewirkt, was ich möchte. Ich möchte die darunterliegenden Zellen vergleichen ?
Kann mir BITTE jemand helfen ?
Lg
Anzeige
AW: VBA für jede Zeile einzelne Textdatei erzeugen
30.03.2017 14:57:43
Fennek
Hallo,
abgesehen von der Rechtschreibung
If AcitveCell = ActiveCell + 1 Then
wäre besser
if activecell = activecell.offset(1) then
mfg
AW: VBA für jede Zeile einzelne Textdatei erzeugen
30.03.2017 15:15:43
Stefanie
Oh, okay danke :grins:
Jetzt vergleiche ich ja untereinander liegende Zeilen, aber ist das dann nicht "verallgemeinert" ?
Weil, es sollen ja nur die Zellen in der ersten Spalte verglichen werden. Oder steht die 1 in der Klammer für die erste Spalte ?
Und wie kann ich diese Zeilen jetzt in einer Textdatei zusammenfassen ?
Bzw. wie kann ich in meinem Code schreiben, dass wenn in der ersten Spalte, die Zeile darunter = der oberen Zeile ist, dass ich diese Zeile(n) in die vorherige Textdatei schreibe und nicht noch eine erzeuge ?
Liebe Grüße :)
Anzeige
AW: VBA für jede Zeile einzelne Textdatei erzeugen
03.04.2017 14:27:25
Jürgen
Hallo Stefanie,
ein kleiner Ideenansatz ohne Prüfung!
Speichere die Textdateien doch beginnen mit dem Wert aus Spalte "A" ab.
Suche anschließend in der For-Schleife, ob eine Datei im Verzeichnis mit dem Wert beginnt.
in der Schleife aufrufen:
 Call SearchInFolder(Suchverzeichnis, Range("A" & i).value & "*")

Ein Unter-Sub in der Exceldatei zum suchen:

Private Sub SearchInFolder(ByVal Folderspec As String, Suchwert As String)       ' auslesen  _
aufrufen mit Ordnername
Dim StTyp As String
Dim FSO As Object
Dim FI As Object
Dim strdatei2 As String
Set FSO = CreateObject("Scripting.Filesystemobject")
If Not FSO.FolderExists(Folderspec) Then
MsgBox Folderspec & " ist nicht vorhanden."
Set FSO = Nothing
Exit Sub
End If
StTyp = "xls" ' Dateityp
'Dateien auslesen
For Each FI In FSO.GetFolder(Folderspec).Files           ' Schleife über alle Dateien
'Dateityp feststellen
If FI.Name Like Suchwert Then
strDatei = FI.Name
Exit Sub 'anpassen
End If
Next
Set FSO = Nothing
End Sub
Dabei kann das Suchverzeichnis fest hinterlegt werden, oder wie ich es gerne ausführe durch die Abfrage einer MsgBox variabel gestaltet werden.
Gruß
Jürgen
Anzeige
;

Forumthreads zu verwandten Themen

Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

VBA für jede Zeile eine separate Textdatei erstellen


Schritt-für-Schritt-Anleitung

Um für jede Zeile einer Excel-Tabelle eine separate Textdatei zu erstellen, kannst Du den folgenden VBA-Code verwenden. Dieser Code berücksichtigt auch die Bedingung, dass gleichwertige Einträge in der ersten Spalte in einer einzigen Datei zusammengefasst werden.

  1. Öffne Excel und drücke ALT + F11, um den VBA-Editor zu öffnen.
  2. Füge ein neues Modul hinzu (Einfügen -> Modul).
  3. Kopiere den folgenden Code in das Modul:
Sub ErstelleTextdateien()
    Dim i As Long
    Dim lz As Long
    Dim Pfad As String
    Dim TD As Integer
    Dim aktuellerWert As String
    Dim dateiName As String

    Application.DisplayAlerts = False
    lz = Sheets("DeinTabellenblatt").UsedRange.SpecialCells(xlCellTypeLastCell).Row
    Pfad = "C:\DeinPfad\"  ' Pfad anpassen

    For i = 9 To lz
        aktuellerWert = Cells(i, 1).Value
        dateiName = Pfad & aktuellerWert & ".txt"

        If Dir(dateiName) = "" Then ' Datei existiert noch nicht
            Open dateiName For Output As #1
        End If

        Print #1, Cells(i, 1) & ";" & Cells(i, 10) & ";" & Cells(i, 18)

        If i = lz Or Cells(i + 1, 1).Value <> aktuellerWert Then
            Close #1
        End If
    Next i

    Application.DisplayAlerts = True
    MsgBox "Die Textdateien wurden im Verzeichnis gespeichert!"
End Sub
  1. Passe den Pfad und den Tabellenblattnamen an Deine Bedürfnisse an.
  2. Schließe den VBA-Editor und führe das Makro (ALT + F8) aus.

Häufige Fehler und Lösungen

  • Chinesische Zeichen in Textdateien: Stelle sicher, dass der Code die richtige Codierung verwendet. Wenn Du Textdateien mit speziellen Zeichen schreibst, könnte es sinnvoll sein, die ADODB.Stream-Methode zu verwenden, um die richtige Codierung zu gewährleisten.

  • Datei überschreibt: Der Code prüft, ob die Datei bereits existiert, bevor er versucht, sie zu öffnen. Stelle sicher, dass der Dateiname korrekt generiert wird.

  • Fehler beim Schließen der Datei: Achte darauf, dass die Close-Anweisung in der richtigen Stelle im Code steht, um sicherzustellen, dass die Datei korrekt geschlossen wird.


Alternative Methoden

  1. Verwendung von ADODB.Stream: Diese Methode bietet mehr Flexibilität bei der Handhabung von Textdateien und unterstützt verschiedene Codierungen.

    Dim stream As Object
    Set stream = CreateObject("ADODB.Stream")
    stream.Type = 2 ' Text
    stream.Charset = "UTF-8"
    stream.Open
    stream.WriteText "Dein Text hier"
    stream.SaveToFile "C:\DeinPfad\DeineDatei.txt", 2 ' 2 = Über schreiben
    stream.Close
  2. Power Query: Wenn Du Daten aus Excel in eine Textdatei exportieren möchtest, könnte auch Power Query eine Alternative sein, um die Daten zu transformieren und zu exportieren.


Praktische Beispiele

Ein einfaches Beispiel für das Erstellen einer Textdatei mit VBA könnte so aussehen:

Sub BeispielTextdateiErstellen()
    Dim file As String
    file = "C:\DeinPfad\Beispiel.txt"

    Open file For Output As #1
    Print #1, "Dies ist ein Beispieltext."
    Close #1
End Sub

In diesem Beispiel wird eine einfache Textdatei erstellt, die einen statischen Text enthält.


Tipps für Profis

  • Fehlerbehandlung einfügen: Verwende On Error Resume Next, um Laufzeitfehler abzufangen und zu behandeln, bevor sie das Makro zum Absturz bringen.

  • Dynamische Pfade: Nutze ThisWorkbook.Path, um den Pfad dynamisch zum Speicherort der Arbeitsmappe zu machen.

  • Schleifen optimieren: Achte darauf, dass Schleifen so effizient wie möglich sind, um die Ausführungszeit zu verkürzen, besonders bei großen Datenmengen.


FAQ: Häufige Fragen

1. Wie kann ich die Codierung der Textdatei ändern? Du kannst die Codierung anpassen, indem Du die ADODB.Stream-Methode verwendest, wie im Abschnitt "Alternative Methoden" beschrieben.

2. Kann ich den Code anpassen, um nur bestimmte Spalten zu exportieren? Ja, passe einfach die Print-Anweisung im Code an, um nur die benötigten Spalten auszugeben.

3. Was mache ich, wenn ich eine große Anzahl von Zeilen habe? Stelle sicher, dass Du das Makro effizient schreibst und eventuell die Application.ScreenUpdating-Eigenschaft auf False setzt, um die Leistung zu verbessern.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige