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

Forumthread: CSV-Dateien mit VBA einlesen

CSV-Dateien mit VBA einlesen
Stefan741
Hallo VBA-Freunde,
gestern habe ich fast den ganzen Tag gesucht und ausprobiert, aber keine Lösung für meine Problemstellung gefunden (bzw. war ich nicht in der Lage, eine vorhandene Lösung umzubauen, dass sie lief):
In einem Verzeichnis stehen viele CSV-Dateien. Die Daten sind mit Komma getrennt.
Diese möchte ich in eine Excel-Tabelle einlesen:
In die erste Spalte soll in jede Zeile der Dateiname geschrieben werden. In die weiteren Spalten und Zeilen dann die Daten. Eine Kommatrennung entspricht dann einer neuen Spalte.
Die Daten der nächsten Datei soll einfach unter die vorherige angefügt werden.
Habe schon versucht, das als Makro aufzuzeichnen und den Dateinamen variabel zu machen, bin aber gescheitert:
Dim Pfad As String
Dim Datei As String
Dim i As Integer
Dim alt As Variant, neu As Variant
With Application.FileSearch
.LookIn = "K:\Testverzeichnis\"
.Filename = "*.CSV"
If .Execute > 0 Then
For i = 1 To .FoundFiles.Count
alt = .FoundFiles(i)
neu = Mid(.FoundFiles(i), 66)
With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;K:\Testverzeichnis\" _
& neu, Destination:=Selection)
' im aufgezeichneten Code steht hier der ganze Verzeichnis- und
' Dateiname. Ich habe versucht, dies variabel zu gestalten
.Name = neu
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 1252
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = False
.TextFileSemicolonDelimiter = True
.TextFileCommaDelimiter = True
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(2, 1, 1, 1)
.TextFileTrailingMinusNumbers = True
' .Refresh BackgroundQuery:=False
End With
Cells(64000, 1).End(xlUp).Select
Next i
End If
End With
End Sub
Hat von euch schon mal wer so eine Lösung erarbeitet? Könnte mir da jemand weiterhelfen?
Danke im Voraus,
Stefan
Anzeige
doppelt .. CSV-Dateien mit VBA einlesen
24.03.2010 08:02:11
Mike
Gruss
Mike
offen .. CSV-Dateien mit VBA einlesen
24.03.2010 08:02:43
Mike
... nicht beide geschlossen.. ;-)
AW: offen .. CSV-Dateien mit VBA einlesen
24.03.2010 08:26:43
Stefan741
Ich kann euch versichern, dass ich nur 1x eingestellt habe. Dann bin ich zurück zum Forum und habe den Browser aktualisiert. Aber es waren 2 Einträge drin.
Keine Ahnung, was ich falsch gemacht habe. Einem Schreiber vor mir ist es aber auch so gegangen.
Würde sagen, wir schreiben hier weiter.
Anzeige
AW: offen .. CSV-Dateien mit VBA einlesen
24.03.2010 09:21:10
Heiko
Hallo Stefan,
z.B. so. Und ohne Filesearch läuft es auch unter Office 2007:
Sub CSV_Import()
Dim strPfad As String
Dim lngLastRow As Long
Dim myFileSystemObject, myFiles
' Pfad hier anpassen
strPfad = "C:\Copy\Neuer Ordner (2)\"
Set myFileSystemObject = CreateObject("Scripting.FileSystemObject")
For Each myFiles In myFileSystemObject.GetFolder(strPfad).Files
If InStr(UCase(myFiles), ".CSV") Then
lngLastRow = ActiveSheet.Cells(65535, 2).End(xlUp).Row
ActiveSheet.Cells(lngLastRow + 1, 1) = myFiles
With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;" & myFiles, Destination:=Range(Cells(lngLastRow + 2, 1), Cells(lngLastRow +  _
2, 1)))
.Name = myFiles
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 850
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = True
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = True
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(1, 1, 1, 1)
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With
End If
Next myFiles
End Sub
Gruß Heiko
Anzeige
AW: gelöst .. CSV-Dateien mit VBA einlesen
24.03.2010 10:08:34
Stefan741
Hallo Heiko,
vielen Dank für deine Hilfe, der Code funktioniert super! Das erspart eine Menge Arbeit.
Ein klein wenig habe ich ihn abgeändert, weil ich die Dateinamen links neben der ersten CSV-Zeile haben möchte:
Sub CSV_Import()
Dim strPfad As String
Dim lngLastRow As Long
Dim myFileSystemObject, myFiles
' Pfad hier anpassen
strPfad = "K:\Stoffverbote\Stoffinformationen Zulierferware\test umbenennen\"
Set myFileSystemObject = CreateObject("Scripting.FileSystemObject")
For Each myFiles In myFileSystemObject.GetFolder(strPfad).Files
If InStr(UCase(myFiles), ".CSV") Then
lngLastRow = ActiveSheet.Cells(65535, 2).End(xlUp).Row
ActiveSheet.Cells(lngLastRow + 1, 1) = myFiles
With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;" & myFiles, Destination:=Range(Cells(lngLastRow + 1, 2), Cells(lngLastRow +  _
1, 2)))
.Name = myFiles
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 850
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = True
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = True
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(1, 1, 1, 1)
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With
End If
Next myFiles
End Sub
Ich muss mir noch eine Routine bauen, um das Verzeichnis und die Endung zu entfernen und den verbleibenden Text in die leerzellen zu schreiben.
Viele Grüße
Stefan
Anzeige
AW: gelöst .. CSV-Dateien mit VBA einlesen
24.03.2010 10:34:02
Heiko
Hallo Stefan,
da braucht es nicht viel:
Diese Zeile
ActiveSheet.Cells(lngLastRow + 1, 1) = myFiles
so ändern, fertig.
ActiveSheet.Cells(lngLastRow + 1, 1) = Split(myFiles.Name, ".")(0)
Gruß Heiko
AW: gelöst .. CSV-Dateien mit VBA einlesen
24.03.2010 13:15:57
Stefan741
Hallo Heiko,
das "da brauchts nicht viel" gilt für dich, leider aber nicht für mich. Ich habe mich jetzt lange rumgequält, bis ich folgenden code gebastelt hatte:
Sub Pfad_entfernen()
Dim LastRow As Long, FirstRow As Long
Dim i As Long, Länge As Long
Dim Nummer As String
FirstRow = Cells(1, 1).End(xlDown).Row
LastRow = Cells(65535, 2).End(xlUp).Row
For i = FirstRow To LastRow
Länge = Len(Cells(i, 1)) - 75
Nummer = Mid(Cells(i, 1), 72, Länge)
Cells(i, 1).Value = Nummer
Next
End Sub
Trotzdem danke für die codezeile, werde natürlich deinen viel einfacheren Vorschlag verwenden.
Die Nummern lass ich jetzt so reinkopieren:
Sub Artikenummer_kopieren()
Dim LastRow As Long, FirstRow As Long
Dim i As Long
FirstRow = Cells(1, 1).End(xlDown).Row
LastRow = Cells(65535, 2).End(xlUp).Row
For i = FirstRow To LastRow - 1
If Cells(i + 1, 1).Value = 0 Then
Cells(i + 1, 1).Value = Cells(i, 1).Value
End If
Next
End Sub
Gruß
Stefan
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

CSV-Dateien mit VBA einlesen


Schritt-für-Schritt-Anleitung

Um eine CSV-Datei mit VBA in Excel einzulesen, kannst du den folgenden Code verwenden. Dieser Code liest alle CSV-Dateien in einem bestimmten Verzeichnis und fügt die Daten in eine Excel-Tabelle ein. Der Dateiname wird in die erste Spalte geschrieben und die Daten folgen in den nächsten Spalten.

Sub CSV_Import()
    Dim strPfad As String
    Dim lngLastRow As Long
    Dim myFileSystemObject, myFiles
    ' Pfad hier anpassen
    strPfad = "C:\Dein\Pfad\zu\CSV\"
    Set myFileSystemObject = CreateObject("Scripting.FileSystemObject")

    For Each myFiles In myFileSystemObject.GetFolder(strPfad).Files
        If InStr(UCase(myFiles), ".CSV") Then
            lngLastRow = ActiveSheet.Cells(65535, 1).End(xlUp).Row
            ActiveSheet.Cells(lngLastRow + 1, 1) = myFiles.Name
            With ActiveSheet.QueryTables.Add(Connection:= _
                "TEXT;" & myFiles, Destination:=Range(Cells(lngLastRow + 2, 1), Cells(lngLastRow + 2, 1)))
                .Name = myFiles.Name
                .FieldNames = True
                .Refresh BackgroundQuery:=False
            End With
        End If
    Next myFiles
End Sub

Ändere den strPfad zum Verzeichnis, in dem sich deine CSV-Dateien befinden.


Häufige Fehler und Lösungen

  1. Fehler: "Datei nicht gefunden"

    • Stelle sicher, dass der angegebene Pfad korrekt ist. Überprüfe die Schreibweise und die Zugriffsrechte.
  2. Fehler: Daten werden nicht korrekt eingelesen

    • Überprüfe die Trennzeichen in der CSV-Datei. Standardmäßig wird ein Komma als Trennzeichen verwendet. Wenn deine Datei ein anderes Trennzeichen hat, musst du den Code anpassen.
  3. Fehler: Überlauf-Fehler

    • Dieser Fehler tritt auf, wenn du versuchst, eine zu große Zahl zu verarbeiten. Stelle sicher, dass die Zellen in Excel nicht über die maximale Anzahl hinausgehen.

Alternative Methoden

Wenn du eine CSV-Datei ohne VBA einlesen möchtest, kannst du die integrierte Importfunktion von Excel verwenden:

  1. Öffne Excel und gehe zu Daten.
  2. Wähle Daten abrufen und dann Aus Datei.
  3. Wähle Aus Text/CSV und navigiere zu deiner Datei.
  4. Folge den Anweisungen im Importassistenten.

Diese Methode eignet sich gut, wenn du keine Programmierung verwenden möchtest.


Praktische Beispiele

Hier sind einige praktische Beispiele, wie du die Funktionalität erweitern kannst:

  • CSV in Array einlesen: Wenn du die Daten zuerst in ein Array einlesen möchtest, kannst du dies tun, um sie später zu verarbeiten.
Sub CSV_to_Array()
    Dim strPfad As String
    Dim myFileSystemObject, myFiles
    Dim csvData As Variant
    Dim i As Long
    strPfad = "C:\Dein\Pfad\zu\CSV\"
    Set myFileSystemObject = CreateObject("Scripting.FileSystemObject")

    For Each myFiles In myFileSystemObject.GetFolder(strPfad).Files
        If InStr(UCase(myFiles), ".CSV") Then
            Open myFiles For Input As #1
            csvData = Split(Input$(LOF(1), 1), vbCrLf)
            Close #1

            For i = LBound(csvData) To UBound(csvData)
                Cells(i + 1, 1).Value = csvData(i)
            Next i
        End If
    Next myFiles
End Sub

Tipps für Profis

  • Verwende Option Explicit am Anfang deines Codes, um sicherzustellen, dass alle Variablen deklariert sind.
  • Nutze Error Handling, um mögliche Laufzeitfehler zu behandeln und den Code robuster zu machen.
  • Experimentiere mit TextFileColumnDataTypes, um die Datentypen in den Spalten anzupassen.

FAQ: Häufige Fragen

1. Wie kann ich mehrere CSV-Dateien in einer einzigen Excel-Tabelle zusammenführen?
Du kannst die oben genannte Methode verwenden, um alle CSV-Dateien aus einem Verzeichnis zu importieren und sie in der gleichen Tabelle anzuzeigen.

2. Kann ich die Daten automatisch formatieren, während ich sie einlese?
Ja, du kannst zusätzliche Formatierungsoptionen in den With-Block der QueryTables.Add-Methode hinzufügen, um die Daten nach dem Import zu formatieren.

3. Wie kann ich einen spezifischen Bereich aus der CSV-Datei einlesen?
Du kannst die TextFileStartRow-Eigenschaft verwenden, um anzugeben, ab welcher Zeile die Daten eingelesen werden sollen.

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