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

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

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

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

315 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige