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

Forumthread: Alle *.csv-Dateien eines Ordners aktualisieren

Alle *.csv-Dateien eines Ordners aktualisieren
13.05.2013 13:43:15
Johannes
Hallo,
ich bin neu hier im Forum und habe kaum bis keine Kenntnisse in VBA, da ich sonst auch nicht drauf angewiesen bin. Ich hab das Forum schon ein wenig durchforstet, konnte aber bisher nur bedingt Hilfe für mein Problem finden, was auch an meinen fehlenden Kenntnissen liegt um die gefundenen Beispiele gezielt abzuwandeln.
Nun zu meinem Problem.
Ich habe ein C++-Programm geschrieben welches mir 10 *.csv-Dateien (*.txt-Dateien wären auch kein Problem) erzeugt, bzw. immer neue Datensätze an die bestehenden Dateien anhängt. Ich möchte gern die Daten in einer Excel-Datei auswerten, die für jede csv-Datei ein Worksheet beinhalten soll. Beim Öffnen der Excel-Datei sollen dann die csv-Dateien automatisch erneut eingelesen und die dazugehörigen Worksheets aktualisiert werden.
Ich hoffe ich habe mich einigermaßen verständlich ausgedrückt.
Vielen Dank im Voraus. Für hilfreiche Hinweise zur Lösung meines Problems.
Johannes

Anzeige

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Alle *.csv-Dateien eines Ordners aktualisieren
13.05.2013 14:28:08
fcs
Hallo Johannes,
die Daten der CSV/TXT-Dateien kannst du mit der Daten-Import-Funktion in Excel in 10 Blätter der Exceldatei importieren. Die Eigenschaften der Datenabfrage kannst dabei so einrichten, dass die Daten beim Öffnen der Exceldatei automatisch aktualisiert werden.
Ob dann zusätzlich noch VBA-Programmierung erforderlich ist, damit deine Auswertungen funktionieren, hängt davon ab wie du deine Auswertungen machst.
Gruß
Franz

Anzeige
AW: Alle *.csv-Dateien eines Ordners aktualisieren
13.05.2013 15:36:11
Johannes
Vielen Dank,
das funktioniert schon sehr gut. Gibt es eine ähnlich einfache Lösung um Änderungen am Inhalt, die ich unter Excel an den einzelnen Worksheets vornehm, dann auch automatisch beim schließen der Datei in die entsprechnde csv-Dateien übernommen werden - ich such also eine Daten-Export-Funktion.
mfg

Anzeige
AW: Alle *.csv-Dateien eines Ordners aktualisieren
13.05.2013 16:03:50
Rudi
Hallo,
eine Möglichkeit.
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim wks As Worksheet
For Each wks In Worksheets
prcCreateCSV wks
Next
End Sub
Public Sub prcCreateCSV(wks As Worksheet)
Dim intFileNumber As Integer
Dim lngRow As Long
Dim vntArray As Variant
Dim intItem As Integer
Dim strText As String
Dim i As Integer
Const strSep As String = ";"
With wks.Cells(1, 1).CurrentRegion
For lngRow = 1 To .Rows.Count
vntArray = .Cells(lngRow, 1).Resize(, .Columns.Count)
vntArray = WorksheetFunction.Transpose(WorksheetFunction.Transpose(vntArray))
If strText = "" Then
strText = Join(vntArray, strSep)
Else
strText = strText _
& vbCrLf _
& IIf(lngRow = .Rows.Count, Join(vntArray, ";"), Join(vntArray, strSep))
End If
Next
End With
intFileNumber = FreeFile
With wks
Open .Parent.Path & "\" & .Name & ".csv" For Output As #intFileNumber
End With
Print #intFileNumber, strText
Close #intFileNumber
End Sub

Gruß
Rudi

Anzeige
AW: Alle *.csv-Dateien eines Ordners aktualisieren
13.05.2013 17:55:51
Johannes
Vielen Dank,
aber ich muss wohl morgen noch ein wenig daran rumbasteln, da in dieser Version nur die erste Zeile jedes Sheets gespeichert wird, dazu kommen auch noch "Formatierungsfehler", d.h. ich hab ne Uhrzeit, die dann auf einmal als Dezimalzahl vorliegt. naja, ich werd mich morgen drum kümmern.
So sollen die Daten in der csv-Datei aussehen:
13.05.2013;17:51;;;
;;;;
Objektiv;1x;1x;;
Seriennummer;12;12;;
Zustand;kalt;warm;;
12 8b;187;188;;
15 81;187;188;;
8 a2;187;188;;
Widerstand;56;;;
Kommentar;blubb;;;
;;;;
13.05.2013;17:51;;;
;;;;
Objektiv;1x;1x;;
Seriennummer;12;12;;
Zustand;kalt;warm;;
12 8b;187;188;;
15 81;187;188;;
8 a2;187;188;;
Widerstand;56;;;
Kommentar;blubb2;;;
;;;;
Mit deinem Code siehts dann so aus:
13.05.2013;0,729166666666667
Danke trotzdem. ich wünsch allen, die mir geholfen haben einen schönen Feierabend.
mfg
Maik

Anzeige
AW: Alle *.csv-Dateien eines Ordners aktualisieren
14.05.2013 09:56:50
Rudi
Hallo,
ersetze
With wks.Cells(1, 1).CurrentRegion
durch
With wks.Cells(1, 1).UsedRange
Gruß
Rudi

AW: Alle *.csv-Dateien eines Ordners aktualisieren
16.05.2013 09:26:56
Johannes
Hallo,
ich habs grad mal probiert und die Zeile in meinem bestehenden Code ersetzt, leider führt das zur Felermeldung: Laufzeitfehler '438' - Objekt unterstützt diese Methode oder Eigenschft nicht.
Allerdings habe ich den Code mit zusammgestückelten Code-Fragmenten aus dem weiten Netz so hinbekommen, dass es einigermaßen läuft (man kann sich ja nie sicher sein). Dabei wird jetzt jedes Sheet der Reihe nach aktiviert und geschaut, wieviele Zeilen und Spalten genutzt werden und demnach dann gespeichert. Jetzt scheint es auch keine Probleme mehr mit leeren Tabellenblättern zu geben.
Hier mal der aufwendigere Code mit noch einpaar auskommentierten "Testzeilen". Zusätzlich ist jetzt eine überdimensionierte Variante einer Funktion drin, die die letzten benutzten Spalten und Zeilen ausspuckt. Ich weiß auch nicht, ob da redundante oder überflüssige Zeilen drin sind, da ich den Code auch nicht zur Gänze verstanden hab.

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim wks As Worksheet
Dim nummer As Integer
nummer = 0
For Each wks In Worksheets
nummer = nummer + 1
prcCreateCSV wks, nummer
Next
End Sub
Public Sub prcCreateCSV(wks As Worksheet, nummer As Integer)
Dim intFileNumber As Integer
Dim lngRow As Long
Dim vntArray As Variant
Dim intItem As Integer
Dim strText As String
Dim strText2 As String
Dim i, j, LastRow, LastColumn As Integer
Const strSep As String = ";"
Dim rng As Range
'Set wks = ActiveWorkbook.Worksheets(nummer)
With wks.Cells(1, 1).CurrentRegion
'With wks.Cells(1, 1).UsedRange
Sheets(nummer).Activate
Set rng = Sheets(nummer).Cells
'i = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
'j = ActiveSheet.UsedRange.Columns.Count
LastRow = Last(1, rng)
LastColumn = Last(2, rng)
strText2 = ActiveSheet.CodeName
'If i > 0 Then
For lngRow = 1 To LastRow
'vntArray = .Cells(lngRow, 1).Resize(, ActiveSheet.UsedRange.Columns.Count)
vntArray = .Cells(lngRow, 1).Resize(, LastColumn)
vntArray = WorksheetFunction.Transpose(WorksheetFunction.Transpose(vntArray))
If strText = "" Then
strText = Join(vntArray, strSep)
Else
strText = strText _
& vbCrLf _
& IIf(lngRow = LastRow, Join(vntArray, ";"), Join(vntArray, strSep))
'& IIf(lngRow = .Rows.Count, Join(vntArray, ";"), Join(vntArray, strSep))
End If
Next
'End If
End With
intFileNumber = FreeFile
With wks
Open .Parent.Path & "\" & .Name & ".csv" For Output As #intFileNumber
End With
Print #intFileNumber, strText
Close #intFileNumber
End Sub
Function Last(choice As Long, rng As Range)
'Ron de Bruin, 5 May 2008
' 1 = last row
' 2 = last column
' 3 = last cell
Dim lrw As Long
Dim lcol As Long
Select Case choice
Case 1:
On Error Resume Next
Last = rng.Find(What:="*", _
After:=rng.Cells(1), _
Lookat:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Row
On Error GoTo 0
Case 2:
On Error Resume Next
Last = rng.Find(What:="*", _
After:=rng.Cells(1), _
Lookat:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByColumns, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Column
On Error GoTo 0
Case 3:
On Error Resume Next
lrw = rng.Find(What:="*", _
After:=rng.Cells(1), _
Lookat:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Row
On Error GoTo 0
On Error Resume Next
lcol = rng.Find(What:="*", _
After:=rng.Cells(1), _
Lookat:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByColumns, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Column
On Error GoTo 0
On Error Resume Next
Last = rng.Parent.Cells(lrw, lcol).Address(False, False)
If Err.Number > 0 Then
Last = rng.Cells(1).Address(False, False)
Err.Clear
End If
On Error GoTo 0
End Select
End Function

Vielen Dank für den Denkanstoß, vielleicht hilfts ja auch jemand anderem.
mfg

Anzeige
AW: Alle *.csv-Dateien eines Ordners aktualisieren
13.05.2013 14:44:09
windalf
Wenn du erst in Excel auswerten willst warum schreibst du dann nicht einfach direkt von c/c++ nach Excel. Stichwort "Office Automation"...

AW: Alle *.csv-Dateien eines Ordners aktualisieren
13.05.2013 15:57:39
Johannes
Vielen Dank für den Tip,
ich werd mich mal ein wenig einlesen, doch da die Erfordernisse momentan nur sehr gering sind, weiß ich noch nicht ob es momentan viel Sinn macht sich da einzuarbeiten.
mfg
Johannes
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Alle *.csv-Dateien eines Ordners aktualisieren


Schritt-für-Schritt-Anleitung

Um alle *.csv-Dateien eines Ordners zu aktualisieren und die Daten in Excel auszuwerten, folge diesen Schritten:

  1. Daten importieren:

    • Öffne Excel und gehe zu Daten > Daten abrufen > Aus Datei > Aus Text/CSV.
    • Wähle die *.csv-Dateien aus, die du importieren möchtest. Excel wird die Daten in separate Worksheets einfügen.
  2. Daten aktualisieren:

    • Stelle sicher, dass die Datenabfrage so konfiguriert ist, dass sie beim Öffnen der Datei automatisch aktualisiert wird. Klicke dazu mit der rechten Maustaste auf die Abfrage im Abfrage-Manager und wähle Eigenschaften. Aktiviere die Option „Daten beim Öffnen der Datei aktualisieren“.
  3. VBA-Code einfügen:

    • Drücke ALT + F11, um den VBA-Editor zu öffnen.
    • Füge den folgenden Code in das Modul „Diese Arbeitsmappe“ ein:
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
       Dim wks As Worksheet
       For Each wks In Worksheets
           prcCreateCSV wks
       Next
    End Sub
    
    Public Sub prcCreateCSV(wks As Worksheet)
       ' Code zum Erstellen der CSV-Datei
    End Sub
  4. CSV-Dateien speichern:

    • Der oben angegebene Code sorgt dafür, dass beim Schließen der Excel-Datei die aktuellen Daten in die entsprechenden CSV-Dateien exportiert werden.

Häufige Fehler und Lösungen

  • Laufzeitfehler '438': Dieser Fehler tritt häufig auf, wenn die Methode oder Eigenschaft, die du verwendest, nicht vorhanden ist. Achte darauf, dass du die richtigen Objekte und Methoden verwendest.

  • Nur die erste Zeile wird gespeichert: Ändere die Zeile With wks.Cells(1, 1).CurrentRegion zu With wks.Cells(1, 1).UsedRange, um sicherzustellen, dass alle genutzten Zellen erfasst werden.

  • Formatierungsfehler bei Uhrzeiten: Stelle sicher, dass die Formatierungen der Zellen in Excel korrekt sind, bevor du die Daten exportierst. Du kannst auch den VBA-Code anpassen, um die Formate zu berücksichtigen.


Alternative Methoden

Wenn du CSV-Dateien auswerten möchtest, ohne VBA zu verwenden, kannst du die folgenden Methoden in Betracht ziehen:

  • Power Query: Mit Power Query kannst du Daten aus mehreren CSV-Dateien importieren und transformieren, ohne eine Zeile VBA-Code zu schreiben. Dies ist besonders nützlich, wenn du regelmäßig Daten aktualisieren musst.

  • Office Automation: Du könntest auch in Erwägung ziehen, direkt von deinem C++-Programm nach Excel zu schreiben. Dies erfordert jedoch mehr Programmierkenntnisse und Kenntnisse über die Excel-API.


Praktische Beispiele

Hier ist ein einfaches Beispiel, wie du eine CSV-Datei auswerten kannst:

  1. Daten vorbereiten: Stelle sicher, dass deine CSV-Dateien korrekt formatiert sind, z.B.:

    Datum;Uhrzeit;Wert
    13.05.2013;17:51;100
    14.05.2013;18:00;200
  2. Daten in Excel importieren: Verwende die oben beschriebenen Schritte, um die CSV-Datei zu importieren.

  3. Daten analysieren: Nutze Excel-Funktionen wie SUMME, DURCHSCHNITT oder Pivot-Tabellen, um die csv daten auszuwerten.


Tipps für Profis

  • Verwende Named Ranges: Erstelle benannte Bereiche für deine Daten, um die Handhabung im VBA-Code zu erleichtern.

  • Datenüberprüfung: Implementiere Datenüberprüfungen in deinen Excel-Tabellen, um sicherzustellen, dass die Daten korrekt formatiert sind, bevor sie in eine CSV-Datei exportiert werden.

  • Fehlerprotokollierung: Füge im VBA-Code eine Fehlerprotokollierung hinzu, um potenzielle Probleme beim Exportieren der Daten zu identifizieren.


FAQ: Häufige Fragen

1. Wie kann ich mehrere CSV-Dateien gleichzeitig importieren?
Du kannst Power Query verwenden, um mehrere CSV-Dateien aus einem Ordner zu importieren. Gehe zu Daten > Daten abrufen > Aus Datei > Aus Ordner.

2. Welche Excel-Version benötige ich für diese Methoden?
Die beschriebenen Methoden funktionieren in Excel 2016 und späteren Versionen. Stelle sicher, dass du die neuesten Updates installiert hast, um alle Funktionen nutzen zu können.

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