Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1964to1968
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Code zum Einlesen und wandeln einer CSV Datei mit Vba

Code zum Einlesen und wandeln einer CSV Datei mit Vba
01.03.2024 12:27:55
Technikertipp
Liebe Community,
Ich versuche verzweifelt einen Code in VBA zu schreiben in dem Ich dem Ich im Excel mittels Button eine Datei beliebige CSV Datei Laden kann (es öffnet sich also einen Fenster in dem Ich eine Datei auswählen kann), die Datei wird in einen neuen Tabellenblatt geladen, wenn ein Tabellenblatt vorhanden ist dann wird der vorhandene vorher gelöscht, idealerweise werden die Daten automatisch in den Tabellenblatt „Protokoll“ kopiert.
Als ob das alles mit nicht jetzt schon überfordert kommt noch hinzu das die Daten in der CSV-Datei bis Zeile 16 Texte enthalten und ab Zeile 17 sind dann die Daten diese benötige ich als Dezimalzahl Import sonst erkenn Excel die nicht als Zahl und es wird nichts verarbeitet.
Was mir noch aufgefallen ist das ich immer ein Fehler bekomme wenn bereits vorher eine Datei geladen wurde weil die Verbindung immer bestehen bleibt diese muss daher auch gelöscht werden.

Die CSV wurde als TXT gespeichert unter dem Link https://www.herber.de/bbs/user/167446.txt

Eine andere Sache Ich habe von Yal bereits support zum Thema Verbindungen bekommen kann aber auf das Thema gar nicht mehr Antworten, warum? Ich kann auch nirgends im Forum ein Login Button finden?
LG Technikertipp

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Code zum Einlesen und wandeln einer CSV Datei mit Vba
01.03.2024 13:05:12
Luschi
Hallo Technikertipp,

für solche Standardaufgaben gibt es seit Excel 2016 das integrierte Tool 'Power Query'.
Hier mal meine Beispiel dazu: https://www.herber.de/bbs/user/167450.zip

Die zip-Datei in 1 leere Ordner entpacken und die xlsx-Datei starten. Im Unterverzeichnis befindet sich die csv-Datei.
Auf dem Tabellenblatt den Pfad zur csv-Datei anpassen und Tastenkombination Strg+Alt-F5 drücken.
Mehr braucht man nicht, vor allem kein Vba-Code oder Formeln.

Gruß von Luschi
aus klein-Paris
Nachfolgend die Möglichkeit per...
02.03.2024 10:25:07
Case
Moin, :-)

... VBA - ohne Verbindung nur mit Workbooks.Open. ;-)

Prinzipiell ist es nur ein Einzeiler:

' Variablendeklaration erforderlich!

' https://learn.microsoft.com/de-de/office/vba/language/reference/user-interface-help/option-explicit-statement
Option Explicit
' Pfad- und Dateiname anpassen!!!
Const strPathFile As String = "C:\TMP\Test.csv"
Public Sub Main_1()
' Erklärung der Parameter für Open - https://learn.microsoft.com/de-de/office/vba/api/excel.workbooks.open
' Hier ist besonders der Parameter Local (Local:=True) interessant.
Workbooks.Open Filename:=strPathFile, ReadOnly:=True, IgnoreReadOnlyRecommended:=True, Origin:=xlMSDOS, Local:=True, CorruptLoad:=XlCorruptLoad.xlRepairFile
End Sub


Das nur zum Anfang. Passe den Pfad- und Dateinamen an und schaue, ob du damit leben kannst. Wenn ja kommt Schritt 2: ;-)

Public Sub Main_2()

' Erklärung der Parameter für Open - https://learn.microsoft.com/de-de/office/vba/api/excel.workbooks.open
' Hier ist besonders der Parameter Local (Local:=True) interessant.
Workbooks.Open Filename:=strPathFile, ReadOnly:=True, IgnoreReadOnlyRecommended:=True, Origin:=xlMSDOS, Local:=True, CorruptLoad:=XlCorruptLoad.xlRepairFile
' Mit ActiveSheet können wir arbeiten, da eine mit Open geöffnete Datei - IN DER REGEL - immer die aktuelle ist.
' ActiveSheet.Copy erstellt eine neue Datei - und auch diese ist wieder - IN DER REGEL - die aktuelle Datei.
' Es wird eine neue Mappe mit dem einzigen Sheet der CSV-Datei erstellt.
ActiveSheet.Copy
' Die Zeilen 1 bis 16 werden gelöscht.
Rows("1:16").Delete
' Die Ursprungsdatei wird geschlossen. Da Workbooks.Close nur den Dateinamen ohne Pfad erwartet kürze ich hier mit Mid und InStRev.
Workbooks(Mid$(strPathFile, InStrRev(strPathFile, "\") + 1)).Close False
End Sub


Hier hast du die Daten jetzt in einem neuen Tabellenblatt. Wenn das halbwegs brauchbar ist kommen wir zu Schritt 3: ;-)

Public Sub Main_3()

' Variablendeklaration
Dim wksSheet As Worksheet
Dim strFile As String
' Wenn ein Fehler auftritt gehe zur angegebenen Sprungmarke
On Error GoTo Fin:
' Der Datei-Öffnen-Dialog eingeschränkt auf CSV-Dateien und ohne Mehrfachauswahl von Dateien.
strFile = Application.GetOpenFilename("CSV Dateien (*.csv), *.csv", , "CSV Filter", , False)
' Wenn NICHT Abbrechen geklickt wurde dann...
If strFile > "Falsch" Then
' Bildschirmaktualisierung aussschalten.
' https://learn.microsoft.com/de-de/office/vba/api/excel.application.screenupdating
Application.ScreenUpdating = False
' Fehlermeldungen unterdrücken bzw. die Standardantwort wird automatisch gegeben.
' https://learn.microsoft.com/de-de/office/vba/api/excel.application.displayalerts
Application.DisplayAlerts = False
' Schleife über alle Tabellenblätter der Datei mit diesem Code.
For Each wksSheet In ThisWorkbook.Worksheets
' Ist der Tabellenblattname "Protokoll" dann lösche dieses Tabellenblatt.
If wksSheet.Name = "Protokoll" Then wksSheet.Delete
Next wksSheet
' Erklärung der Parameter für Open - https://learn.microsoft.com/de-de/office/vba/api/excel.workbooks.open
' Hier ist besonders der Parameter Local (Local:=True) interessant.
Workbooks.Open Filename:=strPathFile, ReadOnly:=True, IgnoreReadOnlyRecommended:=True, Origin:=xlMSDOS, Local:=True, CorruptLoad:=XlCorruptLoad.xlRepairFile
' Das erste - und bei einer CSV-Datei einzige - Tabellenblatt wird in die Datei mit diesem Makro an die erste Position verschoben.
' !!!!! Ein Workbooks.Close ist hier nicht erforderlich, da ich das einzige Tabellenblatt verschiebe.
' !!!!! Eine Mappe ohne Tabellenblatt geht nicht. Die Datei wird automatisch geschlossen.
Workbooks(Mid$(strFile, InStrRev(strFile, "\") + 1)).Worksheets(1).Move Before:=ThisWorkbook.Worksheets(1)
' Und erhält den Namen "Protokoll".
ThisWorkbook.Worksheets(1).Name = "Protokoll"
' Die Zeilen 1 bis 16 werden gelöscht.
ThisWorkbook.Worksheets(1).Rows("1:16").Delete
End If
Fin:
' Bildschirmaktualisierung einschalten.
' https://learn.microsoft.com/de-de/office/vba/api/excel.application.screenupdating
Application.ScreenUpdating = True
' Fehlermeldungen wieder aktivieren.
' https://learn.microsoft.com/de-de/office/vba/api/excel.application.displayalerts
Application.DisplayAlerts = True
' Wenn ein Fehler aufgetreten ist gib ihn mit Nummer und Beschreibung aus.
If Err.Number > 0 Then MsgBox "Error: " & Err.Number & " " & Err.Description
End Sub


Das sollte dem was du möchtest doch recht nahe kommen. ;-)

Der Code ist ausreichend kommentiert und mit nützlichen Links versehen. ;-)

Nicht alle Parameter die ich bei "Open" verwende sind notwendig. Schau dir dazu den Link an und setze die Parameter nach deinen Vorstellungen bzw. Bedürfnissen.

Hier nochmal als Ganzes: ;-)

' Variablendeklaration erforderlich!

' https://learn.microsoft.com/de-de/office/vba/language/reference/user-interface-help/option-explicit-statement
Option Explicit
' Pfad- und Dateiname anpassen!!!
Const strPathFile As String = "C:\TMP\Test.csv"
Public Sub Main_1()
' Erklärung der Parameter für Open - https://learn.microsoft.com/de-de/office/vba/api/excel.workbooks.open
' Hier ist besonders der Parameter Local (Local:=True) interessant.
Workbooks.Open Filename:=strPathFile, ReadOnly:=True, IgnoreReadOnlyRecommended:=True, Origin:=xlMSDOS, Local:=True, CorruptLoad:=XlCorruptLoad.xlRepairFile
End Sub
Public Sub Main_2()
' Erklärung der Parameter für Open - https://learn.microsoft.com/de-de/office/vba/api/excel.workbooks.open
' Hier ist besonders der Parameter Local (Local:=True) interessant.
Workbooks.Open Filename:=strPathFile, ReadOnly:=True, IgnoreReadOnlyRecommended:=True, Origin:=xlMSDOS, Local:=True, CorruptLoad:=XlCorruptLoad.xlRepairFile
' Mit ActiveSheet können wir arbeiten, da eine mit Open geöffnete Datei - IN DER REGEL - immer die aktuelle ist.
' ActiveSheet.Copy erstellt eine neue Datei - und auch diese ist wieder - IN DER REGEL - die aktuelle Datei.
' Es wird eine neue Mappe mit dem einzigen Sheet der CSV-Datei erstellt.
ActiveSheet.Copy
' Die Zeilen 1 bis 16 werden gelöscht.
Rows("1:16").Delete
' Die Ursprungsdatei wird geschlossen. Da Workbooks.Close nur den Dateinamen ohne Pfad erwartet kürze ich hier mit Mid und InStRev.
Workbooks(Mid$(strPathFile, InStrRev(strPathFile, "\") + 1)).Close False
End Sub
Public Sub Main_3()
' Variablendeklaration
Dim wksSheet As Worksheet
Dim strFile As String
' Wenn ein Fehler auftritt gehe zur angegebenen Sprungmarke
On Error GoTo Fin:
' Der Datei-Öffnen-Dialog eingeschränkt auf CSV-Dateien und ohne Mehrfachauswahl von Dateien.
strFile = Application.GetOpenFilename("CSV Dateien (*.csv), *.csv", , "CSV Filter", , False)
' Wenn NICHT Abbrechen geklickt wurde dann...
If strFile > "Falsch" Then
' Bildschirmaktualisierung aussschalten.
' https://learn.microsoft.com/de-de/office/vba/api/excel.application.screenupdating
Application.ScreenUpdating = False
' Fehlermeldungen unterdrücken bzw. die Standardantwort wird automatisch gegeben.
' https://learn.microsoft.com/de-de/office/vba/api/excel.application.displayalerts
Application.DisplayAlerts = False
' Schleife über alle Tabellenblätter der Datei mit diesem Code.
For Each wksSheet In ThisWorkbook.Worksheets
' Ist der Tabellenblattname "Protokoll" dann lösche dieses Tabellenblatt.
If wksSheet.Name = "Protokoll" Then wksSheet.Delete
Next wksSheet
' Erklärung der Parameter für Open - https://learn.microsoft.com/de-de/office/vba/api/excel.workbooks.open
' Hier ist besonders der Parameter Local (Local:=True) interessant.
Workbooks.Open Filename:=strPathFile, ReadOnly:=True, IgnoreReadOnlyRecommended:=True, Origin:=xlMSDOS, Local:=True, CorruptLoad:=XlCorruptLoad.xlRepairFile
' Das erste - und bei einer CSV-Datei einzige - Tabellenblatt wird in die Datei mit diesem Makro an die erste Position verschoben.
' !!!!! Ein Workbooks.Close ist hier nicht erforderlich, da ich das einzige Tabellenblatt verschiebe.
' !!!!! Eine Mappe ohne Tabellenblatt geht nicht. Die Datei wird automatisch geschlossen.
Workbooks(Mid$(strFile, InStrRev(strFile, "\") + 1)).Worksheets(1).Move Before:=ThisWorkbook.Worksheets(1)
' Und erhält den Namen "Protokoll".
ThisWorkbook.Worksheets(1).Name = "Protokoll"
' Die Zeilen 1 bis 16 werden gelöscht.
ThisWorkbook.Worksheets(1).Rows("1:16").Delete
End If
Fin:
' Bildschirmaktualisierung einschalten.
' https://learn.microsoft.com/de-de/office/vba/api/excel.application.screenupdating
Application.ScreenUpdating = True
' Fehlermeldungen wieder aktivieren.
' https://learn.microsoft.com/de-de/office/vba/api/excel.application.displayalerts
Application.DisplayAlerts = True
' Wenn ein Fehler aufgetreten ist gib ihn mit Nummer und Beschreibung aus.
If Err.Number > 0 Then MsgBox "Error: " & Err.Number & " " & Err.Description
End Sub
Anzeige
AW: Code zum Einlesen und wandeln einer CSV Datei mit Vba
02.03.2024 10:49:37
schauan
Hallöchen,

"Eine andere Sache Ich habe von Yal bereits support zum Thema Verbindungen bekommen kann aber auf das Thema gar nicht mehr Antworten, warum? Ich kann auch nirgends im Forum ein Login Button finden?
LG Technikertipp"


1) Die Themen kommen nach gut einer Woche in den Archivbereich. Du kannst z.B. einen neuen Beitrag erstellen und einen Link zum alten reinsetzen.
2) hier gibt es kein Login. Man braucht es auch nicht. Lasse die Felder für Name, Passwort und Email-Adresse immer ausgefüllt.

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige