thomasschwenningen

Excel Makro. Alle Dateien in einem Ordner sollen bearbeiten werden

Guten morgen zusammen,
ich brauche bitte Hilfe und ich bin Sicher es ist ganz einfach face-smile

Folgendes:
Ich habe in einem Ordner ca. 200 .csv Dateien.
Ich brauche bitte von jeder .csv Datei immer nur die ersten 100 Zeilen kopiert.

Ich habe diese Makro erstellt,
Wie muss ich das Makro ändern, damit bei allen .csv Dateien im Ordner, nur die ersten 100 Zeilen kopiert werden.

Vielen Dank für alle Tipps.
Gerne auch Links zu den Lösungen face-smile

Gruß

Thomas aus dem verschneiten Schwenningen.


Sub Makro1()
'  
' Makro1 Makro  
'  

'  
    With ActiveSheet.QueryTables.Add(Connection:= _
        "TEXT;C:\Users\PC\Downloads\Arbeiten\1.csv", Destination:=Range _  
        ("$A$1"))  
        .Name = "1"  
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = 65001
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = False
        .TextFileTabDelimiter = True
        .TextFileSemicolonDelimiter = False
        .TextFileCommaDelimiter = True
        .TextFileSpaceDelimiter = False
        .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, _
        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
    End With
    Rows("1:100").Select  
    Selection.Cut
    Sheets("Tabelle2").Select  
    ActiveWorkbook.SaveAs Filename:="C:\Users\PC\Documents\1.csv", FileFormat:= _  
        xlCSV, CreateBackup:=False
End Sub
Auf Facebook teilen
Auf X (Twitter) teilen
Auf Reddit teilen
Auf Linkedin teilen

Content-ID: 2379257813

Url: https://administrator.de/forum/excel-makro-alle-dateien-in-einem-ordner-sollen-bearbeiten-werden-2379257813.html

Ausgedruckt am: 08.07.2025 um 02:07 Uhr

DivideByZero
DivideByZero 02.04.2022 um 12:41:26 Uhr
Hallo Thomas,

wenn ich das richtig verstehe, willst Du aus reinen Textdateien (CSV) jeweils die ersten 100 Zeilen einlesen und in einer gleichnamigen Textdatei in einem anderen Ordner speichern. Dazu jedes Mal eine Excel-Instanz zu starten, ist wohl etwas oversized. Das ist eine Aufgabe für eine Skript- oder Programmiersprache. Powershell natürlich (siehe weitergehend z.B. blog.stefanrehwald.de/2013/03/05/powershell-04-textdatei-auslese ...).

Oder eine Programmiersprache. Ich setze für so etwas gerne GFA-BASIC 32 ein (gfabasic32.blogspot.com/p/download.html), weil es klein, schnell und portabel, der Code zudem gut zu lesen ist:

Beispiel:

Local i%, a$, FName$
Local InDir$ = App.Path + "\"  
Local OutDir$ = App.Path & "\out\"  

FName$ = Dir(InDir$ + "*.csv", $16)  
While Len(FName$)
  Open FName$ for Input As # 1
  Open OutDir$ & FName$ for Output As # 2
  For i% = 1 To 100
    Line Input # 1, a$
    Print # 2, a$
  Next
  Close # 1
  Close # 2
  FName$ = Dir$
Wend

Durchsucht das Verzeichnis InDir$ nach allen CSV-Dateien, öffnet diese, liest die ersten 100 Zeilen ein, öffnet zum Schreiben eine gleichnamige CSV-Datei im OutDir$ und schreibt die 100 Zeilen dort hinein.

Schönes Wochenende,

DivideByZero
ThomasSchwenningen
ThomasSchwenningen 02.04.2022 um 14:13:44 Uhr
Hallo DivideByZero,
vielen Dank für deine Hilfe face-smile
Ich habe das Programm heruntergeladen, installiert und deine Beschreibung eingebaut.

Funktioniert sehr gut face-smile
Leider werden Nur 7 .csv von Aktuell 161 csv Dateien bearbeitet und in den Ordner /out/ kopiert?

Hast du mir bitte eine kleine Hillfe, wie alle .csv Dateien bearbeitet werden.

Nachdem ich auf den Grünen Pfeil geklickt habe, bekomme ich diese Meldung.

Vielen Dank.


Gruß

Thomas
csvsplitter
wiesi200
wiesi200 02.04.2022 um 14:27:05 Uhr
Hallo,
schaut so aus als gibt es Dateien die weniger als 100 Zeilen haben und somit deine "Aufgabe" nicht erfüllt werden kann.

Somit muss du dir Gedanken machen was passieren soll und über das Script erst mal überprüfen wie viele Zeilen enthalten sind.
ThomasSchwenningen
ThomasSchwenningen 02.04.2022 um 14:32:34 Uhr
Hallo wiesi200,
vielen Dank für deine Hillfe.
Ich kenne mich leider zu wenig aus.

Wenn eine Datei, weniger als 100 Zeilen hat, dann bitte die .csv Datei auch kopieren.
Auch wenn Sie weniger als 100 Zeillen hat face-smile

Wie muss der Code dann geändert werden?

Vielen Dank
1915348599
Lösung 1915348599 02.04.2022 aktualisiert um 18:23:01 Uhr
Ich würde ja gleich die PowerShell dafür hernehmen, da reicht für diese Lachnummer ein Einzeiler (Ein- und Ausgabepfad anpassen)
Get-ChildItem "d:\ordner" -file -filter *.csv | %{Get-Content $_.Fullname -Head 100} | Set-Content "d:\merged.csv"  
Feddisch.
DivideByZero
Lösung DivideByZero 03.04.2022 um 10:25:56 Uhr
Guten Morgen Thomas,

da dürfte Basic vermutlich besser sein als PowerShell, denn wenn Du etwas lernen willst, sollte es möglich sein, diesen Code anzupassen und zu verstehen. Wie @wiesi200 richtig sagt, liegt es daran, dass Du die Aufgabe so gestellt hattest, dass ausnahmslos 100 Zeilen kopiert werden. Jetzt also die ersten bis zu 100 Zeilen (maximal 100, weniger, wenn es nicht 100 Zeilen sind):

Local i%, a$, FName$
Local InDir$ = App.Path + "\"  
Local OutDir$ = App.Path & "\out\"  
FName$ = Dir(InDir$ + "*.csv", $16)  
While Len(FName$)
  Open FName$ for Input As # 1
  Open OutDir$ & FName$ for Output As # 2
  i% = 0
  While Not (EOF(# 1) Or i% = 100)
    Line Input # 1, a$
    Inc i%
    Print # 2, a$
  Wend
  Close # 1
  Close # 2
  FName$ = Dir$
Wend

Was ist anders? Der Code liest entweder die Datei bis zum Ende (Test auf EOF = End Of File), oder er stoppt schon vorher, wenn i%=100. i% startet bei jeder Datei mit 0, wird dann nach dem Einlesen jeder Zeile in der Quelldatei um 1 erhöht (Inc i%).

Der Powershell-Einzeiler von @1915348599 ist natürlich deutlich kompakter und damit eleganter, aber für Einsteiger schwieriger zu verstehen (er fasst im Grunde die Programmlogik aus dem Basic-Code in einer Zeile zusammen). Die Einzelschritte des Basic-Codes sind ein guter Einstieg für Eigenexperimente.

Gruß

DivideByZero