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

CSV Import mit GetOpenFilename

Forumthread: CSV Import mit GetOpenFilename

CSV Import mit GetOpenFilename
15.06.2016 20:45:41
Henner
Guten Abend,
ich möchte eine CSV Datei in mein bestehendes Blatt importieren. Dafür habe ich mir mit Hilfe des Recorders folgenden Code (Sub CSV_Import_Fix) aufgezeichnet, dieser funktioniert auch einwandfrei und bringt mir das gewünschte Format.
Nun möchte ich den Pfad der zu importierenden Datei auswählen können und nicht fix im Quellcode festlegen. Das habe ich mit der Erweiterung versucht (Sub CSV_Import_GOF) - beim Versuch ist es aber leider auch geblieben.
Laufzeitfehler 1004: Excel kann die Textdatei für die Aktualisierung des externen Datenbereichs nicht finden. Letzte Zeile (.Refresh BackgroundQuery:=False) wird gelb markiert.
Da der Code ohne FileDialog funktioniert kann ich mir das im Moment nicht erklären.
Meine Fragen:
1. Warum tritt dieser Fehler auf und wie behebe ich ihn?
2. Warum muss ich bei beiden Codes ".CommandType = 0" auskommentieren? (Sonst LFZ 5)
Vielen Dank für die Unterstützung
Schönen Abend und Gruss, Henner

Sub CSV_Import_Fix()
ActiveSheet.Cells.ClearContents
With ActiveSheet.QueryTables.Add(Connection:="TEXT;C:\Users\MaxMuster\Desktop\ImportMe.csv", _
_
Destination:=Range("$A$1"))
'.CommandType = 0
.Name = "CSV Import"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 65001
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = False
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = True
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,   _
_
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
.TextFileDecimalSeparator = "."
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With
End Sub

Sub CSV_Import_GOF()
ChDir (ThisWorkbook.Path & "\")
strDatei = Application.GetOpenFilename(FileFilter:="CSV-Dateien (*.csv), *.csv", Title:="Bitte   _
_
Datei auswählen")
If strDatei  False Then
ActiveSheet.Cells.ClearContents
With ActiveSheet.QueryTables.Add(Connection:="TEXT;strDatei", Destination:=Range("$A$1"))
'.CommandType = 0
.Name = "CSV Import"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 65001
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = False
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = True
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,   _
_
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
.TextFileDecimalSeparator = "."
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With
End If
End Sub

Anzeige

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: CSV Import mit GetOpenFilename
15.06.2016 20:54:01
Fennek
Hallo,
ungeprüft:
anstelle von
With ActiveSheet.QueryTables.Add(Connection:="TEXT;C:\Users\MaxMuster\Desktop\ImportMe.csv",
versuche

iPath = "c:\users\maxmustermann\desktop\"
iFile = "importme.csv"
With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & iPath & iFile,
mfg

Anzeige
AW: CSV Import mit GetOpenFilename
15.06.2016 20:59:49
Henner
Hallo "Fennek",
der Code mit dem fixen Pfad funktioniert ja. Probleme habe ich nur in Zusammenhang mit dem FileDialog.
Trotzdem vielen Dank für Deine Hilfe, Gruss Henner

AW: noch ein Versuch
15.06.2016 21:08:23
Fennek
Hallo,
hier ist mein Muster für diese Aufgabe:

Sub csv_einlesen()
sFiles = Application.GetOpenFilename("csv-Dateien (*.csv),*.csv", MultiSelect:=True)
If IsArray(sFiles) Then
Debug.Print LBound(sFiles), UBound(sFiles)
For Each ar In sFiles
i = i + 1
Cells(i, 1) = ar
Next ar
End If
End Sub
mfg

Anzeige
AW: noch ein Versuch
15.06.2016 21:12:07
Henner
Hallo Fennek,
Dein Code schreibt mir nur den Pfad der Quelldatei in die Zelle A1..
Gruss Henner

AW: Pfadname?
15.06.2016 21:35:59
Fennek
Hallo,
vielleicht hätte ich doch den Text besser lesen sollen...
Ebenfalls ungeprüft:
wenn die csv-Datei geöffnet ist, versuche
sPath = workbooks.path
wobei die csv das active Workbook sein muss.
Aber: bei Datei öffnen kennst du doch den Pfad, also so ganz klar ist mir die Frage immer noch nicht.
mfg

Anzeige
AW: Pfadname?
15.06.2016 21:53:58
Henner
Hallo Fennek,
die csv Datei ist nicht geöffnet. Ich möchte in der Tabelle auf eine Schaltfläche klicken können. Anschliessend soll sich ein FileDialog öffnen wo ich die gewünschte csv Datei auswählen kann.
Diese soll dann in das aktive Tabellenblatt importiert werden. Ich weiss leider nicht wie ich es noch genauer beschreiben soll...
Vielen Dank & Gruss, Henner

Anzeige
nur 1 kleines Detail
16.06.2016 00:59:21
Michael
Hi zusammen,
im unteren Code steht:

With ActiveSheet.QueryTables.Add(Connection:="TEXT;strDatei", Destination:=Range("$A$1"))
Gib mal aus: MsgBox "TEXT;strDatei".
Der Punkt ist, daß strDatei eine VARIABLE ist, die Du hier in den TEXT reinwurschtelst.
Richtig sollte es heißen: MsgBox "TEXT;" & strDatei
Schöne Grüße,
Michael

Anzeige
AW: nur 1 kleines Detail (ERL)
16.06.2016 18:11:36
Henner
Hi Michael
Stimmt, kann nicht funktionieren. Vielen Dank für die Lösung! Gruss Henner

(ERL) - freut mich, danke f.d. Rückmeldung
17.06.2016 12:19:51
Michael
& Gruß zurück, Henner,
Michael
;
Anzeige
Anzeige

Infobox / Tutorial

CSV Import mit GetOpenFilename in Excel VBA


Schritt-für-Schritt-Anleitung

Um eine CSV-Datei in Excel mithilfe von Application.GetOpenFilename zu importieren, kannst Du den folgenden VBA-Code verwenden. Dieser Code öffnet einen Dialog, in dem Du die Datei auswählen kannst.

Sub CSV_Import_GOF()
    Dim strDatei As String
    ChDir (ThisWorkbook.Path & "\")
    strDatei = Application.GetOpenFilename(FileFilter:="CSV-Dateien (*.csv), *.csv", Title:="Bitte Datei auswählen")

    If strDatei <> "False" Then
        ActiveSheet.Cells.ClearContents
        With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & strDatei, Destination:=Range("$A$1"))
            .Name = "CSV Import"
            .FieldNames = True
            .RowNumbers = False
            .FillAdjacentFormulas = False
            .PreserveFormatting = True
            .RefreshOnFileOpen = False
            .RefreshStyle = xlInsertDeleteCells
            .SavePassword = False
            .SaveData = True
            .AdjustColumnWidth = True
            .RefreshPeriod = 0
            .TextFilePromptOnRefresh = False
            .TextFilePlatform = 65001
            .TextFileStartRow = 1
            .TextFileParseType = xlDelimited
            .TextFileTextQualifier = xlTextQualifierDoubleQuote
            .TextFileConsecutiveDelimiter = False
            .TextFileTabDelimiter = False
            .TextFileSemicolonDelimiter = False
            .TextFileCommaDelimiter = True
            .TextFileSpaceDelimiter = False
            .TextFileColumnDataTypes = Array(1, 1, 1, 1)
            .TextFileDecimalSeparator = "."
            .TextFileTrailingMinusNumbers = True
            .Refresh BackgroundQuery:=False
        End With
    End If
End Sub

Dieser Code verwendet Application.GetOpenFilename um den Dateipfad der CSV-Datei auszuwählen und importiert sie in die aktive Tabelle.


Häufige Fehler und Lösungen

  1. Laufzeitfehler 1004: Excel kann die Textdatei nicht finden.

    • Lösung: Vergewissere dich, dass die Variable strDatei korrekt verwendet wird. Der Verbindungsstring sollte Connection:="TEXT;" & strDatei sein, nicht Connection:="TEXT;strDatei".
  2. Warum muss .CommandType = 0 auskommentiert werden?

    • Lösung: Diese Zeile ist in den meisten Fällen nicht erforderlich, da der Standardwert für CommandType bereits 0 ist. Wenn Du den Befehl trotzdem benötigst, stelle sicher, dass Du die richtige Syntax verwendest.

Alternative Methoden

Eine alternative Methode besteht darin, die CSV-Datei manuell zu importieren, ohne VBA zu verwenden. Du kannst dies tun, indem Du in Excel auf „Daten“ > „Daten abrufen“ > „Aus Text/CSV“ gehst, um den Import-Assistenten zu verwenden.


Praktische Beispiele

Hier ist ein Beispiel, wie Du mehrere CSV-Dateien gleichzeitig importieren kannst:

Sub csv_einlesen()
    Dim sFiles As Variant
    Dim i As Integer
    sFiles = Application.GetOpenFilename("csv-Dateien (*.csv),*.csv", MultiSelect:=True)

    If IsArray(sFiles) Then
        For i = LBound(sFiles) To UBound(sFiles)
            Cells(i + 1, 1) = sFiles(i)
        Next i
    End If
End Sub

Dieser Code speichert die Pfade aller ausgewählten CSV-Dateien in den Zellen der ersten Spalte.


Tipps für Profis

  • Verwende immer .TextFilePlatform = 65001, um sicherzustellen, dass Du UTF-8-kodierte CSV-Dateien korrekt importierst.
  • Überlege, Error-Handling in Deinen Code einzubauen, um Probleme während des Imports besser zu diagnostizieren.
  • Nutze das FileFilter-Argument in Application.GetOpenFilename, um nur CSV-Dateien anzuzeigen, was die Benutzerfreundlichkeit verbessert.

FAQ: Häufige Fragen

1. Wie kann ich sicherstellen, dass die importierten Daten korrekt formatiert sind?

  • Stelle sicher, dass die TextFileColumnDataTypes-Eigenschaft richtig konfiguriert ist, um die Datentypen entsprechend festzulegen.

2. Was mache ich, wenn ich einen anderen Dateityp importieren möchte?

  • Ändere einfach den FileFilter-Parameter in Application.GetOpenFilename, um den gewünschten Dateityp auszuwählen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige