thomasschwenningen
Goto Top

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

Content-Key: 2379257813

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

Printed on: April 28, 2024 at 09:04 o'clock

Member: DivideByZero
DivideByZero Apr 02, 2022 at 10:41:26 (UTC)
Goto Top
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-auslesen-bearbeiten-anlegen-befullen/).

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
Member: ThomasSchwenningen
ThomasSchwenningen Apr 02, 2022 at 12:13:44 (UTC)
Goto Top
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
Member: wiesi200
wiesi200 Apr 02, 2022 at 12:27:05 (UTC)
Goto Top
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.
Member: ThomasSchwenningen
ThomasSchwenningen Apr 02, 2022 at 12:32:34 (UTC)
Goto Top
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
Mitglied: 1915348599
Solution 1915348599 Apr 02, 2022 updated at 16:23:01 (UTC)
Goto Top
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.
Member: DivideByZero
Solution DivideByZero Apr 03, 2022 at 08:25:56 (UTC)
Goto Top
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