Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Dynamischer Zugriff auf geschlossene CSV Dateien

Dynamischer Zugriff auf geschlossene CSV Dateien
27.01.2016 13:12:59
Rico
Guten Tag zusammen,
ich habe da ein Problem welchen ja schon sehr häufig in den verschiedensten Foren diskutiert wurde. Leider habe ich noch keinen Lösungsansatz gefunden den ich so gut verstehe dass ich ihn an meine Gegebenheiten anpassen konnte.
Also erst einmal zu den Gegebenheiten.
Wir werten all unsere Produktionsaufträge nach Energieverbräuchen aus. Dazu wird von einem externen Programm der Verbrauch ermittelt und die Ergebnisse werden in eine CSV Datei gespeichert. Diese ist vom Aufbau her immer gleich. Ein Zellbezug ist also möglich.
Folgende Zellen der Datei werden benötigt A1;B5;B9
Der Dateiname ist allerdings immer unterschiedlich. All diese generierten Dateien liegen fest in einer immer gleichbleibenden Ordnerstruktur.
In meinem Fall ist das: N:\FKW\Produktion\Auftragsauswertung Energieverbrauch\Excel Data\
Mit jedem neuen Auftrag den wir erledigt haben kommt also in dieser Struktur eine CSV Datei hinzu.
Nun habe ich vor mit einer Excel Tabelle oben benannte Zellen aus allen CSV Dateien auszulesen um diese mit einander Vergleichen zu können.
In meiner Excel Datei habe ich mir ein Makro eingebaut welches in der ober beschriebenen Ordnerstruktur nach CSV Dateien sucht und mir alle gefundenen Dateinamen untereinander in meine Spalte A ab Zeile 7 einträgt.
Das funktioniert bisher auch super. In Spalte D,E und F zerlege ich die gefundenen Dateinamen und lasse mir nur bestimmte Bereiche des Namens anzeigen. (Um den Dateinamen zu entschlüsseln)
Nun möchte ich in den folgenden drei Spalten (G;H;I) jeweils einen Zellwert der CSV Datei die in Spalte A gelistet ist angezeigt bekommen. (In Spalte G den Wert der Zelle A1, in Spalte H den Wert der Zelle B5 und in Spalte I den Wert der Zellen B9)
Diese sind aber immer unterschiedlich im Namen wie auch in der Anzahl. (Momentan sind es noch 11 Dateien, in einem Monat können es aber auch schon 50 Dateien sein)
Da ich die Dateien natürlich nicht alle von Hand öffnen möchte, fällt die Funktion Indirekt ja schon mal aus. Mit allen VBA Lösungen die ich im Netz bisher gefunden habe bin ich noch nicht weiter gekommen, da ich sie schlichtweg nicht verstehe 
Auch den nachfolgenden Vorschlag habe ich bereits versucht umzusetzen, allerdings ist dies nicht geglückt.
http://www.excelformeln.de/tips.html?welcher=107
Ich hoffe es ist trotz des vielen Texts noch zu verstehen welches Problem ich habe, ich bin über jeglichen Tipp und Hilfestellungen dankbar.
Gruß Rico

Anzeige

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Dynamischer Zugriff auf geschlossene CSV Dateien
27.01.2016 14:17:12
Michael
Hi Rico,
ich sehe das Problem darin, daß eine .CSV Datei eine reine TEXTDATEI ist und eben keine Excel-Datei.
Excel kann eine CSV zwar öffnen, und es sieht dann aus wie eine Excel-Datei, in der üblichen Zeilen-/Spalten-Struktur, aber es ist erst "richtiges" Excel, sobald die Datei als .xls(x) gespeichert wird.
Das ist der Knackpunkt im Excelformeln-Beispiel.
Eine Textdatei hat eben KEINE Zellen á la A1 oder B5.
Ich sehe zwei Wege:
a) die jeweilige CSV in Excel explizit öffnen, die benötigten Daten auslesen und wieder schließen.
(ohnehin kann keine Datei gelesen werden, ohne daß sie im Hintergrund "geöffnet" wird)
b) die Textdatein als TEXT auslesen.
Ich persönlich würde fast b) vorziehen, aber dazu würde ich gerne wissen, wie sie aussieht.
Wenn es datenschutzmäßig unbedenklich ist, schnapp Dir mal ne CSV im Explorer, Kontextmenü öffnen mit Editor, lösche alle Zeile ab 10 oder so raus und speichere sie als .TXT, dann kannst Du sie hochladen.
Schöne Grüße,
Michael
P.S.: Ach, das noch: ist es so, daß eine einmal erzeugte Datei nicht mehr geändert wird? D.h., man müßte dann auch nur Datein einlesen, die neuer sind als die zuletzt importierte...

Anzeige
AW: Dynamischer Zugriff auf geschlossene CSV Dateien
27.01.2016 14:54:56
Rudi
Hallo,
als Ansatz:
Sub aaa()
Dim arr(2), lRow As Long, sFile As String, sTmp As String, i As Integer
Const sPfad = "N:\FKW\Produktion\Auftragsauswertung Energieverbrauch\Excel Data\"
sFile = Dir(sPfad & "*.csv")
Do While sFile  ""
lRow = Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row + 1
Open sPfad & sFile For Input As #1
For i = 1 To 9
Line Input #1, sTmp
Select Case i
Case 1: arr(0) = Split(sTmp, ";")(0)
Case 5: arr(1) = Split(sTmp, ";")(1)
Case 9: arr(2) = Split(sTmp, ";")(1)
End Select
Next i
Close #1
Sheets(1).Cells(lRow, 1) = sFile  'Dateiname
Sheets(1).Cells(lRow, 7).Resize(, 3) = arr  'die 3 Werte
sFile = Dir
Loop
End Sub
Gruß
Rudi

Anzeige
AW: Dynamischer Zugriff auf geschlossene CSV Dateien
28.01.2016 09:15:58
Rico
Hallo ihr zwei,
danke erst mal für die schnellen Antworten.
@Rudi
Deinen Vorschlag habe ich mal eingebaut und so wie er ist getestet. Leider bekomme ich dann direkt einen Laufzeitfehler 62. Die Zeile Line Input #1, sTmp wird makiert.
@Michael
Danke für den Hinweis mit der CSV Problematik. Das war mir so gar nicht bewusst. Ich habe dir mal eine CSV als TXT beigefügt. Sie ist unverändert und die Dateien sehen immer so aus. Bezüglich deiner Frage ob die Daten sich verändern kann ich dir noch keine 100% Antwort geben. Eigentlich sollten Sie sich nicht mehr ändern, da es aber noch ein paar Probleme mit der Software gibt könnte es sein das sich in der Anfangsphase die Daten doch noch ändern. Es wäre also vielleicht sicherer bei jedem Ausführen des Makros alle Daten einzulesen.
https://www.herber.de/bbs/user/103092.txt
Gruß Rico

Anzeige
AW: Dynamischer Zugriff auf geschlossene CSV Dateien
28.01.2016 12:24:04
Rudi
Hallo,
dann hat die Datei keinen Inhalt.
Die angehängte Datei ist auch falsch. Hat keine 9 Zeilen. Wie soll da B9 ausgelesen werden?
Gruß
Rudi

AW: Dynamischer Zugriff auf geschlossene CSV Dateien
28.01.2016 14:41:15
Rico
Hallo,
habe den Fehler gefunden. Du hast natürlich Recht mit den Zeilen, habe mich von Excel verwirren lassen. Öffnet man die CSV in Excel hat sie 9 Zeilen obwohl es eigentlich nur 7 sind.
Das funktioniert jetzt auch super. Aber ein Problem habe ich noch. Wenn ich das Makro ausführe schreibt es mir die Daten in meine Excel Tabelle nicht an die Stelle wo ich die Daten haben möchte. Der erste ausgelesene Wert soll in Zeile 7 geschrieben werden. Führe ich das Makro aus schreibt es mir den ersten Wert in die erste freie Zeile. Da in Spalte A Zeile 7 bis Zeile X ja aber die Dateinamen stehen, stehen die ausgelesenen Daten immer erst unter dem letzten Dateiname.
Wie kann ich das abändern?
Gruß und vielen Dank für eure geniale Hilfe.
Rico

Anzeige
wenn ich es richtig verstehe...
28.01.2016 15:38:27
Michael
Hi zusammen,
die Textdatei sieht doch so aus:
Anlage C: 14.12.2015 17:00:00 - 15.12.2015 03:10:00
Bereich;Summe;Einheit
Anlage C Gas;95,29 ;Nm³
Anlage C Gas;952,86 ;kWh
Anlage C Strom;908,90 ;kWh
Anlage C Strom Global;0,54 ;kWh
Betriebsstrom;32,27 ;kWh
Stromverbrauch Gesamt;941,71 ;kWh
@Rudi: das SIND doch 9 Zeilen?!
Du willst also die 1. Zeile komplett (kein ";") und dann die 952,86 aus Zeile 5 und die 941,71 aus Zeile 9, richtig?
Du schreibst ja in der 1. Nachricht, daß Du die Dateinamen bereits ausgelesen hast, in Spalte A bzw. D-F, und zwar ab Zeile 7.
Also muß man Rudis Makro nur etwas ändern, etwa so:
Option Explicit
Sub einlesen()
Dim arr(2), lRow As Long, sFile As String, sTmp As String
Dim i As Integer, z As Long
lRow = Sheets(1).Range("A" & Rows.Count).End(xlUp).Row
If lRow  "" Then
Open sFile For Input As #1
For i = 1 To 9
Line Input #1, sTmp
Select Case i
Case 1: arr(0) = Split(sTmp, ";")(0)
Case 5: arr(1) = Split(sTmp, ";")(1)
Case 9: arr(2) = Split(sTmp, ";")(1)
End Select
Next i
Close #1
Sheets(1).Cells(z, 7).Resize(, 3) = arr  'die 3 Werte
Else
Sheets(1).Cells(z, 7).Value = "Datei nicht gefunden"
End If
Next
End Sub
Schöne Grüße,
Michael

Anzeige
AW: wenn ich es richtig verstehe...
28.01.2016 16:30:31
Rico
Hallo Michael,
deine Lösung ist jetzt fast perfekt! Danke schonmal.
Rudi scheint aber Recht zu haben mit den 7 Zeilen, denn wenn ich For i = 1 To 9 und Case 9: arr(2) = Split(sTmp, ";")(1) so stehen lasse funktioniert es nicht. Ersetze ich die zwei 9en durch 7 funktioniert es und ich bekomme korrekte Ergebnisse.
Da du gerade gefragt hast ob ich Zeile 1 komplett benötige muss ich gestehen das ich eigentlich nur den Anfang brauche und zwar immer nur die Anlage, also bis zum ersten : in der Zeile. Das hätte ich mir jetzt noch irgendwie über normale funktionen zurecht gekürzt.
Aber wenn sich das evtl. einfach mit einbauen lässt würde mir das natürlich Arbeit und eine Tabellenspalte ersparen.
Gruß und noch mal vielen Dank!
Rico

Anzeige
ahaaa...
28.01.2016 20:56:44
Michael
Hi zusammen,
ich hatte mir den Text aus dem Browser kopiert, da waren es 9 Zeilen.
Egal, was Du möchtest, könnte man so machen:
Case 1: arr(0) = Split(Split(sTmp, ";")(0), ":")(0)
Schöne Grüße,
Michael

AW: ahaaa...
01.02.2016 10:48:44
Rico
Hallo zusammen,
ich hätte da noch zwei kleine Fragen.
Wie weiter oben beschrieben stehen bei mir in Spalte A die Dateinamen. Diese werden nicht handschriftlich eingetragen sondern durch eine Formel dort eingefügt.
Wenn ich nun das Makro starte liefert es mir am Ende eine Laufzeitfehler weil z.B. in Zelle A51 - A200 keine Dateinamen enthalten sind aber diese durch die hinterlegte Formel halt auch nicht "leer" sind.
Lässt sich das irgendwie lösen? Die Ergebnisse sind zwar absolut korrekt aber eine Fehlermeldung sieht ja doch irgendwie unschön aus.
Meine zweite Frage bringt mich fast zum verzweifeln, weil ich es schon einmal gelöst hatte mir aber keine Sicherungskopie dazu erstellt habe, und nun bekomme ich es einfach nicht mehr hin.....
Meine Dateinamen in Spalte A7 .... sehen in etwa so aus
DN1000_PR 75-29.3_023_5014887.CSV
DN1200_PKSplus 42-4.9_023_5014933.CSV
nun möchte ich in Spalte F nur die Materialkennzahl sehen. Diese ist die 3 stellige Zahl zwischen den "_" also in den obigen Fällen "023"
Leider ist links und rechts davon der Text immer unterschiedlich lang, und mit finden() bekomme ich immer Probleme mit dem ersten "_" am Anfang nach DN....
Kann mir da villeicht jemand auf die sprünge helfen, ich habe schon gefühlt 100 Varianten von =teil;finden;suchen;rechts;links etc. ausprobiert.
Vielen Dank schon im Voraus,
Gruß
Rico

Anzeige
AW: ahaaa...
01.02.2016 16:09:20
Michael
Hi Rico,
wir sind anscheinend von der stillschweigenden Voraussetzung ausgegangen, daß Du die Dateinamen *auch* via Makro einliest und nicht via Formeln...
Mache einfach noch ein IF außenrum und frage ab, ob .value leer ist (oder meinetwegen len() zu klein), insgesamt also z.B.:
Option Explicit
Sub einlesen()
Dim arr(2), lRow As Long, sFile As String, sTmp As String
Dim i As Integer, z As Long
lRow = Sheets(1).Range("A" & Rows.Count).End(xlUp).Row
If lRow  5 Then
If Dir(sFile)  "" Then
Open sFile For Input As #1
For i = 1 To 7
Line Input #1, sTmp
Select Case i
Case 1: arr(0) = Split(Split(sTmp, ";")(0), ":")(0)
Case 5: arr(1) = Split(sTmp, ";")(1)
Case 7: arr(2) = Split(sTmp, ";")(1)
End Select
Next i
Close #1
Sheets(1).Cells(z, 7).Resize(, 3) = arr  'die 3 Werte
Else
Sheets(1).Cells(z, 7).Value = "Datei nicht gefunden"
End If
Else
Sheets(1).Cells(z, 7).Value = "kein Name vorhanden"
End If
Next
End Sub
Die Formel für A11 zum Rauf- und Runterkopieren =TEIL(A11;FINDEN("_";A11;8)+1;3)
geht allerdings davon aus, daß das erste "_" VOR Position 8 steht.
Schöne Grüße,
Michael
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

Dynamischer Zugriff auf geschlossene CSV Dateien


Schritt-für-Schritt-Anleitung

  1. CSV-Dateien vorbereiten: Stelle sicher, dass alle deine CSV-Dateien im gleichen Ordner liegen und den gleichen Aufbau haben, sodass du die notwendigen Zellen auslesen kannst.

  2. Makro öffnen: Öffne deine Excel-Datei und drücke ALT + F11, um den VBA-Editor zu öffnen.

  3. Neues Modul erstellen: Klicke auf Einfügen > Modul, um ein neues Modul zu erstellen.

  4. VBA-Code hinzufügen: Kopiere und füge den folgenden VBA-Code ein:

    Sub einlesen()
        Dim arr(2), lRow As Long, sFile As String, sTmp As String
        Dim i As Integer, z As Long
        Const sPfad = "N:\FKW\Produktion\Auftragsauswertung Energieverbrauch\Excel Data\"
        sFile = Dir(sPfad & "*.csv")
    
        Do While sFile <> ""
            lRow = Sheets(1).Range("A" & Rows.Count).End(xlUp).Row + 1
            Open sPfad & sFile For Input As #1
            For i = 1 To 7
                Line Input #1, sTmp
                Select Case i
                    Case 1: arr(0) = Split(Split(sTmp, ";")(0), ":")(0) ' Anlage bis :
                    Case 5: arr(1) = Split(sTmp, ";")(1) ' Wert aus Zeile 5
                    Case 7: arr(2) = Split(sTmp, ";")(1) ' Wert aus Zeile 7
                End Select
            Next i
            Close #1
            Sheets(1).Cells(lRow, 1) = sFile  ' Dateiname
            Sheets(1).Cells(lRow, 7).Resize(, 3) = arr  ' Werte in Spalten G, H, I
            sFile = Dir
        Loop
    End Sub
  5. Makro ausführen: Schließe den VBA-Editor und gehe zurück zu Excel. Drücke ALT + F8, wähle dein Makro aus und klicke auf Ausführen.


Häufige Fehler und Lösungen

  • Laufzeitfehler 62: Dieser Fehler tritt auf, wenn die CSV-Datei leer ist oder nicht richtig geöffnet werden kann. Stelle sicher, dass die Datei vorhanden ist und Daten enthält.

  • Daten werden an falscher Stelle geschrieben: Achte darauf, dass der Startwert für lRow korrekt initialisiert wird, sodass die Daten in der gewünschten Zeile erscheinen (z.B. Zeile 7).

  • Fehler wegen leerer Zellen: Wenn in Spalte A keine Dateinamen stehen, füge eine Überprüfung im Makro hinzu, um sicherzustellen, dass nur nicht-leere Zellen verarbeitet werden.


Alternative Methoden

  • Power Query: Du kannst Power Query verwenden, um CSV-Dateien direkt zu importieren und auszuwerten. Dies ist eine benutzerfreundliche Methode, um Daten aus mehreren CSV-Dateien zu kombinieren.

  • Textdateien direkt lesen: Statt die CSV-Datei als Excel-Datei zu betrachten, kannst du sie als Textdatei auslesen, was einige der Probleme mit Zellreferenzen umgeht.


Praktische Beispiele

  • CSV Datei auslesen: Angenommen, du hast eine CSV-Datei mit folgendem Inhalt:

    Anlage C: 14.12.2015 17:00:00;95,29;Nm³
    Anlage C Gas;95,29;Nm³

    Mit dem obigen Makro kannst du die Werte aus bestimmten Zeilen und Spalten auswerten und in deiner Excel-Tabelle darstellen.

  • Materialkennzahl extrahieren: Um die Materialkennzahl zwischen den Unterstrichen zu extrahieren, verwende folgende Formel in Spalte F:

    =TEIL(A7;FINDEN("_";A7;8)+1;3)

Tipps für Profis

  • Dynamische Ordnerpfade: Verwende Umgebungsvariablen oder Benutzerformulare, um den Ordnerpfad dynamisch zu gestalten und die Wartung des Codes zu erleichtern.

  • Fehlerbehandlung: Implementiere Fehlerbehandlungsroutinen in dein Makro, um unvorhergesehene Fehler abzufangen und sinnvoll zu reagieren.

  • Regelmäßige Updates: Wenn du regelmäßig neue CSV-Dateien hinzufügst, stelle sicher, dass dein Makro so konfiguriert ist, dass es nur neue oder geänderte Dateien auswertet, um die Effizienz zu steigern.


FAQ: Häufige Fragen

1. Wie kann ich die Struktur der CSV-Datei überprüfen? Du kannst die CSV-Datei in einem Texteditor oder in Excel öffnen, um den Aufbau der Daten zu überprüfen.

2. Was mache ich, wenn die CSV-Datei nicht gefunden wird? Überprüfe den angegebenen Ordnerpfad. Stelle sicher, dass die Dateinamen korrekt sind und die Datei vorhanden ist.

3. Kann ich die Daten auch automatisch aktualisieren? Ja, du kannst das Makro so einstellen, dass es beim Öffnen der Excel-Datei automatisch ausgeführt wird, um die Daten zu aktualisieren.

4. Gibt es eine Möglichkeit, mehrere CSV-Dateien gleichzeitig auszulesen? Ja, das oben beschriebene Makro kann so angepasst werden, dass es alle CSV-Dateien im angegebenen Ordner durchläuft und die Daten ausliest.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige