Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: CSV-Import über VBA

CSV-Import über VBA
Manuela
Hallo!
Ich bräuchte mal Eure Hilfe. Im Internet hab ich schon div. Makros gefunden, aber irgendwie will es nicht klappen - hmpf :-)
Also:
Ich würde gern über ein VBA Makro mit dem „Öffnen-Dialog“ den Inhalt einer CSV-Datei die mit Semikolons getrennt ist in meine Excelmappe einfügen. Über die Fuktion Makroaufzeichen hab’ ich es schon mehrfach probiert, aber dann wird mir der Inhalt immer nur 1:1 eingefügt. Gibt es eine Möglichkeit die Semikolons als Spalten umzusetzen?
Kurzform:
- Öffnen-Dialog
- CSV Auswählen
- ab Zelle A10 nach unten einfügen
- Semikolons in Spalten umsetzen
- (wäre es Möglich die letzte ausgefüllte Zeile zu suchen und bei der nächsten CSV dort anzuhängen?)
Achja: Ich hab' die Zeilen wo die CSV importiert werden soll formatiert (Größe, Format usw.), daher wäre es gut wenn aus der CSV nur die "werte" importiert werden. Äh..
Ich hoffe ihr könnt mir helfen und es ist nicht zu kompilziert.. ;-)
Lg,
Manuela
Anzeige

15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: CSV-Import über VBA
23.11.2011 10:02:13
Rudi
Hallo,
in ein Modul
Sub Datei_Importieren()
Dim strFileName As String, arrDaten, arrTmp, lngR As Long, lngLast As Long
Const cstrDelim As String = ";" 'Trennzeichen
With Application.FileDialog(msoFileDialogFilePicker)
.AllowMultiSelect = False
.Title = "Datei wählen"
.InitialFileName = "c:\test\*.csv"  'Pfad anpassen
If .Show = -1 Then
strFileName = .SelectedItems(1)
End If
End With
If strFileName  "" Then
Application.ScreenUpdating = False
Open strFileName For Input As #1
arrDaten = Split(Input(LOF(1), 1), vbCrLf)
Close #1
For lngR = 1 To UBound(arrDaten)
arrTmp = Split(arrDaten(lngR), cstrDelim)
If UBound(arrTmp) > -1 Then
With ActiveSheet
lngLast = .Cells(Rows.Count, 1).End(xlUp).Row + 1
lngLast = Application.Max(lngLast, 10)
.Cells(lngLast, 1).Resize(, UBound(arrTmp) + 1) _
= Application.Transpose(Application.Transpose(arrTmp))
End With
End If
Next lngR
End If
End Sub

Gruß
Rudi
Anzeige
AW: CSV-Import über VBA
23.11.2011 13:18:54
Manuela
Cool! Vielen Dank!
Es funktioniert alles wunderbar, aber ich hätte dennoch eine Frage:
Könntest du mir den Bereich ".InitialFileName =" so anpassen, dass ich zwar den Öffnendialog habe, aber der "Dateiname" nicht belegt ist sondern die Auswahl ob CSV oder Alle Dateien über den Dateityp kommt? Ich hoffe du verstehst mein Problem.. :-)
In einer anderen Exceldatei von mir ist es anders gelöst(siehe unten), aber ich weiß nicht wie ich deins anpassen muss.. :(
Application.GetOpenFilename("Txt Datei (*.txt),*.txt,Alle Dateien (*.*),*.*")
lg
Anzeige
AW: CSV-Import über VBA
23.11.2011 14:46:10
Rudi
Hallo,
so?
  With Application.FileDialog(msoFileDialogFilePicker)
.AllowMultiSelect = False
.Title = "Datei wählen"
.InitialFileName = "c:\test\"  'Pfad anpassen
.Filters.Add "CSV-Dateien", "*.csv", 1
If .Show = -1 Then
strFileName = .SelectedItems(1)
End If
End With

Gruß
Rudi
Anzeige
AW: CSV-Import über VBA
23.11.2011 19:15:47
Manuela
Top, Danke - Du bist mein Held!
Ich habs noch minimal erweitert:

.Filters.Add "CSV-Dateien", "*.csv", 1
.Filters.Add "Alle-Dateien", "*.*", 2
Ich hoffe ich nerv nicht, aber ich hätte da dennoch einen kleinen Wunsch. Hoffe du kannst mir dabei helfen, weil ich aus VBA einfach nicht schlau werde.. ;-/
Also:
Meine Daten werden mit deinem Makro nun immer in die Zellen A10 bis J10 nach unten eingefügt/angehängt. Allerdings hätte ich gern eine Info welche Datensätze aus welcher Datei kommen. Daher die Frage: Wäre es möglich hinter jeden Datensatz in Spalte K den Dateinamen ohne Pfad zu schreieben ("Test.csv")?
Ideal wäre es ja auch, wenn man den Dateinamen von der zuletzt eingespielten Datei, in einer Zelle ausgeben könnte.
Mhhhhhh, ich muss dringend VBA lernen merk ich grad ^.^
lg
Anzeige
AW: CSV-Import über VBA
24.11.2011 11:31:51
Rudi
Hallo,
Sub Datei_Importieren()
Dim strFileName As String, arrDaten, arrTmp, lngR As Long, lngLast As Long
Const cstrDelim As String = ";" 'Trennzeichen
With Application.FileDialog(msoFileDialogFilePicker)
.AllowMultiSelect = False
.Title = "Datei wählen"
.InitialFileName = "c:\test\"  'Pfad anpassen
.Filters.Add "CSV-Dateien", "*.csv", 1
.Filters.Add "Alle Dateien", "*.*", 2
If .Show = -1 Then
strFileName = .SelectedItems(1)
End If
End With
If strFileName  "" Then
Application.ScreenUpdating = False
Open strFileName For Input As #1
arrDaten = Split(Input(LOF(1), 1), vbCrLf)
Close #1
For lngR = 1 To UBound(arrDaten)
arrTmp = Split(arrDaten(lngR), cstrDelim)
If UBound(arrTmp) > -1 Then
With ActiveSheet
lngLast = .Cells(Rows.Count, 1).End(xlUp).Row + 1
lngLast = Application.Max(lngLast, 10)
.Cells(lngLast, 1).Resize(, UBound(arrTmp) + 1) _
= Application.Transpose(Application.Transpose(arrTmp))
.Cells(lngLast, Columns.Count).End(xlToLeft).Offset(, 1) = strFileName
'              .Cells(lngLast, Columns.Count).End(xlToLeft).Offset(, 1) _
= Mid(strFileName, InStrRev(strFileName, "\") + 1)
End With
End If
Next lngR
End If
'Sheets(1).Range("A1")=strFileName 'Dateiname in Blatt1!A1
End Sub

Gruß
Rudi
Anzeige
AW: CSV-Import über VBA
24.11.2011 11:46:30
Manuela
Danke! Es funktioniert aber noch nicht ganz.
Der Dateiname steht nun drin, allerdings immer hinter dem letzten Semikolon-Eintrag aus der CSV und nicht wie gewünscht immer in Spalte K. Könntest du mir das nochmal bitte anpassen?
lg
AW: CSV-Import über VBA
24.11.2011 11:58:04
Rudi
Hallo,
.Cells(lngLast, 11) = strFileName
Gruß
Rudi
Anzeige
AW: CSV-Import über VBA
24.11.2011 12:52:29
Manuela
Hallo,
wenn ich deine Code so anpasse:
           With ActiveSheet
lngLast = .Cells(Rows.Count, 1).End(xlUp).Row + 1
lngLast = Application.Max(lngLast, 10)
.Cells(lngLast, 1).Resize(, UBound(arrTmp) + 1) _
= Application.Transpose(Application.Transpose(arrTmp))
'               .Cells(lngLast, Columns.Count).End(xlToLeft).Offset(, 1) = strFileName
'               .Cells(lngLast, Columns.Count).End(xlToLeft).Offset(, 1) _
.Cells(lngLast, 11) = strFileName
= Mid(strFileName, InStrRev(strFileName, "\") + 1)
End With
dann bekomme ich bei der Stelle "= Mid(strFileName" immer einen "Fehler beim Kombilieren: Erwartet Zeilennummer oder Sprungmarke oder Anweisung oder Anweisungsende"
Anzeige
Fehler
24.11.2011 13:03:01
Rudi
Hallo,
  With ActiveSheet
lngLast = .Cells(Rows.Count, 1).End(xlUp).Row + 1
lngLast = Application.Max(lngLast, 10)
.Cells(lngLast, 1).Resize(, UBound(arrTmp) + 1) _
= Application.Transpose(Application.Transpose(arrTmp))
.Cells(lngLast, 11) = strFileName
End With

Gruß
Rudi
Anzeige
Fehler
24.11.2011 13:03:06
Rudi
Hallo,
  With ActiveSheet
lngLast = .Cells(Rows.Count, 1).End(xlUp).Row + 1
lngLast = Application.Max(lngLast, 10)
.Cells(lngLast, 1).Resize(, UBound(arrTmp) + 1) _
= Application.Transpose(Application.Transpose(arrTmp))
.Cells(lngLast, 11) = strFileName
End With

Gruß
Rudi
Anzeige
AW: Fehler
24.11.2011 13:44:25
Manuela
Danke, aber jetzt steht wieder der ganze Pfad in der Zelle und nicht nur der Dateiname.. :-(
AW: Fehler
24.11.2011 14:52:17
Rudi
Hallo,
so schwer ist das doch alles gar nicht.
  With ActiveSheet
lngLast = .Cells(Rows.Count, 1).End(xlUp).Row + 1
lngLast = Application.Max(lngLast, 10)
.Cells(lngLast, 1).Resize(, UBound(arrTmp) + 1) _
= Application.Transpose(Application.Transpose(arrTmp))
.Cells(lngLast, 11) = Mid(strFileName, InStrRev(strFileName, "\") + 1)
End With

Gruß
Rudi
Anzeige
AW: Fehler
24.11.2011 20:49:17
Manuela
Hallo!
Für mich schon... :) Danke!
lg
AW: Fehler
25.11.2011 12:16:42
Manuela
Hallo Rudi,
mir ist soeben aufgefallen, dass die 1. Zeile aus der CSV-Datei gar nicht importiert wird. Könntest du mir nochmal einen Tipp geben?
lg
AW: Fehler
25.11.2011 12:22:31
Rudi
Hallo,
ja, kann ich. Mein Fehler.
For lngR = 0 To UBound(arrDaten)
Gruß
Rudi
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige

Infobox / Tutorial

CSV-Import mit VBA in Excel


Schritt-für-Schritt-Anleitung

Um eine CSV-Datei mit VBA in Excel zu importieren, kannst du folgendes Makro verwenden. Es öffnet einen Dialog zum Auswählen der CSV-Datei, liest die Datei ein und fügt die Daten in deine Excel-Tabelle ein.

  1. Öffne Excel und drücke ALT + F11, um den VBA-Editor zu öffnen.
  2. Klicke auf Einfügen > Modul, um ein neues Modul zu erstellen.
  3. Füge den folgenden Code in das Modul ein:
Sub Datei_Importieren()
    Dim strFileName As String, arrDaten, arrTmp, lngR As Long, lngLast As Long
    Const cstrDelim As String = ";" 'Trennzeichen
    With Application.FileDialog(msoFileDialogFilePicker)
        .AllowMultiSelect = False
        .Title = "Datei wählen"
        .Filters.Add "CSV-Dateien", "*.csv", 1
        .Filters.Add "Alle Dateien", "*.*", 2
        If .Show = -1 Then
            strFileName = .SelectedItems(1)
        End If
    End With
    If strFileName <> "" Then
        Application.ScreenUpdating = False
        Open strFileName For Input As #1
        arrDaten = Split(Input(LOF(1), 1), vbCrLf)
        Close #1
        For lngR = 0 To UBound(arrDaten) ' Zeile 0 einlesen
            arrTmp = Split(arrDaten(lngR), cstrDelim)
            If UBound(arrTmp) > -1 Then
                With ActiveSheet
                    lngLast = .Cells(Rows.Count, 1).End(xlUp).Row + 1
                    lngLast = Application.Max(lngLast, 10)
                    .Cells(lngLast, 1).Resize(, UBound(arrTmp) + 1) _
                    = Application.Transpose(Application.Transpose(arrTmp))
                    .Cells(lngLast, 11) = Mid(strFileName, InStrRev(strFileName, "\") + 1) ' Dateiname in Spalte K
                End With
            End If
        Next lngR
    End If
End Sub
  1. Schließe den VBA-Editor und drücke ALT + F8, um das Makro auszuführen.

Häufige Fehler und Lösungen

  • Fehler beim Kombinieren: Wenn du einen Fehler beim Kombinieren erhältst, überprüfe, ob alle Zeilen im Code korrekt sind. Achte auf fehlende oder überflüssige Zeichen.

  • Dateiname wird mit Pfad importiert: Wenn der gesamte Pfad statt nur des Dateinamens angezeigt wird, stelle sicher, dass du die Zeile Mid(strFileName, InStrRev(strFileName, "\") + 1) korrekt in den Code eingefügt hast.

  • Erste Zeile wird nicht importiert: Ändere die Schleife von For lngR = 1 To UBound(arrDaten) in For lngR = 0 To UBound(arrDaten), um die erste Zeile einzulesen.


Alternative Methoden

Falls du eine einfachere Methode bevorzugst, kannst du die integrierte Funktion "Text aus Datei importieren" in Excel verwenden:

  1. Gehe zu Daten > Daten abrufen > Aus Datei > Aus Text/CSV.
  2. Wähle die CSV-Datei aus und klicke auf Importieren.
  3. Wähle das Trennzeichen (z.B. Semikolon) und klicke auf Laden.

Diese Methode eignet sich besonders für Benutzer, die keine Programmierkenntnisse haben.


Praktische Beispiele

Hier ist ein Beispiel, wie du das Makro anpassen kannst, um die CSV-Daten ab einer bestimmten Zelle einzufügen:

lngLast = .Cells(Rows.Count, 1).End(xlUp).Row + 1
lngLast = Application.Max(lngLast, 10) ' Beginne ab Zeile 10

Du kannst auch die Daten in einer bestimmten Spalte und Zeile formatieren, indem du die .Cells-Eigenschaft anpasst.


Tipps für Profis

  • Nutze die Application.ScreenUpdating = False-Anweisung, um das Flackern während des Imports zu vermeiden.
  • Um große CSV-Dateien effizient zu verarbeiten, solltest du in Betracht ziehen, die Daten in Arrays zu speichern, bevor du sie in die Zellen schreibst.
  • Verwende Error-Handling, um den Code robuster zu machen. Zum Beispiel:
On Error GoTo FehlerHandler
' Dein Code hier
Exit Sub
FehlerHandler:
    MsgBox "Ein Fehler ist aufgetreten: " & Err.Description

FAQ: Häufige Fragen

1. Wie kann ich das Trennzeichen ändern?
Du kannst das Trennzeichen ändern, indem du die Konstante cstrDelim im Code anpasst, z.B. Const cstrDelim As String = "," für Komma.

2. Kann ich das Makro für andere Dateiformate verwenden?
Ja, du kannst das Makro anpassen, um andere Dateiformate zu importieren, indem du das Trennzeichen änderst und die Filter im Datei-Dialog anpasst.

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