Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1468to1472
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

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

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

304 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige