Autor
|
Thema: .csv-Dateien automatisch öffnen, Makro ausführen und als .xls abspeichern (12198 mal gelesen)
|
Darksidy Mitglied Controller
Beiträge: 16 Registriert: 29.05.2013
|
erstellt am: 29. Mai. 2013 15:36 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen Ich habe einen Ordner, in dem sich cirka 600 .csv-Dateien befinden. Bei allen Dateien muss ein Makro ausgeführt und nachher als .xls-File wieder abgespeichert werden. Wie kann man einen automatischen Lauf über all diese Dateien starten, sodass die .csv's geöffnet werden, das Makro darin ausgeführt und die Datei (unter Beibehaltung des aktuellen Namen) als .xls-File abgespeichert wird? Ich danke im Voraus für die Hilfe! Beste Grüsse Darksidy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Axel.Strasser Ehrenmitglied V.I.P. h.c. Selbstständig im Bereich PLM/CAx
Beiträge: 4107 Registriert: 12.03.2001 Früher war vieles gut, und das wäre es heute immer noch, wenn man die Finger davon gelassen hätte!
|
erstellt am: 29. Mai. 2013 17:43 <-- editieren / zitieren --> Unities abgeben: Nur für Darksidy
|
Beverly Mitglied Dipl.-Geologe (Rentner)
Beiträge: 394 Registriert: 11.08.2007
|
erstellt am: 30. Mai. 2013 08:55 <-- editieren / zitieren --> Unities abgeben: Nur für Darksidy
Hi, versuche es mal so: Code: Sub MehrereOeffnen() Dim strVerzeichnis As String Dim strDatei As String Dim strTyp As String Dim strDateiname As String strTyp = "*.csv" Application.ScreenUpdating = False strVerzeichnis = "D:\Test\" strDateiname = Dir(strVerzeichnis & strTyp) Do While strDateiname <> "" Workbooks.Open Filename:=strVerzeichnis & strDateiname DeinMakro ActiveWorkbook.SaveCopyAs Application.Substitute(strDateiname, ".csv", "") & ".xls" ActiveWorkbook.Close strDateiname = Dir Loop Application.ScreenUpdating = True End Sub
------------------ Bis später, Karin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Axel.Strasser Ehrenmitglied V.I.P. h.c. Selbstständig im Bereich PLM/CAx
Beiträge: 4107 Registriert: 12.03.2001 Früher war vieles gut, und das wäre es heute immer noch, wenn man die Finger davon gelassen hätte!
|
erstellt am: 30. Mai. 2013 09:33 <-- editieren / zitieren --> Unities abgeben: Nur für Darksidy
|
Beverly Mitglied Dipl.-Geologe (Rentner)
Beiträge: 394 Registriert: 11.08.2007
|
erstellt am: 30. Mai. 2013 09:43 <-- editieren / zitieren --> Unities abgeben: Nur für Darksidy
derartige Kleinigkeiten habe ich - meist in etwas abgewandelter Form, die man leicht anpassen kann - in meinem VBA-Archiv vorliegen und bin immer gerne bereit, sie mit anderen Usern zu teilen. ------------------ Bis später, Karin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Darksidy Mitglied Controller
Beiträge: 16 Registriert: 29.05.2013
|
erstellt am: 05. Jun. 2013 09:45 <-- editieren / zitieren --> Unities abgeben:
|
Simon1710 Mitglied Student
Beiträge: 3 Registriert: 10.05.2014
|
erstellt am: 10. Mai. 2014 14:04 <-- editieren / zitieren --> Unities abgeben: Nur für Darksidy
Hallo zusammen! VIelen Dank Karin für den Code - auch bei mir funktioniert er perfekt! Allerdings habe ich das Problem, dass nach dem Konvertieren in die xls File komplett "zusammengestaucht" wird und die einzlnen Werte nicht mehr in den gewünschten Zellen sind. Gibt es dafür auch einen Code, der dies berücksichtigt? Vielen lieben Dank für eure Hilfe! Liebe Grüße, Simon Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Thomas Harmening Moderator Arbeiter ツ
Beiträge: 2897 Registriert: 06.07.2001 Das Innerste geäussert und aufs Äusserste verinnerlicht
|
erstellt am: 10. Mai. 2014 17:13 <-- editieren / zitieren --> Unities abgeben: Nur für Darksidy
Zitat: dass nach dem Konvertieren in die xls File komplett "zusammengestaucht" wird und die einzlnen Werte nicht mehr in den gewünschten Zellen sind
und auf dem normalen weg csv öffnen passiert das nicht? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Simon1710 Mitglied Student
Beiträge: 3 Registriert: 10.05.2014
|
erstellt am: 10. Mai. 2014 18:50 <-- editieren / zitieren --> Unities abgeben: Nur für Darksidy
Nein, passiert nicht! Das ist auch etwas schwer zu verstehen und deshalb auch in der Frage nicht ganz einfach zu formulieren. Ich arbeite mit einer Simulationssoftware (Flexsim), die mir die Ergebnisse im csv Format ausgibt. Leider sind csv Dateien als Anhang hier im Forum nicht erlaubt. Ich kenne es normalerweise immer nur so, dass die csv Datei (comma separated - wie der Name eben schon sagt) auf eine Spalte zusammengestaucht ist. Ich habe mittlerweile noch was einen anderen Code entdeckt, der zwar das Konvertieren wieder schafft aber nicht das Umformatieren. Ich glaub ich hab einfach nur einen Knoten im Kopf - das kann doch nicht so schwierig sein?!
Code:
Sub convertCSVtoXLS4()Application.DisplayAlerts = False myFile = ActiveWorkbook.Name myPath = "C:\Ordner1\" WorkFile = Dir(myPath & "*.CSV") Do While WorkFile <> "" Application.StatusBar = "Now working on " & WorkFile Workbooks.Open Filename:=myPath & WorkFile Columns("A:A").Select Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _ TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _ Semicolon:=False, Comma:=True, Space:=False, Other:=False, FieldInfo _ :=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), _ Array(7, 1), Array(8, 1), Array(9, 1), Array(10, 1), Array(11, 1), Array(12, 1), Array(13, 1 _ '), Array(14, 1), Array(15, 1), Array(16, 1), Array(17, 1), Array(18, 1)), _ TrailingMinusNumbers:=True Range("A1").Select ActiveWorkbook.SaveAs Filename:=myPath & _ Left(ActiveWorkbook.Name, Len(ActiveWorkbook.Name) - 4), FileFormat:=xlNormal ActiveWorkbook.Close Windows(myFile).Activate WorkFile = Dir() Loop Application.StatusBar = False End Sub
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Simon1710 Mitglied Student
Beiträge: 3 Registriert: 10.05.2014
|
erstellt am: 10. Mai. 2014 20:31 <-- editieren / zitieren --> Unities abgeben: Nur für Darksidy
Hallo! Ich kann das Problem jetzt noch einwenig präzisieren: mein Ausgangspunkt sind immer meine *.csv Dateien, die mir mein Simulationsprogramm geben. Die Zahlenkolonnen sind genau so angeorndet, wie ich das möchte und ich kann und will auch einfache Berechnung (diese kann ich mir über den Makrorekroder holen) erstellen. Wenn das Makro nun läuft und die Datei öffnet
Code: Workbooks.Open Filename:=myPath & WorkFile
Werden die Spalten zusammengestaucht und diese falsche Anordnung (.csv typisch!) bleibt dann bestehen und gibt mir folglich die fehlerhafte .xls Datei aus. Gibt es irgendeinen Weg dieses Durcheinander, das das Makro durch das öffnen der Datei verursacht, zu beheben bzw. gar nicht aufkommen zu lassen? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Axel.Strasser Ehrenmitglied V.I.P. h.c. Selbstständig im Bereich PLM/CAx
Beiträge: 4107 Registriert: 12.03.2001 Früher war vieles gut, und das wäre es heute immer noch, wenn man die Finger davon gelassen hätte!
|
erstellt am: 11. Mai. 2014 16:26 <-- editieren / zitieren --> Unities abgeben: Nur für Darksidy
|
bst Mitglied
Beiträge: 192 Registriert: 31.08.2004 .
|
erstellt am: 12. Mai. 2014 08:44 <-- editieren / zitieren --> Unities abgeben: Nur für Darksidy
|
kjessen Mitglied
Beiträge: 5 Registriert: 26.08.2014
|
erstellt am: 26. Aug. 2014 16:20 <-- editieren / zitieren --> Unities abgeben: Nur für Darksidy
Hallo, ich finde die Lösung super aber habe das Problem, dass er die Dateien bei mir weiterhin als csv Datei abspeichert. Was mache ich falsch? Eine weitere Ergänzug: Wie kann ich die Dateien an einem anderen Ort speichern. Dateien liegen in: C:\Users\Documents\Unterlagen und sollen in C:\Users\Documents\Unterlagen\done gespeichert werden. Danke euch Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Thomas Harmening Moderator Arbeiter ツ
Beiträge: 2897 Registriert: 06.07.2001 Das Innerste geäussert und aufs Äusserste verinnerlicht
|
erstellt am: 26. Aug. 2014 17:45 <-- editieren / zitieren --> Unities abgeben: Nur für Darksidy
...welchen Code hast du genommen? ungetestet. Code: Sub MehrereOeffnen() Dim strVerzeichnis As String Dim strZielVerz As String Dim strDatei As String Dim strTyp As String Dim strDateiname As String strTyp = "*.csv" Application.ScreenUpdating = False strVerzeichnis = "C:\Users\Documents\Unterlagen\" strZielVerz = "C:\Users\Documents\Unterlagen\done\" strDateiname = Dir(strVerzeichnis & strTyp) Do While strDateiname <> "" Workbooks.Open Filename:=strVerzeichnis & strDateiname, Local:=True 'DeinMakro 'ActiveWorkbook.SaveCopyAs Application.Substitute(strZielVerz & strDateiname, ".csv", "") & ".xls" ' XL 2010 ActiveWorkbook.SaveAs Application.Substitute(strZielVerz & strDateiname, ".csv", "") & ".xls", FileFormat:=xlExcel8, _ Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _ CreateBackup:=False ActiveWorkbook.Close strDateiname = Dir Loop Application.ScreenUpdating = True End Sub
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Frank88 Mitglied
Beiträge: 153 Registriert: 11.10.2004
|
erstellt am: 26. Aug. 2014 21:45 <-- editieren / zitieren --> Unities abgeben: Nur für Darksidy
Hallo Simon, ja, das ist ein häufiges Problem mit dem CSV-Format. Das sollte im Deutschen lieber SSV heissen - Semikolon separatet values. Darauf läuft's nämlich hinaus. Je nach Einstellung Deines Betriebssystems und Deines XL (ggf auch das des Herkunftsrechners, falls solche involviert sind), klappt das mal und mal nicht. Ein komplett deutsches System wird CSV nur richtig in XL einlesen können, wenn die Werte mit Semikolon getrennt sind. Stehen da tatsächlich Kommata, ist das Ergebnis Glückssache. Workaround: Umbenennen in TXT (ggf. per Makro), in XL öffnen und mit dem Textkonvertierungsassistenten (Daten - Text in Spalten...) richtig aufteilen. Zum Glück klappt das hervorragend mit dem Makrorekorder. Grüsse, Frank Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
kjessen Mitglied
Beiträge: 5 Registriert: 26.08.2014
|
erstellt am: 28. Aug. 2014 18:33 <-- editieren / zitieren --> Unities abgeben: Nur für Darksidy
|
Frank88 Mitglied
Beiträge: 153 Registriert: 11.10.2004 Civil3D 2018
|
erstellt am: 29. Aug. 2014 15:46 <-- editieren / zitieren --> Unities abgeben: Nur für Darksidy
Hallo, je nachdem, wie Du die Dateien öffnest... Machst Du das mit FOR...EACH, könntest Du die bearbeiteten Dateien in einen anderen Ordner verschieben, in der Schleife einen Zähler mitlaufen lassen und nach, sagen wir 200 Dateien die Schleife verlassen. Das ganze so oft, bis im Ursprungsordner keine Dateien mehr sind. Man könnte aber auch als erstes die Dateien zählen und dann mit FOR...NEXT-Schleifen (Höchstwert wieder z.B. 200) alle Dateien abarbeiten. Oder es gibt eine Systematik in den Dateinamen, die man abprüfen und einzeln abarbeiten könnte: Zuerst alle, die mit A anfangen etc. Grüsse, Frank Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
kjessen Mitglied
Beiträge: 5 Registriert: 26.08.2014
|
erstellt am: 03. Sep. 2014 14:45 <-- editieren / zitieren --> Unities abgeben: Nur für Darksidy
Danke für die Hinweise, jetzt funktioniert alles. Ein Problem besteht weiterhin. Ich formatiere die Zahlen mit dem Makro bereits, allerdings wird mir hinterher immer der Fehler angezeigt "number stored as text". Und daher wird die Formel nicht ausgeführt. Könnt ihr mir vielleicht weiterhelfen? Herzlichen Dank Das ist mein Code: ..... Range("F9:J9").Select Range(Selection, Cells(Rows.Count, Selection.Column).End(xlUp)).Select Selection.NumberFormat = _ "_ [$€-413] * #,##0.00_ ;_ [$€-413] * -#,##0.00_ ;_ [$€-413] * ""-""??_ ;_ @_ " Dim NextRow As Long NextRow = Range("E" & Rows.Count).End(xlUp).Row + 1 Range("F" & NextRow & ":J" & NextRow).Formula = "=SUM(F9:F" & NextRow - 1 & ")" Range(Selection, Cells(Rows.Count, Selection.Column).End(xlUp)).Select Selection.Borders(xlDiagonalDown).LineStyle = xlNone .... .... ActiveWorkbook.SaveAs Application.Substitute(strZielVerz & ActiveSheet.Range("B5").Text, ".csv", "") & ".xlsx", FileFormat:=xlOpenXMLWorkbook ActiveWorkbook.Close strDateiname = Dir Loop Application.ScreenUpdating = True End Sub
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Grebe Mitglied
Beiträge: 536 Registriert: 16.12.2002 LT-2021, Civil3D-2021, BricsCAD V18 HP-DesignJet T1200
|
erstellt am: 04. Sep. 2014 08:44 <-- editieren / zitieren --> Unities abgeben: Nur für Darksidy
Das einfache Umformatieren bringt leider nix, wenn der Zellinhalt mal als Text erkannt wurde. Das kann man auch direkt in Excel in einer Zelle ausprobieren. Nach dem Umformatieren der Zelle aus ein Zahlenformat muss man nochmal mit F2 eine Neu-Eingabe starten und mit <Enter> abschließen. Erst dann wird aus der Eingabe eine Zahl. In Deinem Makro könntest Du in einer Schleife jeweils den Zellinhalt mit 1 multiplizieren. Damit wird dann automatisch wieder eine Zahl daraus (wenn es kein Text ist) und das neue Format wird übernommen. Mathias Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
kjessen Mitglied
Beiträge: 5 Registriert: 26.08.2014
|
erstellt am: 04. Sep. 2014 09:46 <-- editieren / zitieren --> Unities abgeben: Nur für Darksidy
ok danke für den Hinweis. Könntest du mir sagen, wie ich den Bereich: Range("F9:J9").Select Range(Selection, Cells(Rows.Count, Selection.Column).End(xlUp)).Select mit 1 multiplizieren kann? Danke Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Grebe Mitglied
Beiträge: 536 Registriert: 16.12.2002 LT-2021, Civil3D-2021, BricsCAD V18 HP-DesignJet T1200
|
erstellt am: 04. Sep. 2014 09:58 <-- editieren / zitieren --> Unities abgeben: Nur für Darksidy
|
kjessen Mitglied
Beiträge: 5 Registriert: 26.08.2014
|
erstellt am: 04. Sep. 2014 18:11 <-- editieren / zitieren --> Unities abgeben: Nur für Darksidy
|