Große CSV-Daten in kleine Stückeln per Makro
Hallo,
ich habe mit größeren Excel-CSV Daten zu kämpfen. Meine Files haben meist über 1 Mio Datenzeilen, somit von Excel nicht zu verarbeiten.
Über das folgende Makro, hat man es geschafft, die Datei einzulesen und auf eine X-Zeilenanzahl und mehreren Tabellen zu verteilen.
Ich habe jetzt NUR 2 Probleme noch, ich möchte....
1.) Angeben können, wieviele Header-Zeilen immer je Tabellenblatt oben vorweg eingefügt werden (brauche den Kopf der Quelldatei).
2.) am Schluß, alle Tabellenblätter auf einzelne CSV-Dateien exportieren (Makro gefunden, nur wie einbinden?).
Hier mal der Code, hier fehlt noch der Befehl, dass X-Zeilen vom Kopf je Tabellenblatt eingefügt werden am Anfang:
Hier das Makro, das eingebunden werden muss, damit automatisch auch gestückelt / exportiert wird:
VIELEN Dank im voraus!
ich habe mit größeren Excel-CSV Daten zu kämpfen. Meine Files haben meist über 1 Mio Datenzeilen, somit von Excel nicht zu verarbeiten.
Über das folgende Makro, hat man es geschafft, die Datei einzulesen und auf eine X-Zeilenanzahl und mehreren Tabellen zu verteilen.
Ich habe jetzt NUR 2 Probleme noch, ich möchte....
1.) Angeben können, wieviele Header-Zeilen immer je Tabellenblatt oben vorweg eingefügt werden (brauche den Kopf der Quelldatei).
2.) am Schluß, alle Tabellenblätter auf einzelne CSV-Dateien exportieren (Makro gefunden, nur wie einbinden?).
Hier mal der Code, hier fehlt noch der Befehl, dass X-Zeilen vom Kopf je Tabellenblatt eingefügt werden am Anfang:
Option Explicit
Option Base 1
Sub LargeFileImport()
Dim FileName As String
Dim FileNum As Integer
Dim ResultStr As String
Dim wsSheet As Worksheet
Dim strValues() As String
Dim lngRows As Long
Dim lngRow As Long
Dim intSheet As Integer
Dim Eingabe As String
Dim SollRows As String
Dim NeuRows As String
Dim CopyRows As String
Dim InsertRows As String
'*************************************************************************************
' Abfrage von maximalen Datenzeilen je Tabellenblatt
'*************************************************************************************
SollRows = InputBox("Bitte geben Sie die maximale Zeilenanzahl ein:", "Maximale Zeilenanzahl")
If SollRows = "" Then Exit Sub
If IsNumeric(SollRows) Then
NeuRows = SollRows
Else
If MsgBox("Sie haben keine Zahl eingeben!", vbOKOnly, "Maximale Zeilenanzahl") = vbOK Then
Exit Sub
End If
End If
If MsgBox("Sie haben eine maximale Zeilenanzahl angegeben von: " & NeuRows, vbOKCancel, "Maximale Zeilenanzahl") = vbCancel Then
Exit Sub
End If
'*************************************************************************************
' Abfrage wieviele Datenzeilen als Header an Tabellenblatt-Anfang kopiert werden sollen
'*************************************************************************************
CopyRows = InputBox("Bitte geben Sie die Zeilenanzahl für den zu kopierenden Spaltenkopf ein:", "Zeilenanzahl für Spaltenkopf")
If CopyRows = "" Then Exit Sub
If IsNumeric(CopyRows) Then
InsertRows = CopyRows
Else
If MsgBox("Sie haben keine Zahl eingeben!", vbOKOnly, "Zeilenanzahl für Spaltenkopf") = vbOK Then
Exit Sub
End If
End If
If MsgBox("Sie haben eine Zeilenanzahl für den zu kopierenden Spaltenkopf angegeben von: " & NeuRows, vbOKCancel, "Zeilenanzahl für Spaltenkopf") = vbCancel Then
Exit Sub
End If
'*************************************************************************************
' Ende aller Abfragen
'*************************************************************************************
FileName = Application.GetOpenFilename("Textdateien " & _
"(*.txt; *.csv;*.asc),*.txt; *.csv; *.asc")
If FileName = "" Or FileName = "Falsch" Then Exit Sub
FileNum = FreeFile()
On Error GoTo ErrorHandler
Open FileName For Input As #FileNum
Application.ScreenUpdating = False
Workbooks.Add template:=xlWorksheet
lngRows = NeuRows
lngRow = 1
intSheet = 1
ReDim strValues(lngRows, 1)
Application.StatusBar = " Einlesen Blatt " & intSheet & " / 0 %"
Do While Seek(FileNum) <= LOF(FileNum)
Line Input #FileNum, ResultStr
If Left(ResultStr, 1) = "=" Then
strValues(lngRow, 1) = "'" & ResultStr
Else
strValues(lngRow, 1) = ResultStr
End If
If lngRow < lngRows Then
lngRow = lngRow + 1
If (lngRow * 100 / lngRows) Mod 10 = 0 Then
Application.StatusBar = " Einlesen Blatt " & intSheet & _
" / " & Int(lngRow * 100 / lngRows) & " %"
End If
Else
Application.StatusBar = " Schreibe Daten in Blatt " & intSheet
ActiveSheet.Range("A1:A" & lngRows) = strValues
ActiveWorkbook.Worksheets.Add after:=Worksheets(Worksheets.Count)
ReDim strValues(lngRows, 1)
lngRow = 1
intSheet = intSheet + 1
Application.StatusBar = "Einlesen Blatt " & intSheet
End If
Loop
Close
ActiveSheet.Range("A1:A" & lngRows) = strValues
'*************************************************************************************
' Beginn der Aufteilung in Spalten
'*************************************************************************************
Dim strDelimiter As String
Do
strDelimiter = Application.InputBox("1 ==> Tabulator " & Chr(13) & _
"2 ==> Semikolon" & Chr(13) & _
"3 ==> Komma" & Chr(13) & _
"4 ==> Leerzeichen" & Chr(13) & _
"5 ==> Andere" & Chr(13) & _
"Trennzeichen wählen", "1", Type:=1)
Loop Until CInt(strDelimiter) >= 0 And CInt(strDelimiter) <= 5
If strDelimiter = 5 Then
Dim strDelimOther As String
strDelimOther = Application.InputBox("Bitte das verwendete Trennzeichen " _
& "eingeben" & Chr(13) & _
"00 ==> Abbruch ", _
"Trennzeichen wählen", Type:=2)
If strDelimOther = "00" Then GoTo ErrorHandler
End If
intSheet = 0
For Each wsSheet In ActiveWorkbook.Worksheets
intSheet = intSheet + 1
Application.StatusBar = "Bearbeiten von Blatt " & intSheet
With wsSheet
.Range("A:A").TextToColumns Destination:=.Range("A1"), _
DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, _
ConsecutiveDelimiter:=False, _
Tab:=IIf(strDelimiter = "1", True, False), _
Semicolon:=IIf(strDelimiter = "2", True, False), _
Comma:=IIf(strDelimiter = "3", True, False), _
Space:=IIf(strDelimiter = "4", True, False), _
Other:=IIf(strDelimiter = "5", True, False), _
OtherChar:=IIf(strDelimiter = "5", strDelimOther, "")
End With
Next wsSheet
ErrorHandler:
Application.ScreenUpdating = True
Application.StatusBar = "Fertig"
End Sub
Hier das Makro, das eingebunden werden muss, damit automatisch auch gestückelt / exportiert wird:
Sub splitten_als_csv()
Dim I_Sheets As Integer
Dim F_Name As String
Dim F_Path As String
F_Path = Application.InputBox("Pfad angeben")
For I_Sheets = 1 To Sheets.Count
F_Name = F_Path + Sheets(I_Sheets).Name + ".csv"
Sheets(I_Sheets).SaveAs Filename:=F_Name, FileFormat:= _
xlCSV, CreateBackup:=False
Next I_Sheets
End Sub
VIELEN Dank im voraus!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 182306
Url: https://administrator.de/forum/grosse-csv-daten-in-kleine-stueckeln-per-makro-182306.html
Ausgedruckt am: 23.04.2025 um 01:04 Uhr
1 Kommentar
Moin scax2012,
wenn ich das Ganze richtig verstanden habe, so soll auf jedem Blatt der gleiche Kopf stehen, dessen Zeilenzahl am Anfang abgefragt wird?
Wenn ja, dann evtl. so:
- Blatt 1 (nur?) mit Kopf füllen, für alle anderen Blätter:
- In Zeile 68: lngRow = InsertRows + 1
- In Zeile 90: Sheets(1).Range("A1:IV" & InsertRows) kopieren nach Sheets(xx).Range("A1:IV" & InsertRows)
Das Einlesen neuer Werte dann ab Zeile InsertRows +1.
Das Exportmakro kannst Du doch extra stehenlassen und per 'Call splitten_als_csv' aus dem ersten Makro rufen.
[Edit] Wäre es eine Option, die originale csv-Datei in der Befehlszeile in Excel-gerechte Happen zu zerlegen (65536 oder ab xl2007 in 1.048.576 Zeilen) [/Edit]
Freundliche Grüße von der Insel - Mario
wenn ich das Ganze richtig verstanden habe, so soll auf jedem Blatt der gleiche Kopf stehen, dessen Zeilenzahl am Anfang abgefragt wird?
Wenn ja, dann evtl. so:
- Blatt 1 (nur?) mit Kopf füllen, für alle anderen Blätter:
- In Zeile 68: lngRow = InsertRows + 1
- In Zeile 90: Sheets(1).Range("A1:IV" & InsertRows) kopieren nach Sheets(xx).Range("A1:IV" & InsertRows)
Das Einlesen neuer Werte dann ab Zeile InsertRows +1.
Das Exportmakro kannst Du doch extra stehenlassen und per 'Call splitten_als_csv' aus dem ersten Makro rufen.
[Edit] Wäre es eine Option, die originale csv-Datei in der Befehlszeile in Excel-gerechte Happen zu zerlegen (65536 oder ab xl2007 in 1.048.576 Zeilen) [/Edit]
Freundliche Grüße von der Insel - Mario