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

Makro csv-Datei laden und Int.Tabelle anlegen

Forumthread: Makro csv-Datei laden und Int.Tabelle anlegen

Makro csv-Datei laden und Int.Tabelle anlegen
06.10.2025 19:03:04
Pfitzer Gerhard
Option Explicit

Public DebugModus As Boolean ' Manuell auf True setzen, wenn du im Einzelschritt arbeitest

Function SpeichereMitVersionskontrolle(pfad As String, basisName As String) As String
Dim i As Integer
Dim dateiPfad As String

i = 1
dateiPfad = pfad & basisName & ".xlsm"

Do While Dir(dateiPfad) > ""
dateiPfad = pfad & basisName & "_" & i & ".xlsm"
i = i + 1
Loop

SpeichereMitVersionskontrolle = dateiPfad
End Function

Function CSV_Import_Direkt() As Worksheet
On Error GoTo Fehler

Dim suchOrdner As String
Dim dateiPfad As String
Dim neueWB As Workbook
Dim zielWS As Worksheet
Dim csvName As String
Dim dateiName As String
Dim fd As FileDialog

suchOrdner = "R:\1\Kontoauszüge\2025\"

' Datei auswählen
Set fd = Application.FileDialog(msoFileDialogFilePicker)
With fd
.InitialFileName = suchOrdner
.Title = "Wähle die CSV-Datei aus"
.Filters.Clear
.Filters.Add "CSV-Dateien", "*.csv"
.AllowMultiSelect = False

If .Show > -1 Then
MsgBox "Keine Datei ausgewählt.", vbExclamation
Set fd = Nothing
Exit Function
End If

dateiPfad = .SelectedItems(1)
End With
Set fd = Nothing

Debug.Print "Datei gewählt: " & dateiPfad

dateiName = Dir(dateiPfad)
csvName = Left(dateiName, InStrRev(dateiName, ".") - 1)

' Neue Arbeitsmappe erstellen
Set neueWB = Workbooks.Add
With neueWB.Windows(1)
.Visible = True
.WindowState = xlNormal
.Activate
End With

Set zielWS = neueWB.Sheets(1)
zielWS.Name = "CSV_Tabelle"
zielWS.Activate
zielWS.Range("A1").Select
DoEvents

' Kopfzeilen (außerhalb der Tabelle) einfügen
zielWS.Rows("1:6").Insert Shift:=xlDown
zielWS.Range("E1").Value = "Umsätze VR-Bank"
zielWS.Rows("2:2").RowHeight = 43.5
zielWS.Rows("3:6").RowHeight = 12.75

' CSV einlesen ab Zeile 7
Dim zeile As String, zeilenArray() As String
Dim i As Long, j As Long
Dim fso As Object, ts As Object

Set fso = CreateObject("Scripting.FileSystemObject")
Set ts = fso.OpenTextFile(dateiPfad, 1, True)

i = 7
Do Until ts.AtEndOfStream
zeile = ts.ReadLine
zeilenArray = Split(zeile, ";")
For j = 0 To UBound(zeilenArray)
zielWS.Cells(i, j + 1).Value = zeilenArray(j)
Next j
i = i + 1
Loop
ts.Close

Debug.Print "CSV-Daten bis Zeile: " & i - 1

' Spaltenbreiten manuell setzen
With zielWS
.Columns("A:AQ").ColumnWidth = 12
.Columns("G:G").ColumnWidth = 33
.Columns("K:K").ColumnWidth = 40
End With

' Tabelle ab Zeile 7 erstellen
Dim letzteZeile As Long
letzteZeile = zielWS.Cells(Rows.Count, 1).End(xlUp).Row

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

Dim lo As ListObject
Set lo = zielWS.ListObjects.Add(xlSrcRange, zielWS.Range("A7:AQ" & letzteZeile), , xlYes)
lo.Name = "CSV_Tabelle"
lo.TableStyle = "TableStyleMedium2"

Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic

' Sichtbereich auf die Tabelle setzen
With zielWS
.Activate
.Range("A7").Select
.Parent.Activate
.Parent.Windows(1).ScrollColumn = 1
.Parent.Windows(1).ScrollRow = 1
End With
DoEvents

Debug.Print "Tabelle erstellt: " & lo.Name & " Bereich: " & lo.Range.Address

' Speichern
Dim speicherPfad As String
speicherPfad = SpeichereMitVersionskontrolle(suchOrdner, csvName)
neueWB.SaveAs Filename:=speicherPfad, FileFormat:=xlOpenXMLWorkbookMacroEnabled
Debug.Print "Datei gespeichert unter: " & speicherPfad

' Jetzt erst Spalten ausblenden
On Error Resume Next
zielWS.Columns("A:D").Hidden = True
zielWS.Columns("F:F").Hidden = True
zielWS.Columns("H:J").Hidden = True
zielWS.Columns("M:M").Hidden = True
zielWS.Columns("P:T").Hidden = True
On Error GoTo 0

' Rückgabe
Set CSV_Import_Direkt = zielWS

' Aufräumen
Set fso = Nothing
Set ts = Nothing
Set lo = Nothing
Set zielWS = Nothing
Set neueWB = Nothing
Exit Function

Fehler:
MsgBox "Fehler beim CSV-Import: " & Err.Description, vbCritical
Set CSV_Import_Direkt = Nothing
End Function


Sub Formatierung_Bankauszuege()
On Error GoTo Fehler

Dim ws As Worksheet
Dim letzteZeile As Long

Set ws = CSV_Import_Direkt()
If ws Is Nothing Then
MsgBox "CSV-Import fehlgeschlagen oder abgebrochen.", vbExclamation
Exit Sub
End If

letzteZeile = ws.Cells.Find("*", , xlFormulas, xlPart, xlByRows, xlPrevious).Row

ws.Columns("G").ColumnWidth = 33
ws.Columns("K").ColumnWidth = 40
ws.Columns("E").ColumnWidth = 11
ws.Columns("U:AQ").ColumnWidth = 11

With ws
.Range("L7:N" & letzteZeile).NumberFormat = "#,##0.00;[Red]-#,##0.00"
.Range("U7:AQ" & letzteZeile).NumberFormat = "#,##0.00;[Red]-#,##0.00"
End With

On Error Resume Next
Application.Run "PERSONAL.XLSB!Kontenplan"
Application.Run "PERSONAL.XLSB!Fenster_teilen"
Application.Run "PERSONAL.XLSB!Formeln_Z_4"
Application.Run "PERSONAL.XLSB!Formeln_Z_5"
Application.Run "PERSONAL.XLSB!Formeln_Z_6"
Application.Run "PERSONAL.XLSB!Formelneintrag"
1800 On Error GoTo 0

ws.Range("AZ1").Value = "Formatiert"

MsgBox "Tabelle erstellt bis Spalte AQ, Formatierung abgeschlossen.", vbInformation
Exit Sub

Fehler:
MsgBox "Fehler in Formatierung_Bankauszuege: " & Err.Description, vbCritical
End Sub

cav-Datei hat nur 18 Spalten. Der oa. Code erstellt eine Int.Tabelle, die mit Spalte O beginnt.
Anzeige

22
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Makro csv-Datei laden und Int.Tabelle anlegen
06.10.2025 19:05:54
BoskoBiati
Hi,

und was soll uns das jetzt sagen?
Ich persönlich würde das ohne Makro mit PQ machen.
Gruß

Edgar
AW: Makro csv-Datei laden und Int.Tabelle anlegen
06.10.2025 19:11:55
Pfitzer Gerhard
Danke für die schnelle Rückmeldung. Was bedeutet mit PQ machen?
Natürlich komme ich auf dem Fußweg auch zu dem gewünschten Ergebnis. Aber ist dafür nicht VBA gedacht?
AW: Makro csv-Datei laden und Int.Tabelle anlegen
06.10.2025 20:03:49
Pfitzer Gerhard
Hallo Edbar,
mir ist nicht klar, was ich mit dem Hinweis auf PQ (PowerQuery) soll. Ich will keine Query Tabelle - zumindest nicht mit diesem Code. Es soll eine Intelligente Tabelle erstellt werden.
AW: Makro csv-Datei laden und Int.Tabelle anlegen
06.10.2025 21:30:04
BoskoBiati
Hallo,

wenn Du Dich nicht damit auseinandersetzen willst, dann kann ich Dir nicht helfen.

Gruß

Edgar
Anzeige
AW: Makro csv-Datei laden und Int.Tabelle anlegen
06.10.2025 21:37:10
Pfitzer Gerhard
Hallo Edgar,
ich habe mich sehr wohl damit schon im Vorfeld befasst und arbeite auch mit Query Tabellen. Mein Code-Problem hat damit aber rein gar nichts zu tun.
Entschuldige bitte, wenn ich Dich unnötig belästigt habe. Du hättest Dich vielleicht besser nicht einmischen sollen, wenn Du an die Sache nur sehr oberflächlich herangehst und nur schlaue Empfehlungen gibst, aber keine Lösungen.
Anzeige
Mein lieber Gerhard
06.10.2025 21:51:07
RPP63
Du rotzt da einen unformatierten Code hin …
… verzichtest auf eine Begrüßung und Einleitung …
… eine eventuelle Frage ist in dem Wust nicht erkennbar, weil sie nicht vorhanden ist …
… das einzig nicht kopierte ist:
"cav-Datei hat nur 18 Spalten. Der oa. Code erstellt eine Int.Tabelle, die mit Spalte O beginnt."
… ein abschließender Gruß fehlt natürlich auch …

Warum fragst Du nicht einfach eine KI?
Vielleicht "denkt" die sich nicht:
Was ist das denn für ein Ar…l…?
Anzeige
Wir beruhigen uns alle erstmal
06.10.2025 22:15:04
Yal
Hallo zusammen,

klar, dass einige gewohnte Formlichkeiten nicht vorhanden waren, aber versuchen wir mit einem neuen Anfang:
@Gerhard, erkläre uns zuerst ganz einfach, was Du haben möchtest.

Deine Makro hat 3 Aufgaben: Daten formatieren (Spalten ausblenden), unter einen neuen Namen speichern und einige ausgelagerte Funktionenlaufen zu lassen.

Wenn ich das richtig verstehe, fehlt nur noch das Lesen der csv-Datei in einer Tabelle (was auch intelligente Tabelle benannt wird, aber nur weil oft "Tabelle" verwendet wird, obwohl "Blatt" gemeint ist. Auch wenn diese Blätter "Tabelle1" usw benannt werden).

Das Lesen einer CSV-Datei in einer Tabelle wird am bequemsten mit Power Query gemacht. Es muss nus einmal eingerichtet werden, anschließend wird VBA nur die Abfrage (die Power Query Abfrage) aktualisieren.
Sonst müsste man den gesamte Ladevorgang in VBA nachprogrammieren, was seit PQ nicht mehr gern gemacht wird.

Aber jetzt bist Du dran: wo und wie können wir dich genau unterstützen?

VG
Yal
Anzeige
AW: Wir beruhigen uns alle erstmal
06.10.2025 23:48:58
Pfitzer Gerhard
Hallo Yal,
danke für die sehr freundliche Stellungnahme. Gerne entschuldige ich mich, dass gewohnte Förmlichkeiten von mir nicht eingehalten wurden. Ich bin 76 Jahre und habe letztmals 2020 mit dem Excel-Forum zu tun gehabt. RPP63 hat mir empfohlen, KI zu nutzen. Das habe ich, schon vor seinem Rat, nun tagelang probiert. Allerdings sind dort Förmlichkeiten eher schädlich, da man dann komplett vom eigentlich Problem abweichende Lösungen angeboten bekommt. Das aber nur am Rande.

Nun aber zu meinem Anliegen: es ist absehbar, dass ich in absehbarer Zeit meine Verwaltung nicht mehr selbst machen kann. Deshalb möchte ich meinem Helfer/Nachfolger Unterlagen an die Hand geben, bei denen ein Knopfdruck (Makro) genügt, um perfekt vorbereitete Dateien zu haben.

Bisher habe ich das eben zu Fuß erledigt - und es hat funktioniert. Was ich mit dem Code erledigen möchte, ist folgendes:

Meine Bankauszüge werden monatlich als CSV-Datei ausgegeben. Diese Dateien sollen durch das Makro aufgerufen werden, dann daraus eine intelligente Tabelle erstellt werden, die von Spalte A - AQ geht (wird gebraucht, da ich für meine Kontierung so viele Spalten brauche). Die CSV Datei hat nur 18 Spalten. Vor der Tabelle brauche ich 6 Zeilen, die über meine personl.Makros mit Text oder Formeln gefüllt werden. Letzte_Zeile und Letzte Spalte sollen ermittelt werden, damit die Formeln entsprechend in die richtigen Zellen eingetragen werden. Die Datei soll dann als .xlsm Datei abgespeichert. Diese monatlichen xlsm-Dateien werden dann aus dem Ordner Bsp. 2025 in eine Query-Tabelle übernommen. Dies hat jetzt aber nichts mit dem aktuellen code zu tun, sondern soll nur erklären, weshalb ich nicht, wie von Dir empfohlen, gleich eine Query Tabelle nutze. Als Laie hatte ich keine Lösung, wie ich Query-Tabellen (meine monatlichen Kontoauszüge) in einer Query-Tabelle (mein Jahreskontoauszug) zusammenführen kann.

Mit Hilfe der KI bin ich so weit gekommen, dass die Tabelle erstellt wird (Tabellenbereich A7:AQ11), aber die Tabelle erst mit Spalte O beginnt. Die Daten von A-N sind zwar vorhanden, werden aber nicht angezeigt.

Falls Du Lust hast, mir zu helfen, würde ich mich sehr freuen. Wenn nicht, bin ich auch nicht böse.

Viele Grüße und einen schönen Abend
Gerhard
Anzeige
AW: Wir beruhigen uns alle erstmal
07.10.2025 08:27:46
Pfitzer Gerhard
Hallo Onur,

Danke für den Hinweis. Das habe ich schon x-mal geprüft. So simpel scheint mein Problem nicht zu sein. Ich habe, wie bereits beschrieben, schon tagelange mit Copilot an dem Lösungsversuch probiert, bin aber bisher gescheitert.

Vielleicht noch ein Hinweis: obwohl ich das Makro im Einzelschritt aufrufe, läuft das Makro durch, wenn ich nach der Dateiauswahl auf OK drücke.
Anzeige
AW: Wir beruhigen uns alle erstmal
07.10.2025 08:31:23
Onur
Dein Code blendet doch schon hier 9 Spalten aus:
zielWS.Columns("A:D").Hidden = True

zielWS.Columns("F:F").Hidden = True
zielWS.Columns("H:J").Hidden = True
zielWS.Columns("M:M").Hidden = True

Poste doch mal die Datei (mit irgend welchen Phantasiedatensätzen).
Anzeige
AW: Wir beruhigen uns alle erstmal
07.10.2025 08:41:00
Pfitzer Gerhard
Hallo Onur,
habe eine Datei hochgeladen. Musste diese von csv in xls umwandeln, da csv-Dateien nicht hochgeladen werden können
AW: Wir beruhigen uns alle erstmal
07.10.2025 09:05:08
Onur
Hochladen ohne hier den Link dazu zu posten bringt aber nix.
Da hat nur der Server was davon. :)
AW: Wir beruhigen uns alle erstmal
07.10.2025 09:11:25
Onur
Hallo Gerhard,

Bitte auch mal die Exceldatei mit dem Makro posten.


Gruß
Onur
Anzeige
AW: Wir beruhigen uns alle erstmal
07.10.2025 10:33:57
Pfitzer Gerhard
Hallo Onur,

danke dass Du Dich weiterhin bemüßt. Wie ich schon mitgeteilt habe, fehlt mir die Erfahrung mit Foren. Datei hochladen hat für mich bedeutet (so wie ich geführt wurde) eine Datei anhängen. Kannst Du mir bitte einen Hinweis geben, wie ich vorgehen muss, um die gewünschten Dateien hochzuladen.

Vorab nochmals meinen VBA-Code, da ich nicht mehr sicher bin, ob der gepostete nicht der von der KI verdorbene ist:

Option Explicit

Function SpeichereMitVersionskontrolle(pfad As String, basisName As String) As String
Dim i As Integer
Dim dateiPfad As String

i = 1
dateiPfad = pfad & basisName & ".xlsm"

Do While Dir(dateiPfad) > ""
dateiPfad = pfad & basisName & "_" & i & ".xlsm"
i = i + 1
Loop

SpeichereMitVersionskontrolle = dateiPfad
End Function

Function CSV_Import_Direkt() As Worksheet
On Error GoTo Fehler

Const ForReading = 1
Const TristateTrue = -1

Dim suchOrdner As String
Dim dateiPfad As String
Dim neueWB As Workbook
Dim zielWS As Worksheet
Dim csvName As String
Dim dateiName As String

suchOrdner = "R:\1\Kontoauszüge\2025\"

With Application.FileDialog(msoFileDialogFilePicker)
.InitialFileName = suchOrdner
.Title = "Wähle die CSV-Datei aus"
.Filters.Clear
.Filters.Add "CSV-Dateien", "*.csv"
.AllowMultiSelect = False

If .Show > -1 Then
MsgBox "Keine Datei ausgewählt.", vbExclamation
Exit Function
End If

dateiPfad = .SelectedItems(1)
End With

dateiName = Dir(dateiPfad)
csvName = Left(dateiName, InStrRev(dateiName, ".") - 1)

Set neueWB = Workbooks.Add
Dim speicherPfad As String
speicherPfad = SpeichereMitVersionskontrolle(suchOrdner, csvName)
neueWB.SaveAs Filename:=speicherPfad, FileFormat:=xlOpenXMLWorkbookMacroEnabled

Set zielWS = neueWB.Sheets(1)
zielWS.Name = "CSV_Tabelle"

Dim zeile As String
Dim zeilenArray() As String
Dim i As Long, j As Long
Dim fso As Object, ts As Object

Set fso = CreateObject("Scripting.FileSystemObject")
Set ts = fso.OpenTextFile(dateiPfad, ForReading, TristateTrue)

i = 1
Do Until ts.AtEndOfStream
zeile = ts.ReadLine
zeilenArray = Split(zeile, ";")
Debug.Print "Zeile " & i & ": Spaltenanzahl = " & UBound(zeilenArray) + 1
For j = 0 To UBound(zeilenArray)
zielWS.Cells(i, j + 1).Value = zeilenArray(j)
Next j
i = i + 1
Loop
ts.Close

Dim letzteZeile As Long
letzteZeile = zielWS.Cells.Find("*", , xlFormulas, xlPart, xlByRows, xlPrevious).Row

zielWS.Rows("1:6").Insert Shift:=xlDown
zielWS.Rows("2:2").RowHeight = 43.5
zielWS.Rows("3:6").RowHeight = 12.75

zielWS.Range("E1").Value = "Umsätze VR-Bank"

Dim lo As ListObject
Set lo = zielWS.ListObjects.Add(xlSrcRange, zielWS.Range(zielWS.Cells(7, 1), zielWS.Cells(letzteZeile + 6, Columns("AQ").Column)), , xlYes)
lo.Name = "CSV_Tabelle"
lo.TableStyle = "TableStyleMedium2"

Set CSV_Import_Direkt = zielWS
Exit Function

Fehler:
MsgBox "Fehler beim CSV-Import: " & Err.Description, vbCritical
Set CSV_Import_Direkt = Nothing
End Function

Sub Formatierung_Bankauszuege()
On Error GoTo Fehler

Dim ws As Worksheet
Dim letzteZeile As Long
Dim lo As ListObject

Set ws = CSV_Import_Direkt()
If ws Is Nothing Then
MsgBox "CSV-Import fehlgeschlagen oder abgebrochen.", vbExclamation
Exit Sub
End If

Debug.Print "Arbeitsblatt: " & ws.Name

If ws.Range("AZ1").Value = "Formatiert" Then
MsgBox "Die Datei wurde bereits formatiert.", vbInformation
Exit Sub
End If

letzteZeile = ws.Cells.Find("*", , xlFormulas, xlPart, xlByRows, xlPrevious).Row

Dim loAlt As ListObject
For Each loAlt In ws.ListObjects
loAlt.Delete
Next loAlt

On Error Resume Next
ws.Columns("A:D").Hidden = True
ws.Columns("F:F").Hidden = True
ws.Columns("H:J").Hidden = True
ws.Columns("M:M").Hidden = True
ws.Columns("P:T").Hidden = True
On Error GoTo 0

Set lo = ws.ListObjects.Add(xlSrcRange, ws.Range(ws.Cells(7, 1), ws.Cells(letzteZeile, Columns("AQ").Column)), , xlYes)
lo.Name = "CSV_Tabelle"
lo.TableStyle = "TableStyleMedium2"
Debug.Print "Tabelle erstellt: " & lo.Name

ws.Columns("G").ColumnWidth = 33
ws.Columns("K").ColumnWidth = 40
ws.Columns("E").ColumnWidth = 11
ws.Columns("U:AQ").ColumnWidth = 11

With ws
.Range("L7:N" & letzteZeile).NumberFormat = "#,##0.00;[Red]-#,##0.00"
.Range("U7:AQ" & letzteZeile).NumberFormat = "#,##0.00;[Red]-#,##0.00"
End With

On Error Resume Next
Application.Run "PERSONAL.XLSB!Kontenplan"
Application.Run "PERSONAL.XLSB!Fenster_teilen"
Application.Run "PERSONAL.XLSB!Formeln_Z_4"
Application.Run "PERSONAL.XLSB!Formeln_Z_5"
Application.Run "PERSONAL.XLSB!Formeln_Z_6"
On Error GoTo 0

ws.Range("AZ1").Value = "Formatiert"

MsgBox "Tabelle erstellt bis Spalte AQ, Formatierung abgeschlossen.", vbInformation
Exit Sub

Fehler:
MsgBox "Fehler in Formatierung_Bankauszuege: " & Err.Description, vbCritical
End Sub


Was ich noch festgestellt habe ist, dass dieses Makro eine leere Datei speichert mit dem gewünschten Namen. Danach wird die Int.Tabelle aufgebaut und angezeigt, die dann gespeichert werden müsste
Anzeige
AW: Wir beruhigen uns alle erstmal
07.10.2025 11:07:31
Oppawinni
Hallo Gerhard,
du hast wohl eine Datei hochgeladen. Da musst du doch nur den angegebenen Link in deinen Post rein setzen, dann findet man die Datei auch.
Ich nehme an, dass z.B. das von dir war:
https://www.herber.de/bbs/user/179120.xlsx
Anzeige
AW: Wir beruhigen uns alle erstmal
07.10.2025 11:31:07
Pfitzer Gerhard
ja, das ist die hochgeladene Datei. Nun nochmals die Frage vom Anfänger: wie komme ich an den Link?
AW: Wir beruhigen uns alle erstmal
07.10.2025 11:34:57
daniel
Der Linktext wird dir angezeigt, nachdem du die Datei hochgeladen hast.
Dort musst du ihn kopieren (markieren und STRG+C, aber dafür gibt es auch eine kleine Schaltfläche in der rechten oberen Ecke des Anzeigefensters).
dann kehrst du zum Beitrag zurück (Backbutton des Browsers) und fügst den Link dort ein.

Gruß Daniel
Anzeige
AW: Wir beruhigen uns alle erstmal
07.10.2025 11:46:49
Pfitzer Gerhard
Danke Daniel. Habe jetzt, hoffentlich richtig, die durch das Makro erstellte Datei hochgeladen.

Auf die Kommentare von Edgar würde ich gerne verzichten! Bekommt er das mit, wenn ich hier den Wunsch äußere?
Anzeige
AW: Wir beruhigen uns alle erstmal
07.10.2025 11:25:32
BoskoBiati
Hi,

ich bin zwar noch keine 76, aber nicht weit davon weg, daher weiß ich, dass der alte Spruch immer noch gilt: Wer lesen kann, ist klar im Vorteil.
1. gibt es beim Erstellen der Beiträge, unter dem Button "Beispieldatei..." den Button "Code...". Wenn man, bevor man Codezeilen einfügt, diesen drückt und dann die Codezeilen an der Stelle, an der der Cursor blinkt, einfügt, dann erkennt man den Code deutlich besser.
2. wenn man den Button "Beispieldatei..." drückt und anschließend das befolgt, was im Text erläutert wird, dann klappt das auch mit dem Anhängen der Datei.

Gruß

Edgar
Anzeige

Forumthreads zu verwandten Themen