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

csv aus ordner importieren (pfad ist variabel)

Forumthread: csv aus ordner importieren (pfad ist variabel)

csv aus ordner importieren (pfad ist variabel)
27.05.2025 10:53:14
Klaus
Hallo Freunde,
ich steh mal wieder auf dem Schlauch. Ich habe ein Makro um eine CSV-Datei als query zu importieren. Mit statischen Angaben funktioniert das auch sehr gut. In der Praxis ist der Pfad aber variabel, muss also erst gesucht und zusammengebaut werden. Leider schaff ich das nicht und brauche hier eure Hilfe.

Die csv-Datei "ABC_result.csv" existiert in ganz vielen Unter-Ordnern. Um die genaue zu finden, muss der User am Anfang des Makros einen Wert eingeben, dann ist der Pfad eindeutig. Der eindeutige Unter-Ordner muss aber gesucht werden, steht auch leider an unterschiedlichen Stellen, d.h. der Pfad ist variabel. Das Makro soll nun nach Eingabe der Nummer den Pfad zusammen bauen und die csv-Datei einlesen. Es gibt einen Basis-Pfad \\ABC\user_xyz\abc\ und ab hier dann die Unter-Ordner, z.b. \\ABC\user_xyz\abc\def\1234\AAA_results.csv oder auch \\ABC\user_xyz\abc\def\1234\ghi\AAA_results.csv

Ich hoffe mir kann geholfen werden.
Gruß Klaus

Hier mal mein statisches Makro

Public Sub AAA()


Dim i As Long
Dim search_dut As Range
Dim search_partname As Range
Dim screw_ident As String
Dim Q

Number = InputBox("which number do you want to import?", "number")

For Each Q In ActiveWorkbook.Queries
If Q.Name = "AAA_results" Then Q.Delete
Next

ActiveWorkbook.Queries.Add Name:="topcover_results", Formula:= _
"let" & Chr(13) & "" & Chr(10) & " Source = Csv.Document(File.Contents(""\\ABC\user_xyz\abc\def\1234\AAA_results.csv""),[Delimiter="";"", Columns=27, Encoding=1252, QuoteStyle=QuoteStyle.None])," & Chr(13) & "" & Chr(10) & " #""Promoted Headers"" = Table.PromoteHeaders(Source, [PromoteAllScalars=true])," & Chr(13) & "" & Chr(10) & " #""Changed Type"" = Table.TransformColumn" & _
"Types(#""Promoted Headers"",{{""Ergebnis-ID"", Int64.Type}, {""Kurve verfügbar"", type text}, {""Sitzung"", type datetime}, {""Testparameter ID"", Int64.Type}, {""Name"", type text}, {""Testtyp"", type text}, {""Werkzeugtyp"", type text}, {""Verbundene Geräte"", type text}, {""Datum/Zeit"", type datetime}, {""Status"", type text}, {""Einheit"", type text}, {""Drehmo" & _
"ment"", Int64.Type}, {""Nominal Drehmoment"", Int64.Type}, {""Winkelschwellwert"", Int64.Type}, {""Min Drehmoment"", Int64.Type}, {""Max Drehmoment"", Int64.Type}, {""Winkel"", Int64.Type}, {""Spitzenwert Drehmoment"", Int64.Type}, {""Winkel bei Spitzenwert Drehmoment"", Int64.Type}, {""Drehmoment max. Winkel"", Int64.Type}, {""Max. Winkel"", Int64.Type}, {""Nominal" & _
" Winkel"", Int64.Type}, {""Min. Winkel"", Int64.Type}, {""Max. Winkel_1"", Int64.Type}, {""VIN"", type text}, {""Seq. Ergebnis"", Int64.Type}, {""Hinweis Kurve"", type text}})" & Chr(13) & "" & Chr(10) & "in" & Chr(13) & "" & Chr(10) & " #""Changed Type"""
ActiveWorkbook.Worksheets.Add
With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _
"OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=AAA_results;Extended Properties=""""" _
, Destination:=Range("$A$1")).QueryTable
.CommandType = xlCmdSql
.CommandText = Array("SELECT * FROM [AAA_results]")
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.ListObject.DisplayName = "AAA_results"
.Refresh BackgroundQuery:=False
End With
ActiveWorkbook.Queries("AAA_results").Delete
ActiveSheet.Name = "AAA_results"

For i = 1 To Cells(Rows.Count, 12).End(xlUp).Row
If IsNumeric(Range("L" & i)) Then
Range("L" & i) = Range("L" & i) / 100
End If
Next

screw_ident = "AAA"
Range("AAA_results[Drehmoment]").Select
Selection.Copy
Sheets("screws").Select
Set search_dut = ActiveSheet.Rows(1).Find(What:=DUT, Lookat:=xlWhole)
Set search_partname = ActiveSheet.Columns(5).Find(What:=screw_ident, Lookat:=xlWhole)
Intersect(search_partname.EntireRow, search_dut.EntireColumn).Offset(2, 0).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Sheets("Teardown").Select
Set search_dut = ActiveSheet.Rows(1).Find(What:=DUT, Lookat:=xlWhole)
Set search_partname = ActiveSheet.Columns(5).Find(What:=screw_ident, Lookat:=xlWhole)
Intersect(search_partname.EntireRow, search_dut.EntireColumn).Offset(2, 0).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

Range("B2").Select
Sheets("screws").Select
Range("B2").Select
Sheets("AAA_results").Delete

End Sub


Anzeige

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
CMD
27.05.2025 11:23:07
Fennek
Hallo,

im Terminal gibt es die Funktion (win+r, CMD)

"dir /s *AAA_results.csv"

Damit sollten alle Pfade auslesbar sein.

mfg
AW: csv aus ordner importieren (pfad ist variabel)
27.05.2025 13:00:12
Yal
Hallo Klaus,

Du kannst durch eine benannte Zelle, Information von einem Arbeitsblatt an Power Query übergeben:
- gehe in A1
- oben links, im Feld wo "A1" angezeigt ist, "Pfad" eintippen und -wichtig- mit Enter abschliessen
- wenn Du jetzt wieder auf A1 gehst, steht in diesem Fenster nicht mehr A1 sondern Test.
- befülle diese Zelle mit dem kompletten Pfad zur Datei
- rechtsklicke auf diese Zelle "Pfad" und wähle "Daten aus Tabelle/Bereich abrufen...")
- Du bist in Power Query Editor
- lösche die beide letzte Schritten: "Geänderter Typ" und "Höher gestufte Header"
- in der erste Zeile von Column1 ist der Pfad aufgeführt,
- rechtsklicke drauf und wähle "Drilldown ausführen", dann wird den Wert isoliert
- Öffne im Menü "Start" den erweiterte Editor und reduziere den M-Code (das ist die prog-Sprache von PQ) in
let

Quelle = Excel.CurrentWorkbook(){[Name="Pfad"]}[Content]{0}[Column1]
in
Quelle


aber eigentlich, das einzige was gebraucht wird ist
Excel.CurrentWorkbook(){[Name="Pfad"]}[Content]{0}[Column1]

Das kannst Du in deiner bisherigen Abfrage reinbringen, um auf der Datei zuzugreifen, dessen Pfad in A1 steht.
also anstatt
Source = Csv.Document(File.Contents(""\\ABC\user_xyz\abc\def\1234\AAA_results.csv"")

dann
Source = Csv.Document(File.Contents(Excel.CurrentWorkbook(){[Name="Pfad"]}[Content]{0}[Column1])

Nun andere den Pfad in A1 und aktualisiere anschliessend die Abfrage-Ausgabetabelle.
Beide Aktionen können per VBA unterstützt werden, muss aber nicht. Je schlanker die Datei, desto pflegeleichter.

VG
Yal
Anzeige
AW: csv aus ordner importieren (pfad ist variabel)
28.05.2025 10:59:20
Klaus
Hallo Yal,
vielen Dank dafür. Ich habe deinen Ansatz als Denkanstoß benutzt und es ähnlich gemacht. Was mir noch fehlt, sind:
A ) eine Suche eines bestimmten Ordners und die Rückgabe des Pfades in eine Zelle auf dem aktiven Arbeitsblatt: suche hier (\\ABC\user_xyz\abc\def\) den Unter-Ordner "1234" in allen Unterordner-Ebenen und gib mir den kompletten Pfad in Zelle B4 zurück
B) ersetzen des statischen pfades mit dem Wert aus Zelle B4

ActiveWorkbook.Queries.Add Name:="AAA_results", Formula:= _

"let" & Chr(13) & "" & Chr(10) & " Source = Csv.Document(File.Contents(""C:\Users\xxx\OneDrive - xxx\xxx\AAA_results.csv""),[Delimiter="";"", Columns=27, Encoding=1252, QuoteStyle=QuoteStyle.None])," & Chr(13) & "" & Chr(10) & " #""Promoted Headers"" = Table.PromoteHeaders(Source, [PromoteAllScalars=true])," & Chr(13) & "" & Chr(10) & " #""Changed Type"" = Table.TransformColumn" & _
"Types(#""Promoted Headers"",{{""Ergebnis-ID"", Int64.Type}, {""Kurve verfügbar"", type text}, {""Sitzung"", type datetime}, {""Testparameter ID"", Int64.Type}, {""Name"", type text}, {""Testtyp"", type text}, {""Werkzeugtyp"", type text}, {""Verbundene Geräte"", type text}, {""Datum/Zeit"", type datetime}, {""Status"", type text}, {""Einheit"", type text}, {""Drehmo" & _
"ment"", Int64.Type}, {""Nominal Drehmoment"", Int64.Type}, {""Winkelschwellwert"", Int64.Type}, {""Min Drehmoment"", Int64.Type}, {""Max Drehmoment"", Int64.Type}, {""Winkel"", Int64.Type}, {""Spitzenwert Drehmoment"", Int64.Type}, {""Winkel bei Spitzenwert Drehmoment"", Int64.Type}, {""Drehmoment max. Winkel"", Int64.Type}, {""Max. Winkel"", Int64.Type}, {""Nominal" & _
" Winkel"", Int64.Type}, {""Min. Winkel"", Int64.Type}, {""Max. Winkel_1"", Int64.Type}, {""VIN"", type text}, {""Seq. Ergebnis"", Int64.Type}, {""Hinweis Kurve"", type text}})" & Chr(13) & "" & Chr(10) & "in" & Chr(13) & "" & Chr(10) & " #""Changed Type"""



Vielen Dank
Gruß Klaus

Anzeige
AW: csv aus ordner importieren (pfad ist variabel)
28.05.2025 19:26:36
Uduuh
Hallo,
als Denkanstoß:
Sub DateiSuchen()

Dim oFolder As Object, FSO As Object
Dim strFolder As String, strMuster As String, strFile As String
Application.ScreenUpdating = False

strFolder = "\\ABC\user_xyz\abc\def\1234" 'Pfad anpassen
strMuster = "aaa_results.csv" 'Suchmuster anpassen

Set FSO = CreateObject("Scripting.FileSystemObject")
Set oFolder = FSO.GetFolder(strFolder)

prcFiles oFolder, strFile, strMuster
prcSubFolders oFolder, strFile, strMuster

Range("B4") = strFile 'oder sonstwas

End Sub

Sub prcFiles(oFolder, strFile As String, strMuster As String)
Dim oFile As Object
For Each oFile In oFolder.Files
If LCase(oFile) Like LCase(strMuster) Then
strFile = oFile.Path
End If
Next
End Sub

Sub prcSubFolders(oFolder, strFile As String, strMuster As String)
Dim oSubFolder As Object
For Each oSubFolder In oFolder.SubFolders
prcFiles oSubFolder, strFile, strMuster
prcSubFolders oSubFolder, strFile, strMuster
Next
End Sub

Gruß aus'm Pott
Udo
Anzeige
Ordner suchen und Pfad zurückgeben
30.05.2025 12:25:34
Klaus
Hallo Udo,
danke dir vorab. Funktioniert aber nicht wie ich es brauche. Ich glaube ich hab es nicht richtig beschrieben, deshalb hier noch eine andere Beschreibung:
mein kompletter Pfad ist "\\aaa\bbb\ccc\ddd\eee\fff\2025\ggg\1234\hhh\AAA_results.csv"
Am Anfang des Makros gibt der user die Nummer ein, z.B. "1234", mit dieser Eingabe ist der Pfad eindeutig und es kann die Datei "AAA_results.csv" gefunden werden. Ich möchte, dass das Makro diesen Pfad in Zelle B4 schreibt (zwischen "2025" und "1234" können 2-3 Unter-Ordner liegen, in meinem Beispiel nur "ggg"). Das nächste Problem was ich habe, ist das ich die csv-Datei nur statisch einlesen kann. Ich bekomme es nicht hin, den statischen Pfad im Einlesebefehl mit dem Wert aus B4 zu ersetzen.

Vielen Dank für jegliche Hilfe
Gruß Klaus

Hier nochmal das komplette Makro:

Option Explicit


Public ABC As String

Public Sub collect()

Application.ScreenUpdating = False
Application.DisplayAlerts = False

ABC = InputBox("which ABC number do you want to import?", "ABC number")
Sheets("identification").Range("B1").Value = ABC
Sheets("identification").Range("B2").Value = "ABC " & ABC
Worksheets("identification").Calculate

Call AAA

Sheets("identification").Select

Application.ScreenUpdating = True
Application.DisplayAlerts = True

MsgBox "All ABC have been updated"

End Sub

Public Sub AAA()

Dim i As Long
Dim search_ABC As Range
Dim search_partname As Range
Dim screw_ident As String
Dim Q

For Each Q In ActiveWorkbook.Queries
If Q.Name = "AAA_results" Then Q.Delete
Next

ActiveWorkbook.Queries.Add Name:="AAA_results", Formula:= _
"let" & Chr(13) & "" & Chr(10) & " Source = Csv.Document(File.Contents(""\\aaa\bbb\ccc\ddd\eee\fff\2025\ggg\1234\hhh\AAA_results.csv""),[Delimiter="";"", Columns=27, Encoding=1252, QuoteStyle=QuoteStyle.None])," & Chr(13) & "" & Chr(10) & " #""Promoted Headers"" = Table.PromoteHeaders(Source, [PromoteAllScalars=true])," & Chr(13) & "" & Chr(10) & " #""Changed Type"" = Table.TransformColumn" & _
"Types(#""Promoted Headers"",{{""Ergebnis-ID"", Int64.Type}, {""Kurve verfügbar"", type text}, {""Sitzung"", type datetime}, {""Testparameter ID"", Int64.Type}, {""Name"", type text}, {""Testtyp"", type text}, {""Werkzeugtyp"", type text}, {""Verbundene Geräte"", type text}, {""Datum/Zeit"", type datetime}, {""Status"", type text}, {""Einheit"", type text}, {""Drehmo" & _
"ment"", Int64.Type}, {""Nominal Drehmoment"", Int64.Type}, {""Winkelschwellwert"", Int64.Type}, {""Min Drehmoment"", Int64.Type}, {""Max Drehmoment"", Int64.Type}, {""Winkel"", Int64.Type}, {""Spitzenwert Drehmoment"", Int64.Type}, {""Winkel bei Spitzenwert Drehmoment"", Int64.Type}, {""Drehmoment max. Winkel"", Int64.Type}, {""Max. Winkel"", Int64.Type}, {""Nominal" & _
" Winkel"", Int64.Type}, {""Min. Winkel"", Int64.Type}, {""Max. Winkel_1"", Int64.Type}, {""VIN"", type text}, {""Seq. Ergebnis"", Int64.Type}, {""Hinweis Kurve"", type text}})" & Chr(13) & "" & Chr(10) & "in" & Chr(13) & "" & Chr(10) & " #""Changed Type"""
ActiveWorkbook.Worksheets.Add
With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _
"OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=AAA_results;Extended Properties=""""" _
, Destination:=Range("$A$1")).QueryTable
.CommandType = xlCmdSql
.CommandText = Array("SELECT * FROM [AAA_results]")
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.ListObject.DisplayName = "AAA_results"
.Refresh BackgroundQuery:=False
End With
ActiveWorkbook.Queries("AAA_results").Delete
ActiveSheet.Name = "AAA_results"

For i = 1 To Cells(Rows.Count, 12).End(xlUp).Row
If IsNumeric(Range("L" & i)) Then
Range("L" & i) = Range("L" & i) / 100
End If
Next

screw_ident = "AAA cover"
Range("AAA_results[Drehmoment]").Select
Selection.Copy
Sheets("identification").Select
Set search_ABC = ActiveSheet.Rows(1).Find(What:=ABC, Lookat:=xlWhole)
Set search_partname = ActiveSheet.Columns(5).Find(What:=screw_ident, Lookat:=xlWhole)
Intersect(search_partname.EntireRow, search_ABC.EntireColumn).Offset(2, 0).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Sheets("Evaluation").Select
Set search_ABC = ActiveSheet.Rows(1).Find(What:=ABC, Lookat:=xlWhole)
Set search_partname = ActiveSheet.Columns(5).Find(What:=screw_ident, Lookat:=xlWhole)
Intersect(search_partname.EntireRow, search_ABC.EntireColumn).Offset(2, 0).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

Range("B2").Select
Sheets("identification").Select
Range("B2").Select
Sheets("AAA_results").Delete

End Sub
Anzeige
AW: Ordner suchen und Pfad zurückgeben
30.05.2025 23:34:12
Uduuh
Hallo,
dann wohl
Sub DateiSuchen()

Dim oFolder As Object, FSO As Object
Dim strFolder As String, strMuster As String, strFile As String
Dim vntSubFolder, strFull As String
Application.ScreenUpdating = False

strFolder = "\\aaa\bbb\ccc\ddd\eee\fff\2025\ggg\" 'Pfad anpassen
strMuster = "aaa_results.csv" 'Suchmuster anpassen

vntSubFolder = Application.InputBox("Ordner in " & strFolder & "?", "Unterordner eingeben")

strFull = strFolder & vntSubFolder
If Dir(strFull) = "" Then
MsgBox "Der Ordner " & strFolder & vntSubFolder & " existiert nicht!", vbOKOnly & vbInformation, "FEHLER"
Exit Sub
End If

Set FSO = CreateObject("Scripting.FileSystemObject")
Set oFolder = FSO.GetFolder(strFolder & vntSubFolder)

prcFiles oFolder, strFile, strMuster
prcSubFolders oFolder, strFile, strMuster

Range("B4") = strFile 'oder sonstwas

End Sub

Sub prcFiles(oFolder, strFile As String, strMuster As String)
Dim oFile As Object
For Each oFile In oFolder.Files
If LCase(oFile) Like LCase(strMuster) Then
strFile = oFile.Path
End If
Next
End Sub

Sub prcSubFolders(oFolder, strFile As String, strMuster As String)
Dim oSubFolder As Object
For Each oSubFolder In oFolder.SubFolders
prcFiles oSubFolder, strFile, strMuster
prcSubFolders oSubFolder, strFile, strMuster
Next
End Sub

und für den Bezug aus B4
...& "Source = Csv.Document(File.Contents(" & Range("B4") & "),[Delimiter="";""


Ich finde allerdings extrem kompliziert, die CSV per VBA-generierter PQ-Funktion zu importieren. Einfach öffnen reicht doch in der Regel.
Also statt
Range("B4") = strFile

Workbooks.Open strFile


Gruß aus'm Pott
Udo
Anzeige
csv aus ordner importieren (pfad ist variabel)
27.05.2025 12:14:57
Klaus
Hallo Fennek
danke erstmal.
Das bringt mich aber nicht zum Ziel. Die Datei soll ja importiert werden, das heißt, mich interessiert der Pfad an sich ja nicht, nur das Makro soll es wissen. Ab dem Unter-Ordner *\1234\* gibt es genau eine Datei "AAA_results.csv" und die soll importiert werden. Im Endeffekt soll das Makro den Unterordner 1234 suchen, und dann in dieser Unterstruktur die eine Datei "AAA_results.csv"

Gruß Klaus
Anzeige

Forumthreads zu verwandten Themen

Anzeige