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

Forumthread: Import csv Datei mit Makro auf Mac Office 2019

Import csv Datei mit Makro auf Mac Office 2019
29.04.2019 15:32:43
Dani
Hallo zusammen
Ich bemühe mich gerade um einen csv Import mittels Makro. Den Code am Ende habe ich mittels dem _ Makro Aufzeichner ermittelt. Soweit funktioniert dieser auch. Das Problem ist nun aber, dass die Datei nicht immer am gleichen Ort ist. Das "TEXT;/Vol..." muss also einer variablen Lösung weichen. Hier gerate ich aber ins Stocken. Ich habe schon einiges ausprobiert, was ich online gefunden habe. Eine Möglichkeit ist der nachfolgende Cod. Leider erhalte ich dabei einen Laufzeitfehler bei folgender Zeile:

.Refresh BackgroundQuery:=False
Wenn ich diese Zeile ausklammere (') funktioniert er, macht mir aber eine Arbeitsmappenverbindung zur oder mit der csv-Datei und das Tabellenblatt bleibt leer.
Sub test()
Dim MyPath As String
Dim MyScript As String
Dim MyFiles As String
Dim MySplit As Variant
Dim N As Long
Dim fname As String
Dim mybook As Workbook
On Error Resume Next
MyPath = MacScript("return (path to documents folder) as String")
'Or use MyPath = "Macintosh HD:Users:YourUserName:Desktop:TestFolder:"
MyScript = "set applescript's text item delimiters to (ASCII character 10) " & vbNewLine & _
"set theFiles to (choose file of type " & _
" (""public.comma-separated-values-text"") " & _
"with prompt ""Please select a file or files"" default location alias """ & _
MyPath & """ multiple selections allowed true) as string" & vbNewLine & _
"set applescript's text item delimiters to """" " & vbNewLine & _
"return theFiles"
MyFiles = MacScript(MyScript)
On Error GoTo 0
If MyFiles "" Then
With Application
.ScreenUpdating = False
.EnableEvents = False
End With
MySplit = Split(MyFiles, Chr(10))
For N = LBound(MySplit) To UBound(MySplit)
'Get file name only and test if it is open
fname = Right(MySplit(N), Len(MySplit(N)) - InStrRev(MySplit(N), _
Application.PathSeparator, , 1))
Set mybook = Nothing
On Error Resume Next
Set mybook = Workbooks.Open(MySplit(N))
On Error GoTo 0
Next
End If
Application.CutCopyMode = True
ActiveWorkbook.Worksheets.Add
With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & fname, Destination:=Range("$A$1"))
.Name = "CSV" & Worksheets.Count + 1
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.RefreshPeriod = False
.TextFilePromptOnRefresh = False
.TextFilePlatform = 10000
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = True
.TextFileTabDelimiter = True
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = True
.TextFileSpaceDelimiter = True
.TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With
Range("A5").Select
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Columns("C:D").Select
Selection.Delete Shift:=xlToLeft
Columns("H:K").Select
Selection.Delete Shift:=xlToLeft
Columns("C:C").Select
Selection.Cut Destination:=Columns("H:H")
Columns("C:C").Select
Selection.Delete Shift:=xlToLeft
Columns("C:G").Select
Selection.ColumnWidth = 10
Range("A1").Select
End Sub

Hier noch der Code, welchen ich aus dem Recorder erhalten habe.

Sub Makro1()
' Makro1 Makro
Application.CutCopyMode = False
ActiveWorkbook.Worksheets.Add
With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;/Volumes/NO NAME/****.CSV", Destination:=Range("$A$1"))
.Name = "*****"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.RefreshPeriod = False
.TextFilePromptOnRefresh = False
.TextFilePlatform = 10000
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = True
.TextFileTabDelimiter = True
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = True
.TextFileSpaceDelimiter = True
.TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With
Range("A5").Select
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Columns("C:E").Select
Columns("C:D").Select
Selection.Delete Shift:=xlToLeft
Columns("H:K").Select
Selection.Delete Shift:=xlToLeft
Columns("C:C").Select
Selection.Cut Destination:=Columns("H:H")
Columns("C:C").Select
Selection.Delete Shift:=xlToLeft
Columns("C:G").Select
Selection.ColumnWidth = 10
Range("A1").Select
End Sub

Könnt ihr mir hier bitte ein wenig unter die Arme greifen? Eingesetzt ist das Mac Office 2019 mit iOS Sierra 10.12.6.
Schon im voraus herzlichen Dank für eure Zeit.
Gruss
Dani
Anzeige

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Import csv Datei mit Makro auf Mac Office 2019
30.04.2019 09:50:35
fcs
Hallo Dani,
ich nehme an, dass du in folgender Zeile
With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & fname, Destination:=Range("$A$1"))

fname durch MySplit(N) ersetzen muss, hier muss der Dateiname inclusive Pfad(Verzeichnis) angegeben werden.
LG
Franz
Anzeige
AW: Import csv Datei mit Makro auf Mac Office 2019
30.04.2019 14:41:30
Dani
Hallo Franz
Danke für die Antwort. Leider erhalte ich bei dieser Änderung hier einen Laufzeitfehler 9.
Das mit dem "Dateiname inclusive Pfad(Verzeichnis)" verstehe ich nicht ganz. Denn ich habe ja eine Datei offen und folglich auch ein Tabellenblatt. Beim Importieren erstellt es mir sowiso ein neues Tabellenblatt in die ich die csv-Daten importieren möchte. Wenn dann die Datei eingefügt wurde werde ich diese Datei als .xlsx speicher, i.d.Regel im gleichen Ordner wie die csv-Datei. Das Speichern gehört nicht in das Makro. Priorität hat der Import.
Gruss
Dani
Anzeige
AW: Import csv Datei mit Makro auf Mac Office 2019
30.04.2019 23:17:45
fcs
Hallo Dani,
dein Makro öffnet ja die CSV-Datei -warum dann zusätzlich der Import? - und fügt dann in dieser Datei ein Blatt für den Import ein.
Sinnvoller wäre eine leere Arbeitsmappe anzulegen und in diese zu importieren.
Ich hab mal das von mir unter Windows getestete Makro angepasst bezüglich des Datei-Auswahldialogs für den Mac.
Zu vollständiger Pfad(verzeichnis):
Excel benötigt für die meisten Datei-Aktionen die Angabe von Verzeichnis und Dateiname. Nur wenn man im akuellen Verzeichnis oder bestimmten Standardverzeichnissen arbeitet kann man auf die Pfad-Angabe verzichten.
LG
Franz
Sub test()
Dim MyPath As String
Dim MyScript As String
Dim MyFiles As String
Dim MySplit As Variant
Dim N As Long
Dim fname As String
Dim mybook As Workbook
On Error Resume Next
MyPath = MacScript("return (path to documents folder) as String")
'Or use MyPath = "Macintosh HD:Users:YourUserName:Desktop:TestFolder:"
MyScript = "set applescript's text item delimiters to (ASCII character 10) " & vbNewLine &  _
_
"set theFiles to (choose file of type " & _
" (""public.comma-separated-values-text"") " & _
"with prompt ""Please select a file or files"" default location alias """ & _
MyPath & """ multiple selections allowed true) as string" & vbNewLine & _
"set applescript's text item delimiters to """" " & vbNewLine & _
"return theFiles"
MyFiles = MacScript(MyScript)
On Error GoTo 0
If MyFiles  "" Then
With Application
.ScreenUpdating = False
.EnableEvents = False
End With
MySplit = Split(MyFiles, Chr(10))
For N = LBound(MySplit) To UBound(MySplit)
'Get file name only and test if it is open
fname = Right(MySplit(N), Len(MySplit(N)) - InStrRev(MySplit(N), _
Application.PathSeparator, , 1))
For Each mybook In Application.Workbooks
If LCase(mybook.Name) = LCase(fname) Then
MsgBox "CSV-Datei """ & fname & """  ist geöffnet. Makro wird beendet."
Exit Sub
End If
Next
fname = MySplit(N)
'neue Mappe mit einem leeren Tabellenblatt öffnen
Application.Workbooks.Add Template:=xlWBATWorksheet
GoTo Weiter01
Next
Weiter01:
Else
Exit Sub
End If
With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & fname, _
Destination:=ActiveSheet.Range("$A$1"))
.Name = "CSV" & Worksheets.Count + 1
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.RefreshPeriod = False
.TextFilePromptOnRefresh = False
.TextFilePlatform = 10000
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = True
.TextFileTabDelimiter = True
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = True
.TextFileSpaceDelimiter = True
.TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With
'Verbindung der Abfrage in Datei wieder löschen
ActiveWorkbook.Connections(1).Delete
Range("A5").Select
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Columns("C:D").Select
Selection.Delete Shift:=xlToLeft
Columns("H:K").Select
Selection.Delete Shift:=xlToLeft
Columns("C:C").Select
Selection.Cut Destination:=Columns("H:H")
Columns("C:C").Select
Selection.Delete Shift:=xlToLeft
Columns("C:G").Select
Selection.ColumnWidth = 10
Range("A1").Select
'Datei speichern
ActiveWorkbook.SaveAs Filename:= Replace(fname, ".csv", ".xlsx"), fileformat:=51, addtomru:= _
True
End Sub

Anzeige
AW: Import csv Datei mit Makro auf Mac Office 2019
01.05.2019 14:46:07
Dani
Hallo Franz
Danke für deine Antwort und Zeitinvestition. Leider ist auch hier ein Laufzeitfehler aufgetreten und zwar bei der Speicherung. Nun habe ich im www folgenden Code gefunden der meiner Vorstellung entspricht.
Sub Makro2()
' Makro für das Importieren einer CSV-Datei
FileFormat = "{""public.plain-text""}"
On Error Resume Next
MyPath = MacScript("return (path to desktop folder) as String")
MyScript = _
"set theFile to (choose file of type" & _
" " & FileFormat & " " & _
"with prompt ""Please select a file"" default location alias """ & _
MyPath & """ without multiple selections allowed) as string" & vbNewLine & _
"return posix path of theFile"
file = MacScript(MyScript)
On Error GoTo 0
If file  "" Then
Application.CutCopyMode = True
ActiveWorkbook.Worksheets.Add
With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & file, Destination:=Range("$A$1"))
.Name = "CSV" & Worksheets.Count + 1
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.RefreshPeriod = False
.TextFilePromptOnRefresh = False
.TextFilePlatform = 10000
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = True
.TextFileTabDelimiter = True
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = True
.TextFileSpaceDelimiter = True
.TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With
End If
'Verbindung der Abfrage in Datei wieder löschen
ActiveWorkbook.Connections(1).Delete
Range("A5").Select
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Columns("C:E").Select
Columns("C:D").Select
Selection.Delete Shift:=xlToLeft
Columns("H:K").Select
Selection.Delete Shift:=xlToLeft
Columns("C:C").Select
Selection.Cut Destination:=Columns("H:H")
Columns("C:C").Select
Selection.Delete Shift:=xlToLeft
Columns("C:G").Select
Selection.ColumnWidth = 10
Range("A1").Select
End Sub
Freundliche Grüsse
Dani
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Import einer CSV-Datei mit Makro auf Mac Office 2019


Schritt-für-Schritt-Anleitung

  1. MacScript verwenden: Um den Pfad zur Datei zu wählen, kannst du den folgenden Code verwenden. Hierbei wird ein Dialog angezeigt, um die CSV-Datei auszuwählen.

    MyPath = MacScript("return (path to documents folder) as String")
    MyScript = "set theFiles to (choose file of type (""public.comma-separated-values-text"") " & _
               "with prompt ""Bitte wähle eine Datei aus"" default location alias """ & _
               MyPath & """ without multiple selections allowed) as string"
    MyFiles = MacScript(MyScript)
  2. CSV-Datei importieren: Verwende den QueryTables.Add Befehl, um die CSV-Datei in ein neues Arbeitsblatt zu importieren. Hier ist ein Beispiel:

    With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & file, Destination:=Range("$A$1"))
        .Name = "CSV" & Worksheets.Count + 1
        .FieldNames = True
        .RowNumbers = False
        .TextFileParseType = xlDelimited
        .TextFileCommaDelimiter = True
        .Refresh BackgroundQuery:=False
    End With
  3. Daten formatieren: Nach dem Import kannst du die Spaltenbreiten und andere Formate nach deinen Wünschen anpassen.


Häufige Fehler und Lösungen

  • Laufzeitfehler 9: Dieser Fehler tritt häufig auf, wenn der Dateipfad nicht korrekt angegeben ist. Stelle sicher, dass fname den vollen Pfad zur CSV-Datei enthält.

  • Leeres Tabellenblatt nach Import: Wenn das Arbeitsblatt leer bleibt, könnte der Connection-String falsch sein. Überprüfe, ob die Verbindung zur CSV-Datei korrekt hergestellt wurde.


Alternative Methoden

  • Manuelles Öffnen der CSV-Datei: Du kannst die CSV-Datei auch manuell öffnen und die Daten kopieren. Dies ist eine einfache Methode, wenn du keine Makros verwenden möchtest.

  • CSV-Datei erstellen auf Mac: Um eine CSV-Datei zu erstellen, kannst du einen Texteditor wie TextEdit verwenden und die Daten im CSV-Format speichern.


Praktische Beispiele

Hier ist ein einfaches Beispiel für ein Makro, das eine CSV-Datei importiert:

Sub ImportCSV()
    Dim file As String
    file = MacScript("choose file of type {""public.comma-separated-values-text""}")
    If file <> "" Then
        Workbooks.Add
        With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & file, Destination:=Range("$A$1"))
            .TextFileCommaDelimiter = True
            .Refresh BackgroundQuery:=False
        End With
    End If
End Sub

Tipps für Profis

  • Dynamische Dateipfade: Nutze Variablen für Dateipfade, um flexibler zu sein. Dies ist besonders hilfreich, wenn sich der Speicherort der CSV-Datei häufig ändert.

  • Fehlerbehandlung: Setze On Error Resume Next ein, um Laufzeitfehler zu vermeiden. Stelle jedoch sicher, dass du Fehler später überprüfst, um unerwartete Probleme zu vermeiden.


FAQ: Häufige Fragen

1. Wie kann ich eine CSV-Datei auf Mac öffnen?
Du kannst eine CSV-Datei auf Mac öffnen, indem du Excel verwendest und die Datei über "Datei" > "Öffnen" auswählst.

2. Funktioniert das Makro auch auf älteren Mac-Versionen?
Das Beispiel-Makro wurde für Mac Office 2019 erstellt, könnte aber auch auf älteren Versionen funktionieren, sofern die VBA-Funktionalität unterstützt wird.

3. Kann ich die CSV-Datei nach dem Import als .xlsx speichern?
Ja, du kannst die Datei nach dem Importieren der Daten speichern. Verwende dazu den Befehl ActiveWorkbook.SaveAs.

4. Wie erstelle ich eine CSV-Datei auf Mac?
Um eine CSV-Datei auf Mac zu erstellen, öffne einen Texteditor, schreibe deine Daten im CSV-Format und speichere die Datei mit der Endung .csv.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige