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
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
Gruß
Thomas aus dem verschneiten Schwenningen.
ich brauche bitte Hilfe und ich bin Sicher es ist ganz einfach
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
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
Please also mark the comments that contributed to the solution of the article
Content-Key: 2379257813
Url: https://administrator.de/contentid/2379257813
Printed on: April 28, 2024 at 09:04 o'clock
6 Comments
Latest comment
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:
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
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
Ich würde ja gleich die PowerShell dafür hernehmen, da reicht für diese Lachnummer ein Einzeiler (Ein- und Ausgabepfad anpassen)
Feddisch.
Get-ChildItem "d:\ordner" -file -filter *.csv | %{Get-Content $_.Fullname -Head 100} | Set-Content "d:\merged.csv"
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):
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
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