Attribute VB_Name = "CSVLogLaden" Option Explicit Sub CSV_Laden() ' Fragt eine CSV-Datei ab, laedt sie per Power Query auf ein neues ' Tabellenblatt und formatiert Spalte B als Datum+Uhrzeit mit Millisekunden. ' Basiert auf dem aufgezeichneten Makro, aber mit frei waehlbarer Datei ' statt festem Pfad und mit eindeutigem Abfragenamen pro Aufruf. Dim csvPfad As Variant Dim qName As String Dim mFormula As String Dim wsNeu As Worksheet ' 1) Datei auswaehlen csvPfad = Application.GetOpenFilename("CSV-Dateien (*.csv), *.csv", , "CSV-Datei auswaehlen") If csvPfad = False Then Exit Sub ' 2) Eindeutigen Abfragenamen erzeugen, damit mehrfaches Ausfuehren ' nicht mit "Name bereits vorhanden" fehlschlaegt qName = "CSV_" & Format(Now, "yyyymmdd_hhmmss") ' 3) Power-Query-Formel mit dynamischem Dateipfad ' (Spaltennamen/-typen wie im aufgezeichneten Makro - passt zur ' festen Struktur der Export-CSV mit 16 Spalten) mFormula = _ "let" & Chr(13) & Chr(10) & _ " Quelle = Csv.Document(File.Contents(""" & csvPfad & """),[Delimiter="";"", Columns=16, Encoding=65001, QuoteStyle=QuoteStyle.Csv])," & Chr(13) & Chr(10) & _ " #""Höher gestufte Header"" = Table.PromoteHeaders(Quelle, [PromoteAllScalars=true])," & Chr(13) & Chr(10) & _ " #""Geänderter Typ"" = Table.TransformColumnTypes(#""Höher gestufte Header"",{{""ID"", Int64.Type}, {""Time"", type datetime}, {""EventCodeText"", type text}, {""Details"", Int64.Type}, {""Phase"", Int64.Type}, {""Pole"", Int64.Type}, {""ErrorFlags"", type text}, {""VCap#(cr)#(lf)(V)"", Int64.Type}, {""CapacityDrive#(cr)#(lf)(mF)"", Int64.Type}, {""CapacityEmergency#(cr)#(lf)(mF)"", Int64.Type}, {""Tripcount"", Int64.Type}, {""Temperature#(cr)#(lf)(°C)"", Int64.Type}, {""TemperaturePole_Max#(cr)#(lf)(°C)"", type text}, {""TemperaturePole_Min#(cr)#(lf)(°C)"", type text}, {""MaxCurrent#(cr)#(lf)(A)"", Int64.Type}, {""MaxCurrentTime#(cr)#(lf)(ms)"", Int64.Type}})" & Chr(13) & Chr(10) & _ "in" & Chr(13) & Chr(10) & _ " #""Geänderter Typ""" On Error GoTo Fehlerbehandlung ActiveWorkbook.Queries.Add Name:=qName, Formula:=mFormula ' 4) Neues Tabellenblatt anlegen und Abfrage dort laden Set wsNeu = ActiveWorkbook.Worksheets.Add With wsNeu.ListObjects.Add(SourceType:=0, Source:= _ "OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=" & qName & ";Extended Properties=""""" _ , Destination:=wsNeu.Range("$A$1")).QueryTable .CommandType = xlCmdSql .CommandText = Array("SELECT * FROM [" & qName & "]") .RowNumbers = False .FillAdjacentFormulas = False .PreserveFormatting = True .RefreshOnFileOpen = False .BackgroundQuery = True .RefreshStyle = xlInsertDeleteCells .SavePassword = False .SaveData = True .AdjustColumnWidth = True .RefreshPeriod = 0 .PreserveColumnInfo = True .ListObject.DisplayName = qName .Refresh BackgroundQuery:=False End With ' 5) Zeitformat in Spalte B setzen (Datum + Uhrzeit, ms-genau) wsNeu.Columns("B:B").NumberFormat = "dd/mm/yyyy hh:mm:ss.000" Exit Sub Fehlerbehandlung: MsgBox "Fehler beim Import:" & vbCrLf & Err.Description & vbCrLf & vbCrLf & _ "Hinweis: Das Makro erwartet eine CSV mit denselben 16 Spalten " & _ "wie die urspruengliche Beispieldatei. Bei abweichender Spaltenstruktur " & _ "muss die Spaltenliste im M-Code angepasst werden.", vbExclamation End Sub