Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: csv in xlsx via Makro

csv in xlsx via Makro
05.01.2016 11:52:06
Michael
Guten Tag Zusammen,
ich muss monatlich mehr als 400 csv-Dateien in das xlsx-Format umwandeln. Manuell mit Öffnen und im xlsx-Format abspeichern klappt das hervorragend, ist aber sicherlich nicht praktikabel.
Aus dem Internet habe ich mir folgendes Makro geholt:

Sub Convert_CSV_to_XLS_Punkte()
Dim OrdnerEin As String
Dim XL As Variant, FSO As Variant, Datei As Variant
OrdnerEin = "E:\Test"
Set XL = CreateObject("Excel.Application")
Set FSO = CreateObject("Scripting.FileSystemObject")
For Each Datei In FSO.GetFolder(OrdnerEin).Files
If LCase(FSO.GetExtensionName(Datei.Name)) = "csv" Then
XL.Workbooks.Open Datei.Path
XL.ActiveWorkbook.SaveAs OrdnerEin & "\" & FSO.GetBaseName(Datei.Name) & ".xlsx", 51, , , ,  _
False
XL.ActiveWorkbook.Close False
End If
Next
XL.Quit
Set XL = Nothing
Set FSO = Nothing
End Sub

Es werden auch xlsx-Dateien erzeugt, jedoch anstelle der Zahlenwerte steht in den Zellen: 00";"0, außerdem ist die Anordnung der Spalten anders.
Wer kann mir weiterhelfen?
Vielen Dank
Michael

Anzeige

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: csv in xlsx via Makro
05.01.2016 12:00:08
Rudi
Hallo,
aus meinem Archiv:
Sub aaaaa()
Dim sFile As String, sPath As String, iFree As Integer
Dim arrCSV, arrTmp, arrXLS(), i As Long, j As Integer, n As Long
sPath = "c:\temp\"  'anpassen
sFile = Dir(sPath & "*.csv")
Application.ScreenUpdating = False
Do While Len(sFile)
iFree = FreeFile
Open sPath & sFile For Input As iFree
arrCSV = Split(Input(LOF(iFree), iFree), vbCrLf)
Close iFree
For i = 0 To UBound(arrCSV)
arrTmp = Split(arrCSV(i), ";")
n = Application.Max(n, UBound(arrTmp))
Next
ReDim arrXLS(1 To UBound(arrCSV) + 1, 1 To n + 1)
For i = 0 To UBound(arrCSV)
arrTmp = Split(arrCSV(i), ";")
For j = 0 To UBound(arrTmp)
arrXLS(i + 1, j + 1) = arrTmp(j)
Next
Next
With Workbooks.Add
.Sheets(1).Cells(1, 1).Resize(UBound(arrXLS), UBound(arrXLS, 2)) = arrXLS
.SaveAs sPath & Left(sFile, Len(sFile) - 4), xlOpenXMLWorkbook
.Close
End With
sFile = Dir
Loop
End Sub

Gruß
Rudi

Anzeige
fast!
05.01.2016 12:05:59
Michael
Hallo Rudi,
das sieht schon super aus! Leider sind noch alle Zahlenwerte in ""!
Kriegt man das noch in den Griff?
Vielen Dank
Michael

AW: fast!
05.01.2016 12:18:02
Rudi
Hallo,
evtl. mit
arrXLS(i + 1, j + 1) = replace(arrTmp(j),"""","")
Gruß
Rudi

bleibt hängen
05.01.2016 12:27:39
Michael
Hallo Rudi,
nach der Änderung bleibt das Makro mit folgende Meldung:
Laufzeitfehler 1004
Anwendungs- oder objektorientierter Fehler
an der Stelle:
.Sheets(1).Cells(1, 1).Resize(UBound(arrXLS), UBound(arrXLS, 2)) = arrXLS
hängen!
Gruß
Michael

Anzeige
AW: bleibt hängen
05.01.2016 12:33:42
Rudi
Hallo,
dann lade mal eine CSV hoch.
Gruß
Rudi

funktioniert 1a. owT
05.01.2016 12:56:00
Rudi

Anzeige
liegt am Dummy
05.01.2016 13:20:49
Michael
Hallo Rudi,
das hat mich echt irritiert.
Ich habe mal eine Originaldatei geöffnet und ohne Änderungen sofort wieder als csv abgespeichert.
Die Meldung, dass nicht alle Dinge in eine csv-Datei abgespeichert werden können, habe ich bestätigt!
Danach läuft auch die Originaldatei im Makro durch!!
Leider kann ich Dir so ein Original aus Gründen des Datenschutz nicht zur Verfügung stellen.
Hast Du noch eine Idee?!
Gruß
Michael

Anzeige
AW: liegt am Dummy
05.01.2016 13:48:47
Rudi
Öffne eine csv mit Notepad und anonymisiere sie.

neuer Dummy
05.01.2016 14:07:15
Michael
Hallo Rudi,
anbei ein neuer Dummy:
https://www.herber.de/bbs/user/102590.zip
Das Datum ist in der xlsx-Datei ist unwichtig, muss also nicht zwingend in eine Zahl umgewandelt werden! Lediglich die Zahlenwerte in den Auswertungstabellen sind für weitere auswertungen wichtig.
Gruß
Michael

Anzeige
AW: neuer Dummy
05.01.2016 15:06:29
Rudi
Hallo,
ganz schön tricky.
Sub aaaaa()
Dim sFile As String, sPath As String, iFree As Integer
Dim arrCSV, arrTmp, arrXLS(), i As Long, j As Integer, n As Long
sPath = "c:\test\1\"  'anpassen
sFile = Dir(sPath & "*.csv")
Application.ScreenUpdating = False
Do While Len(sFile)
iFree = FreeFile
Open sPath & sFile For Input As iFree
arrCSV = Split(Input(LOF(iFree), iFree), vbCrLf)
Close iFree
For i = 0 To UBound(arrCSV)
arrCSV(i) = Replace(arrCSV(i), """", "")
arrTmp = Split(arrCSV(i), ";")
n = Application.Max(n, UBound(arrTmp))
Next
ReDim arrXLS(1 To UBound(arrCSV) + 1, 1 To n + 1)
For i = 0 To UBound(arrCSV)
arrTmp = Split(arrCSV(i), ";")
For j = 0 To UBound(arrTmp)
arrXLS(i + 1, j + 1) = Replace(arrTmp(j), "=", "")
If Not arrXLS(i + 1, j + 1) Like "##.##.####" Then
If IsNumeric(arrXLS(i + 1, j + 1)) Then
arrXLS(i + 1, j + 1) = arrXLS(i + 1, j + 1) * 1
End If
End If
Next
Next
With Workbooks.Add
.Sheets(1).Cells(1, 1).Resize(UBound(arrXLS), UBound(arrXLS, 2)) = arrXLS
.SaveAs sPath & Mid(sFile, 1, Len(sFile) - 4), xlOpenXMLWorkbook
.Close
End With
sFile = Dir
Loop
End Sub
Gruß
Rudi

Anzeige
SUPER, mit kleiner Rückfrage
05.01.2016 15:52:16
Michael
Hallo Rudi,
erstmal vielen Dank für die tolle Lösung und Deine Gedult mit mir.
Läuft mit allen Dateien durch und die Ergebnisse sind alle perfekt.
Lediglich wenn im Dateinamen ein Punkt verwendet wird, dann wird bei der erzeugten Datei kein .xlsx hinzugefügt.
Kann man diese Problem im Code lösen, oder musss ich dafür sorgen, dass die Punkte im Dateinamen generell unterbunden werden.
Herzlichen Dank und Gruß
Michael

Anzeige
AW: SUPER, mit kleiner Rückfrage
05.01.2016 15:58:48
Rudi
Hallo,
ja, der . stört immer bei der SaveAs-Methode, da alles dahinter als Endung angesehen wird.
Einfach raus schmeißen.
.SaveAs sPath & Replace(Mid(sFile, 1, Len(sFile) - 4), ".", ""), xlOpenXMLWorkbook
Gruß
Rudi

PERFEKT! 1000 Dank! owT
05.01.2016 16:25:57
Michael
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

CSV in XLSX umwandeln: Ein praktischer Leitfaden


Schritt-für-Schritt-Anleitung

Um eine CSV-Datei in das XLSX-Format umzuwandeln, kannst du ein VBA-Makro verwenden. Hier ist eine einfache Schritt-für-Schritt-Anleitung:

  1. Öffne Excel und drücke ALT + F11, um den VBA-Editor zu öffnen.

  2. Klicke auf Einfügen und dann auf Modul, um ein neues Modul zu erstellen.

  3. Kopiere den folgenden Code in das Modul:

    Sub Convert_CSV_to_XLS_Punkte()
       Dim OrdnerEin As String
       Dim XL As Variant, FSO As Variant, Datei As Variant
       OrdnerEin = "E:\Test" ' Passe den Pfad zu deinem Ordner an
       Set XL = CreateObject("Excel.Application")
       Set FSO = CreateObject("Scripting.FileSystemObject")
    
       For Each Datei In FSO.GetFolder(OrdnerEin).Files
           If LCase(FSO.GetExtensionName(Datei.Name)) = "csv" Then
               XL.Workbooks.Open Datei.Path
               XL.ActiveWorkbook.SaveAs OrdnerEin & "\" & FSO.GetBaseName(Datei.Name) & ".xlsx", 51, , , , False
               XL.ActiveWorkbook.Close False
           End If
       Next
       XL.Quit
       Set XL = Nothing
       Set FSO = Nothing
    End Sub
  4. Ändere den Pfad im Code (OrdnerEin) zu dem Ordner, in dem deine CSV-Dateien gespeichert sind.

  5. Führe das Makro mit F5 aus, um die Umwandlung zu starten.


Häufige Fehler und Lösungen

  • Fehler: Laufzeitfehler 1004
    Dieser Fehler tritt auf, wenn das Makro versucht, eine nicht vorhandene Zelle oder einen nicht geöffneten Arbeitsblattbereich zuzugreifen. Stelle sicher, dass die CSV-Datei korrekt geöffnet wurde und dass der Code die richtigen Referenzen hat.

  • Problem mit Zahlenwerten in Anführungszeichen
    Um die Zahlenwerte aus den Anführungszeichen zu entfernen, kannst du den Code anpassen:

    arrXLS(i + 1, j + 1) = Replace(arrTmp(j), """", "")

Alternative Methoden

Neben VBA gibt es auch andere Methoden, um eine CSV-Datei in XLSX umzuwandeln:

  1. Manuelle Methode:

    • Öffne die CSV-Datei in Excel und speichere sie über Datei > Speichern unter im XLSX-Format.
  2. Online-Konverter:

    • Es gibt zahlreiche Online-Tools, die CSV-Dateien in XLSX umwandeln können. Suche nach "csv to xlsx converter", um eine passende Lösung zu finden.

Praktische Beispiele

Hier ist ein Beispiel, wie du eine CSV-Datei mit Zahlenwerten in das XLSX-Format umwandeln kannst:

Sub Convert_CSV_to_XLS()
    Dim sFile As String, sPath As String
    sPath = "C:\Dein\Pfad\" ' Passe den Pfad an
    sFile = Dir(sPath & "*.csv")

    Do While Len(sFile)
        With Workbooks.Add
            .Sheets(1).Cells.TextToColumns Destination:=.Sheets(1).Cells(1, 1), DataType:=xlDelimited, _
                TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
                Semicolon:=True, Comma:=False, Space:=False, Other:=False
            .SaveAs sPath & Replace(sFile, ".csv", ".xlsx"), FileFormat:=xlOpenXMLWorkbook
            .Close False
        End With
        sFile = Dir
    Loop
End Sub

Tipps für Profis

  • Automatisiere den Prozess: Wenn du regelmäßig CSV-Dateien in XLSX umwandeln musst, speichere das Makro in deiner persönlichen Makroarbeitsmappe.
  • Fehlerbehandlung: Implementiere Fehlerbehandlungsroutinen im VBA-Code, um unerwartete Probleme zu erkennen und zu beheben.
  • Namen anpassen: Achte darauf, dass die Dateinamen keine Punkte enthalten oder entferne sie im Code, um Probleme mit der .SaveAs-Methode zu vermeiden:

    .SaveAs sPath & Replace(Mid(sFile, 1, Len(sFile) - 4), ".", ""), xlOpenXMLWorkbook

FAQ: Häufige Fragen

1. Wie kann ich eine CSV-Datei in XLSX umwandeln, ohne VBA zu verwenden?
Du kannst die CSV-Datei einfach in Excel öffnen und dann über Datei > Speichern unter das XLSX-Format auswählen.

2. Was kann ich tun, wenn beim Speichern in XLSX Fehler auftreten?
Überprüfe, ob die CSV-Datei korrekt formatiert ist und ob das Makro die richtigen Anweisungen hat, um die Datei zu verarbeiten.

3. Ist es möglich, mehrere CSV-Dateien gleichzeitig umzuwandeln?
Ja, das oben genannte VBA-Makro kann mehrere CSV-Dateien in einem Durchgang in das XLSX-Format umwandeln. Achte darauf, dass der Zielordner korrekt angegeben ist.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige