AW: Datei sortieren, formatieren, umwandeln
25.05.2007 21:09:00
fcs
Hallo Marco,
hier der Code für de beiden Makro-Varianten, die alle CSV-Dateien eines Verzeichnisse mit dem vorgegebenen Spaltenaufbau in eine Excel-Datei umwandeln.
Die beiden Makros kopierst du der Übersichtlichkeit wegen einfach in ein neues Modul in der Steuerungsdatei.
Danach legst du dir 2 zusätzliche Buttons (aus der Symbolleiste "Steuerelement - Tolbox") im Tabellenblatt an und erstelltst anlog den vorhandenen Buttons im VBA-Code des Tabellenblatts 2 Prozeduren die die neuen Makros starten.
Du kannst dann wahlweise die beiden Varinten benutzen. Für die 2. Variante muss du nur das Verzeichnis auswählen und ggf. die Groß-/Kleinschreibung für "CSV" einstellen.
Gruß
Franz
Sub XLS_aus_CSV_Alle()
'Erzeugt aus Daten in allen CSV-Dateien eines Verzeichnisses jeweils eine Excel-Datei
'Datensatzaufbau in CSV-Datei
'Datum Uhrzeit,Wert1,Wert2;;;;
'2004-05-26 12:44:50.178000,-3.2958979606628418,8392705;;;;
'2004-05-27 13:00:50.179000,-3.3569331169128418,8392705;;;;
Dim wbThis As Workbook, wbCSV As String, wbZiel As Workbook
Dim wksSteuer As Worksheet, wksZiel As Worksheet
Dim PfadCSV$, PfadXLS$, DateiCSV, NameCSV$, ExtCSV$, ExtXLS$
Dim Zeile As Long, Zeile1 As Long, Text$
Dim Datum As Double, strDatum$, strWert1$, Wert1 As Double, strWert2$, Wert2 As Double
' Basisdaten setzen/einlesen
Set wbThis = ThisWorkbook
Set wksSteuer = wbThis.Worksheets("Steuerung")
With wksSteuer
PfadCSV$ = .Cells(11, 4)
PfadXLS$ = .Cells(12, 4)
ExtCSV$ = .Cells(14, 6)
ExtXLS$ = .Cells(15, 6)
Zeile1 = .Cells(21, 4) 'Startzeile für das Eintragen der Daten im Blatt Muster
End With
'Daten aus CSV-Dateien in XLS-Dateien überführen
DateiCSV = Dir(PfadCSV$ & "\*." & ExtCSV$)
Do Until DateiCSV = ""
'Neue XLS-Datei auf Basis Blatt "Muster" anlegen
wbThis.Sheets("Muster").Copy
Set wbZiel = ActiveWorkbook
Set wksZiel = wbZiel.Worksheets(1)
'Blatt Muster umbenennen
NameCSV = Left(DateiCSV, Len(DateiCSV) - 4)
wksZiel.Name = NameCSV
'CSV-Datei zum einlesen vorbereiten
Open PfadCSV$ & "\" & DateiCSV For Input As #1
'Startzeile für Zieltabelle setzen
Zeile = Zeile1
'Daten Zeilenweise einlesen, Werte ermitteln und übertragen
Do Until EOF(1)
Line Input #1, Text$
'Datum auslesen und in Dezimalzahl verwandeln
'Datums-/Zeitformat in Mustertabelle einstellen!!!
If Text "" Then
Pos1 = InStr(1, Text$, ",")
strDatum$ = WorksheetFunction.Substitute(Left(Text, Pos1 - 1), ".", ",")
Datum = CDbl(CDate(Left(strDatum$, 10)) + CDate(Mid(strDatum$, 12, 8))) _
+ CDbl(Mid(strDatum$, 20)) / 24 / 60 / 60
'1. Wert auslesen
Pos2 = InStr(Pos1 + 1, Text$, ",")
strWert1$ = Mid(Text$, Pos1 + 1, Pos2 - Pos1 - 1)
Wert1 = CDbl(Application.WorksheetFunction.Substitute(strWert1$, ".", ","))
'2. Wert auslesen
Pos3 = InStr(Pos2 + 1, Text$, ";")
If Pos3 = 0 Then
strWert2$ = Mid(Text$, Pos2 + 1)
Else
strWert2$ = Mid(Text$, Pos2 + 1, Pos3 - Pos2 - 1)
End If
Wert2 = CDbl(Application.WorksheetFunction.Substitute(strWert2$, ".", ","))
'Werte in Tabelle eintragen
wksZiel.Cells(Zeile, 1) = Datum
wksZiel.Cells(Zeile, 2) = Wert1
wksZiel.Cells(Zeile, 3) = Wert2
'Zeilenzähler erhöhen
Zeile = Zeile + 1
End If
Loop
Close #1
'Daten nach der 1. Spalte (Datum/Uhrzeit) sortieren
With wksZiel
.Range(.Cells(Zeile1, 1), .Cells(.Rows.Count, 3).End(xlUp)).Sort _
Key1:=.Cells(Zeile1, 1), Order1:=xlAscending, Header:=xlNo
End With
wbZiel.SaveAs FileName:=PfadXLS$ & "\" & NameCSV & "." & ExtXLS
wbZiel.Close savechanges:=False
DateiCSV = Dir
Loop
End Sub
Sub XLS_aus_CSV_Alle_Variante()
'Erzeugt aus Daten in allen "sauberen" CSV-Dateien eines Verzeichnisses jeweils eine Excel- _
Datei
'Datensatzaufbau in CSV-Datei
'Datum Uhrzeit,Wert1,Wert2
'2004-05-26 12:44:50.178000,-3.2958979606628418,8392705
'2004-05-27 13:00:50.179000,-3.3569331169128418,8392705
Dim wbThis As Workbook, wbCSV As String, wbZiel As Workbook
Dim wksSteuer As Worksheet, wksZiel As Worksheet
Dim PfadCSV$, PfadXLS$, DateiCSV, NameCSV$, ExtCSV$, ExtXLS$
Dim Zeile As Long, Zeile1 As Long, Text$
Dim Datum As Double, strDatum$, Wert1 As Double, Wert2 As Double
' Basisdaten setzen/einlesen
Set wbThis = ThisWorkbook
Set wksSteuer = wbThis.Worksheets("Steuerung")
With wksSteuer
PfadCSV$ = .Cells(11, 4)
PfadXLS$ = .Cells(12, 4)
ExtCSV$ = .Cells(14, 6)
ExtXLS$ = .Cells(15, 6)
Zeile1 = .Cells(21, 4) 'Startzeile für das Eintragen der Daten im Blatt Muster
End With
'Daten aus CSV-Dateien in XLS-Dateien überführen
DateiCSV = Dir(PfadCSV$ & "\*." & ExtCSV$)
Do Until DateiCSV = ""
'Neue XLS-Datei auf Basis Blatt "Muster" anlegen
wbThis.Sheets("Muster").Copy
Set wbZiel = ActiveWorkbook
Set wksZiel = wbZiel.Worksheets(1)
'Blatt Muster umbenennen
NameCSV = Left(DateiCSV, Len(DateiCSV) - 4)
wksZiel.Name = NameCSV
'CSV-Datei zum einlesen vorbereiten
Open PfadCSV$ & "\" & DateiCSV For Input As #1
'Startzeile für Zieltabelle setzen
Zeile = Zeile1
'Daten Zeilenweise einlesen, Werte ermitteln und übertragen
Do Until EOF(1)
Input #1, strDatum, Wert1, Wert2
'Datum auslesen und in Dezimalzahl verwandeln
'Datums-/Zeitformat in Mustertabelle einstellen!!!
If strDatum "" Then
strDatum = WorksheetFunction.Substitute(strDatum, ".", ",")
Datum = CDbl(CDate(Left(strDatum, 10)) + CDate(Mid(strDatum, 12, 8))) _
+ CDbl(Mid(strDatum, 20)) / 24 / 60 / 60
'Werte in Tabelle eintragen
wksZiel.Cells(Zeile, 1) = Datum
wksZiel.Cells(Zeile, 2) = Wert1
wksZiel.Cells(Zeile, 3) = Wert2
'Zeilenzähler erhöhen
Zeile = Zeile + 1
End If
Loop
Close #1
'Daten nach der 1. Spalte (Datum/Uhrzeit) sortieren
With wksZiel
.Range(.Cells(Zeile1, 1), .Cells(.Rows.Count, 3).End(xlUp)).Sort _
Key1:=.Cells(Zeile1, 1), Order1:=xlAscending, Header:=xlNo
End With
wbZiel.SaveAs FileName:=PfadXLS$ & "\" & NameCSV & "." & ExtXLS
wbZiel.Close savechanges:=False
DateiCSV = Dir
Loop
End Sub