CSV to XLS - Macro läuft nur jedes 2te Mal

Hallo,

anbei ein Programm, welches aus einem angegebenen Directory alle Dateien öffnet und wieder als xls speichert.
Da Excel ein Problem bei Dateien mit Endung CSV hat, muss ich mit dem Rename arbeiten.

Mein Problem ist nun, dass das Programm funktioniert, aber eben nur manchmal und zwar jedes 2te Mal.
Ich habe schon an den kritischen Punkten eine „sinnlose“ Schleife eingebaut, aber selbst dies greift nicht.
Hat jemand eine Idee?

Dim strPath As String
Dim strFilename As String
Dim strAll As String
Dim i

strPath = „C:\temp“
strFilename = Dir(strPath + „*.“, vbNormal)
strAll = strPath + „“ + strFilename
ChDir (strPath)
a = Shell(„cmd /c ren *.csv *.“, vbMaximizedFocus)

i = 0
For i = 1 To 100000 Step 1
i = i + 1
Next i

Do While strFilename „“
Workbooks.OpenText Filename:=strAll, _
DataType:=xlDelimited, semicolon:=True
ActiveWorkbook.SaveAs Filename:=strFilename, FileFormat _
:=xlNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:= _
False, CreateBackup:=False
Workbooks(strFilename + „.xls“).Close savechanges:=True
i = 0
For i = 1 To 100000 Step 1
i = i + 1
Next i
strFilename = Dir
Loop

a = Shell(„cmd /c ren *. *.csv“, vbMaximizedFocus)

End Sub

Gruss
Carsten

anbei ein Programm, welches aus einem angegebenen Directory
alle Dateien öffnet und wieder als xls speichert.
Da Excel ein Problem bei Dateien mit Endung CSV hat, muss ich
mit dem Rename arbeiten.
Mein Problem ist nun, dass das Programm funktioniert, aber
eben nur manchmal und zwar jedes 2te Mal.
Ich habe schon an den kritischen Punkten eine „sinnlose“
Schleife eingebaut, aber selbst dies greift nicht.

Hi Carsten,
das tue ich mir jetzt nicht an diesen Code zu kapieren :smile:
Ungetestet:

Sub tt()
Application.ScreenUpdating = False
Set fs = Application.FileSearch
With fs
 .LookIn = "C:\temp"
 .Filename = "\*.csv"
 .Execute
 For n = 1 To .FoundFiles.Count
 Workbooks.Add
 Open .FoundFiles(n) For Input As #1 'ggfs freefile benutzen
 While Not EOF(1)
 Input #1, Satz
 Satz2 = Split(Satz, ";") ' ggfs ","
 zei = zei + 1
 For nn = 0 To UBound(Satz2)
 Cells(zei, nn + 1) = Satz2(nn)
 Next nn
 Wend
 ActiveWorkbook.Close savechanges:=True
 Close #1
 Next n
End With
Application.ScreenUpdating = True
End Sub

Gruß
Reinhard

Auch nicht schlecht, aber das dauert mir zu lange jede Zeile der CSV Datei einzulesen.

Schritte in meinem Prog:

  1. Pfade definieren:
    strPath = „C:\temp“
    strFilename = Dir(strPath + „*.“, vbNormal)
    strAll = strPath + „“ + strFilename
    ChDir (strPath)

  2. CSV Dateien umbenennen, da Excel ansonsten beim abbarbeiten ein Problem damit hat und alles in die 1te Spalte reinschreibt
    a = Shell(„cmd /c ren *.csv *.“, vbMaximizedFocus)

  3. Jede Datei im Directory einzeln einlesen und öffnen, dann anschliessend unter dem selben Dateinamen als XLS Datei wieder speichern.

  4. Loopen

  5. Die unter 2 umbenannten Dateien wieder zurückumbenennen.

Die Schleifen zwischen 2 und 3, sowie 3 und 4 dienen nur dazu eine künstliche Pause zu erzeugen, da es so scheint, dass der Prozess schneller als die Festplatte ist.

anbei ein Programm, welches aus einem angegebenen Directory
alle Dateien öffnet und wieder als xls speichert.
Da Excel ein Problem bei Dateien mit Endung CSV hat, muss ich
mit dem Rename arbeiten.

Hallo Carsten,
welches Problem meinst du bei csv-dateien?
Gruß
Reinhard

Hallo Carsten,

ich verstehe deine Klimmzüge nicht ganz:
unter EXCEL97 öffnet folgendes Makro problemlos die CSV-Dateien eines Verzeichnises und speichert sie im gleichen Verzeichnis im XLS-Format.

Sub CSVinEXCEL()
 Dim strPath As String
 Dim strFilename As String
 strPath = "C:\Test\www\_Test1"
 ChDir (strPath)
 strFilename = Dir(strPath & "\*.csv", vbNormal)
 Do While strFilename ""
 Workbooks.Open FileName:=strFilename, Format:=4
' Format = Wert für Trennzeichen
' 1 Tabstops
' 2 Kommas
' 3 Leerzeichen
' 4 Semikolons
' 5 Keine
' 6 Benutzerdefiniertes Trennzeichen (siehe Delimiter-Argument)
 ActiveWorkbook.SaveAs FileName:=Left(strFilename, Len(strFilename) - 3) & "XLS", FileFormat:=xlNormal, \_
 Password:="", WriteResPassword:="", ReadOnlyRecommended:= \_
 False, CreateBackup:=False
 ActiveWorkbook.Close savechanges:=True
 strFilename = Dir
 Loop
End Sub

Falls du unbedingt mit deiner Konstruktion arbeiten willst/mußt, dann solltest du
zum Umbenennen der Dateien die VBA-Befehle nutzen statt über Shell zu gehen.
Dann gibt es auch keine Probleme mit dem Timing im Ablauf.
Außerdem ist bei dir diese Zeile noch fehlerhaft:
ActiveWorkbook.SaveAs FileName:=strAll, FileFormat:=xlNormal, _

Code-Vorschlag:

Sub TextinEXCEL()
 Dim strPath As String
 Dim strFilename As String
 strPath = "C:\Temp"
 ChDir (strPath)
 strFilename = Dir(strPath & "\*.csv", vbNormal)
 Do While strFilename ""
 Name strPath & "\" & strFilename As strPath & "\" & Left(strFilename, Len(strFilename) - 3)
 strFilename = Dir
 Loop
 strFilename = Dir(strPath + "\*.", vbNormal)
 Do While strFilename ""
 Workbooks.OpenText FileName:=strFilename, \_
 DataType:=xlDelimited, semicolon:=True
 ActiveWorkbook.SaveAs FileName:=strFilename, FileFormat:=xlNormal, \_
 Password:="", WriteResPassword:="", ReadOnlyRecommended:= \_
 False, CreateBackup:=False
 Workbooks(strFilename + ".xls").Close savechanges:=True
 strFilename = Dir
 Loop
 strFilename = Dir(strPath & "\*.", vbNormal)
 Do While strFilename ""
 Name strPath & "\" & strFilename As strPath & "\" & strFilename & ".csv"
 strFilename = Dir
 Loop
End Sub

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Carsten,
welches Problem meinst du bei csv-dateien?
Gruß
Reinhard

Anstelle alle Daten je nach Trennzeichen in eine Spalte zu schreiben werden alle Daten in nur 1 Spalte geschrieben.
Nimm ne CSV Datei und mache einen Doppelklick. Die Datei öffnet sich korrekt in Excel mit den Trennzeichen.
Jetzt nenn diese Datei um in *.xls und öffne diese Datei dann. Alles in einer Spalte.
Genau dies passiert, wenn man in Excel eine CSV Datei öffnet und als XLS wieder abspeichert.

Anstelle alle Daten je nach Trennzeichen in eine Spalte zu
schreiben werden alle Daten in nur 1 Spalte geschrieben.
Nimm ne CSV Datei und mache einen Doppelklick. Die Datei
öffnet sich korrekt in Excel mit den Trennzeichen.
Jetzt nenn diese Datei um in *.xls und öffne diese Datei dann.
Alles in einer Spalte.
Genau dies passiert, wenn man in Excel eine CSV Datei öffnet
und als XLS wieder abspeichert.

Hi Carsten,
das ist doch kein unlösbares problem, entwedser in Excel Daten–Text in Spalten
oder VBA mit Split(cells(zei,1),";")
Wenn du das mit vba nicht ninkriegst melde dich ich bastle dir das.
Gruß
Reinhard

Hi Carsten,
das ist doch kein unlösbares problem, entwedser in Excel
Daten–Text in Spalten
oder VBA mit Split(cells(zei,1),";")
Wenn du das mit vba nicht ninkriegst melde dich ich bastle dir
das.
Gruß
Reinhard

Vielen Dank, aber Franz hat eine sehr gute Lösung geschrieben, welche auch funktioniert. Vielen Dank da an Franz.

Wie immer viele Wege führen nach Rom.
Danke an Alle

Hallo Franz,

die Routine CSVinEXCEL() geht leider nicht in Excel 2002, aber das andere Programm funktioniert SUPER.
Vielen Dank

Wieso läuft 97er Code nicht in VBA von 2002?
Hallo Carsten,
an welcher Stelle meckert der Debugger mit welcher Meldung?
Gruß
Reinhard

Hallo Carsten,
an welcher Stelle meckert der Debugger mit welcher Meldung?
Gruß
Reinhard

Er meckert nicht. Er schreibt aber eben alles in eine Spalte und nicht getrennt pro Trennzeichen in eine Spalte.

Carsten