plausibell
Goto Top

CSV Dateien zusammen führen und neu abspeichern

Hallo Zusammen,

ich bin neu hier und bitte deshalb bei möglichen Fehlern Nachsicht walten zu lassen.

Ich würde gerne ein VBA Makro für Excel schreiben, dass aus einem Ordner, den ich am Anfang auswählen muss, alle CSV-Dateien einliest, sie in eine neue CSV-Datei untereinander schreibt und diese dann in den am Anfang ausgewählten Ordner abspeichert. Dabei soll der Name der neuen CSV-Datei auch variabel sein bzw. der Name des Ordners, in dem die Dateien liegen soll Teil des Namens sein.

Aktuell habe ich ein Makro das wie folgt aussieht:

Sub zusammenfuegen()
    Dim strDateiname As String
    Dim loLetzte1 As Long
    Dim loLetzte2 As Long
    Dim inLetzte As Integer
    Dim x As Integer
    Dim StartPaste As Integer
    StartPaste = 0
    x = 1
    
    With Application.FileDialog(msoFileDialogFolderPicker)
     
        .AllowMultiSelect = False
        .Title = "Bitte Ordner wählen"  
        .InitialFileName = ""  
        .InitialView = msoFileDialogViewThumbnail
        .ButtonName = "OK"  
     
        If .Show = -1 Then
            GetExcelFolder = .SelectedItems(1)
            'MsgBox GetExcelfolder  
        End If
    
    End With
    
    Application.ScreenUpdating = False
    'strDateiname = Dir(ThisWorkbook.Path & "\*.csv")  
    strPath = Dir(GetExcelFolder)
    strDateiname = Dir(GetExcelFolder & "\*.csv")  
    With ThisWorkbook.Worksheets("Tabelle1")  
        Do While strDateiname <> ""  
            If strDateiname <> ThisWorkbook.Name Then
                'Workbooks.Open Filename:=ThisWorkbook.Path & "\" & strDateiname  
                Workbooks.Open Filename:=GetExcelFolder & "\" & strDateiname  
                loLetzte1 = .UsedRange.SpecialCells(xlCellTypeLastCell).Row
                loLetzte2 = ActiveWorkbook.ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row
                inLetzte = ActiveWorkbook.ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Column
                    If x = 1 Then
                    StartCell = 1
                    StartPaste = 0
                    Else
                    StartCell = 3
                    StartPaste = 1
                    End If
                x = x + 1
                ActiveWorkbook.ActiveSheet.Range(Cells(StartCell, 1), Cells(loLetzte2, inLetzte)).Copy Destination:=.Cells(loLetzte1 + StartPaste, 1)
                ActiveWorkbook.Close True
            End If
            strDateiname = Dir
        Loop
    End With
        
    Application.ScreenUpdating = True
End Sub

Das schreibt die nötigen Sachen alle in der aktuellen Tabelle zusammen, aber speichert es nicht automatisch.
Zudem wäre es wünschenswert, wenn ich das Makro beliebig oft hintereinander ausführen könnte, ohne es jedes Mal neu öffnen zu müssen.

Ich hoffe ich konnte mein Anliegen halbwegs klar formulieren, bei noch offenen Fragen bitte einfach fragen!

Danke schon mal für die Hilfe!

Gruß
Plau

Content-Key: 4322809694

Url: https://administrator.de/contentid/4322809694

Printed on: May 8, 2024 at 16:05 o'clock

Mitglied: 4091525239
4091525239 Oct 18, 2022 updated at 12:35:25 (UTC)
Goto Top
Moinsens.
aber speichert es nicht automatisch.
Workbook.Save Methode
Zudem wäre es wünschenswert, wenn ich das Makro beliebig oft hintereinander ausführen könnte, ohne es jedes Mal neu öffnen zu müssen.
Jetzt rate drei mal was das hier im Code wohl macht ...
ActiveWorkbook.Close True
Genau das

Bringst du das logisch zusammen schaffst du das Gewünschte mit diesen Hinweisen nun auch selbst face-wink.

Erste Devise, copy n paste code Zeile für Zeile verstehen und in der Doku nachschlagen dann klappts anschließend auch mit der Nachba... ähh der Ergänzung face-wink

p.
Member: TwistedAir
TwistedAir Oct 18, 2022 at 14:24:33 (UTC)
Goto Top
Hallo,

es sind ja CSV- also Textdateien: ein simples
copy \dir\*.csv \dir\file_new.csv
reicht dir nicht?

Gruß
TA
Member: PlauSiBell
PlauSiBell Oct 18, 2022 at 15:09:16 (UTC)
Goto Top
Zitat von @4091525239:

Moinsens.
aber speichert es nicht automatisch.
Workbook.Save Methode
Zudem wäre es wünschenswert, wenn ich das Makro beliebig oft hintereinander ausführen könnte, ohne es jedes Mal neu öffnen zu müssen.
Jetzt rate drei mal was das hier im Code wohl macht ...
ActiveWorkbook.Close True
Genau das

Bringst du das logisch zusammen schaffst du das Gewünschte mit diesen Hinweisen nun auch selbst face-wink.

Erste Devise, copy n paste code Zeile für Zeile verstehen und in der Doku nachschlagen dann klappts anschließend auch mit der Nachba... ähh der Ergänzung face-wink

p.

Erstmal danke für deine Antwort face-smile es ist so gesehen kein "copy n paste code", ich hab den von meinem Vorgesetzten bekommen und sollte ihn entsprechend erweitern/ändern... nichts desto trotz hast du natürlich recht, dass verstehen der erste Schritt ist

Das mit dem Workbook.save hat mir tatsächlich geholfen, ich habe es als "ActiveWorkbook.SaveCopyAs (GetExcelFolder & ".csv")" eingebaut um eine Kopie der erstellten Tabelle zu erstellen. Dabei speichert er es zwar mit .csv als Endung, allerdings bekomme ich beim Öffnen dann die Warnung, dass die Dateiformat und die -endung nicht zusammen passen, kann ich das irgendwie anders lösen?
Und kann man bei der Methode auch den Speicherort ändern? Aktuell speichert er die neue Datei in den Ordner, in dem das Makro liegt, er soll sie aber in den Ordner packen, aus dem er die Daten vorher gelesen hat.


Zitat von @TwistedAir:

Hallo,

es sind ja CSV- also Textdateien: ein simples
copy \dir\*.csv \dir\file_new.csv
reicht dir nicht?

Gruß
TA

Ich weiß leider nicht genau was du meinst, dein Code liest sich für mich (als Laie) so, als würdest du einfach eine Kopie von der Ursprungs csv erstellen. Es sollen aber ja mehrere csv zusammen gefasst werden.
Wenn ich das falsch verstanden habe, kannst du es dann vielleicht nochmal erklären? face-smile

Danke auf jeden Fall schonmal für eure Antworten!

Gruß
Plau
Mitglied: 4091525239
4091525239 Oct 18, 2022 updated at 15:27:42 (UTC)
Goto Top
Zitat von @PlauSiBell:
Das mit dem Workbook.save hat mir tatsächlich geholfen, ich habe es als "ActiveWorkbook.SaveCopyAs (GetExcelFolder & ".csv")" eingebaut um eine Kopie der erstellten Tabelle zu erstellen. Dabei speichert er es zwar mit .csv als Endung, allerdings bekomme ich beim Öffnen dann die Warnung, dass die Dateiformat und die -endung nicht zusammen passen, kann ich das irgendwie anders lösen?
Ja, benutze die SaveAs Methode mit dem passenden Parameter FileFormat
https://learn.microsoft.com/de-de/office/vba/api/excel.workbook.saveas
ActiveWorkbook.SaveAs "D:\Ordner\datei.csv", xlCSVWindows  
Member: TwistedAir
TwistedAir Oct 18, 2022 at 15:53:41 (UTC)
Goto Top
Zitat von @PlauSiBell:

es sind ja CSV- also Textdateien: ein simples
copy \dir\*.csv \dir\file_new.csv
reicht dir nicht?

Ich weiß leider nicht genau was du meinst, dein Code liest sich für mich (als Laie) so, als würdest du einfach eine Kopie von der Ursprungs csv erstellen. Es sollen aber ja mehrere csv zusammen gefasst werden.
Wenn ich das falsch verstanden habe, kannst du es dann vielleicht nochmal erklären? face-smile

Hi,

die Idee, die dahintersteckt (jetzt mal von dem ganzen Excel-Overhead weg) ist, zwei oder mehrere Textdateien mit dem "copy"-Befehl auf der Kommandozeile zusammenzuführen. Die Randbedingung ist, dass in deinem Fall beide CSV-Dateien die gleiche Anzahl an Spalten haben und das Trennzeichen das gleiche ist.

Der copy-Befehl anhand von Beispielen etwas ausführlicher erklärt (Verzeichnisse zwecks Übersichtlichkeit weggelassen):
  • Kopie von file_a mit Namen file_b anlegen:
copy file_a file_b
  • Kopie von file_a und file_b in Datei file_c anlegen:
copy file_a + file_b file_c
Es sind selbstverständlich auch mehr als zwei Quelldateien möglich.
  • Kopie von allen Dateien ("*") mit der Endung .csv in Datei file_new.csv anlegen:
copy *.csv file_new.csv

Ich hoffe, so ist das etwas verständlicher? Natürlich kannst du das Ganze noch um Pfadangaben ergänzen oder mit Batch/Powershell noch Abfragen nach Dateinamen etc. drumherum basteln.

Grüße
TA