VBS-Script von xlsx nach csv, zum Exportieren eines bestimmten Tabellenblattes

  • VBScript

SSL ist deaktiviert! Aktivieren Sie SSL für diese Sitzung, um eine sichere Verbindung herzustellen.

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von Bewie.

    VBS-Script von xlsx nach csv, zum Exportieren eines bestimmten Tabellenblattes

    Guten Abend,

    hier habe ich einen Code, der mir eine Exceldatei in csv umwandelt. Dabei wird immer nur das erste Tabellenblatt konvertiert, außer, ich speichere die Exceldatei so, dass beim Speichern nicht das erste Tabellenblatt geöffnet ist - ich verzweifele!

    Bitte helft mir, dass immer nur ein entsprechend definiertes Tabellenblatt (Beispiel "Tabelle1") in csv umgewandelt wird und dies nicht vom vorherigen Speichervorgang abhängig ist!Vermutlich irgendetwas mit: XL.Worksheets("Tabelle1") ??? Leider habe ich nur wenig Ahnung...

    Herzlichen Dank!

    Hier mein Code (VB-Script):

    Visual Basic-Quellcode

    1. OrdnerEin = "."
    2. OrdnerAus = "."
    3. AbZeile = 1
    4. AbSpalte = 1 'Spalte A
    5. Feldanzahl = 9
    6. Endzeile = 1390
    7. Set XL = CreateObject("Excel.Application")
    8. Set fso = CreateObject("Scripting.FileSystemObject")
    9. For Each Datei In fso.GetFolder(OrdnerEin).Files
    10. If LCase(fso.GetExtensionName(Datei.Name)) = "xlsx" Then
    11. XL.Workbooks.Open Datei.Path
    12. Zeile = AbZeile
    13. Aus = ""
    14. Do While Zeile<Endzeile
    15. Satz = XL.Cells(Zeile, AbSpalte)
    16. For i = 1 To Feldanzahl - 1
    17. Satz = Satz & ";" & XL.Cells(Zeile, AbSpalte + i)
    18. Next
    19. Aus = Aus & vbCrLf & Satz
    20. Zeile = Zeile + 1
    21. Loop
    22. fso.CreateTextFile(OrdnerAus & "\" & fso.GetBaseName(Datei.Name) & ".csv").Write Mid(Aus, 3)
    23. XL.ActiveWorkbook.Close False
    24. End If
    25. Next
    26. XL.Quit

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „OKIAM“ ()

    Ich bin jetzt etwas irritiert.
    Excel ist doch selbst in der Lage CSV-files zu speichern.
    Geht es denn nicht mit dem Excel VBA Befehl? :

    Visual Basic-Quellcode

    1. ActiveWorkbook.SaveAs Filename:="Mappe1.csv", FileFormat:=xlCSV, CreateBackup:=False



    Oder willst du nur einen kleinen Bereich deiner Tabelle abspeichern?

    Weiterhin kannst du doch ein bestimmtes Worksheet definieren.
    und dann dessen Zellen ansprechen

    Worksheets(1).Range("A1").Value

    Bitte Code einbauen

    Danke für deinen Hinweis!

    Excel kann das selbst, aber ich möchte dies von der Konsole aus automatisieren. Soweit klappt dies ja ausch schon, allerdings fehlt mir noch dein Tipp mit dem definierten Tabellenblatt. Kannst mir bitte noch sagen, an welcher Stelle DEIN Code eingebaut werden muss, damit es funktioniert?

    PS: Ein ganzes Tabellenblatt soll als csv gespeichert werden ( bis Zeile 1390).


    Und eine Bitte hätte ich noch: Kannst du es auch einmal kurz ausprobieren, also die Datei durch Doppelklick zu starten?

    Herzlichen Dank!!!

    OKIAM
    Dein Code funktioniert.
    Da du aber nur bis Zeile 1390 abspeichern willst, musst du halt durch deine
    Schleife für die Zeilen gehen. Andernfalls hättest du ja die direkte
    Methode von Excel nutzen können.

    Weiterhin ist es nicht möglich mehrere Tabellenblätter eines Workbooks
    gleichzeitig als CSV zu speichern. Dazu müsstest du die Blätter erst in ein Blatt
    zusammen fassen.

    Ich habe jetzt mal noch den Code für das Tabellenblatt rein geschrieben.
    Da steht jetzt eine "1" als Index drin. Du musst also nun noch durch
    alle vorhandenen Tabellenblätter eine Schleife bilden.



    Visual Basic-Quellcode

    1. OrdnerEin = "C:\etest"
    2. OrdnerAus = "C:\etest"
    3. AbZeile = 1
    4. AbSpalte = 1 'Spalte A
    5. Feldanzahl = 9
    6. Endzeile = 1390
    7. Set XL = CreateObject("Excel.Application")
    8. Set fso = CreateObject("Scripting.FileSystemObject")
    9. For Each Datei In fso.GetFolder(OrdnerEin).Files
    10. If LCase(fso.GetExtensionName(Datei.Name)) = "xls" Then
    11. XL.Workbooks.Open Datei.Path
    12. Zeile = AbZeile
    13. Aus = ""
    14. Do While Zeile < Endzeile
    15. Satz = XL.Worksheets(1).Cells(Zeile, AbSpalte)
    16. For i = 1 To Feldanzahl - 1
    17. Satz = Satz & ";" & XL.Worksheets(1).Cells(Zeile, AbSpalte + i).Value
    18. Next
    19. Aus = Aus & vbCrLf & Satz
    20. Zeile = Zeile + 1
    21. Loop
    22. fso.CreateTextFile(OrdnerAus & "\" & fso.GetBaseName(Datei.Name) & ".csv").Write Mid(Aus, 3)
    23. XL.ActiveWorkbook.Close False
    24. End If
    25. Next
    26. XL.Quit

    Bitte noch einmal um Hilfe!

    Hi Lightsource,

    ich habe mir den vorhandenen Code irgendwie zusammengegoogelt, so wie es hier in den Statuten steht... Da ich wenig bis gar keine Ahnung habe bitte ich noch einmal um Hilfe: Es soll so einfach wie möglich sein! Das mit der Zeile 1390 war nur, da es im Ursprungscode auch so war, also raus damit ;)

    Meine Bitte:
    Das Script soll nur ein bestimmtes Tabellenblatt einer Excel-Datei öffnen und nur dieses Blatt als csv File abspeichern!
    "Andernfalls hättest du ja die direkte Methode von Excel nutzen können." <=== Kannst du das bitte so einsetzen?

    Ich wäre dir/euch sehr dankbar, da ich leider keinerlei Programmierkenntnisse habe!!!

    Vielen herzlichen Dank!
    OKIAM
    Also dieser Code (mit geändertem Pfad) würde alle xls-Dateien in diesem
    Pfad als csv-files mit gleichem Namen abspeichern.
    xlsx-Dateien habe ich nicht, das musst du halt abändern.
    Das Abspeichern tut es jeweils für das erste Tabellenblatt.
    Wenn du nicht weißt welches Tabellenblatt du brauchst, wird es
    schwieriger.


    Visual Basic-Quellcode

    1. OrdnerEin = "DeinPfad"
    2. OrdnerAus = "DeinPfad"
    3. Set XL = CreateObject("Excel.Application")
    4. Set fso = CreateObject("Scripting.FileSystemObject")
    5. For Each Datei In fso.GetFolder(OrdnerEin).Files
    6. If LCase(fso.GetExtensionName(Datei.Name)) = "xls" Then
    7. XL.Workbooks.Open Datei.Path
    8. XL.ActiveWorkbook.SaveAs OrdnerAus & "\" & fso.GetBaseName(Datei.Name) & ".csv", 6, , , , False
    9. XL.ActiveWorkbook.Close False
    10. End If
    11. Next
    12. XL.Quit
    13. Set XL = Nothing
    14. Set fso = Nothing
    Hi,
    erst mal vielen Dank!!!!

    Leider, wirklich leider, gibt es noch ein Problem: Ich habe "DeinPfad" durch einen Punkt ersetzt, aber irgendwie kommt er dann mit Zeile 8 in Schwierigkeiten, weil er die Datei in ein Verzeichnis /. packen will. Aber er soll die Datei einfach im selben Verzeichnis umwandeln und dort auch speichern.

    Ergänzung: Leider speichert er nur die Datei, die geöffnet war, als ich gespeichert habe. Aber nicht IMMER die erste! :(
    Und, ich wage es gar nicht zu sagen, er fragt beim speichern einer vorhandenen Datei nach (bitte nicht) und setzt Hochkommas anstatt Semikolons - sorry!

    Kannst du noch einmal...?
    Danke, danke, danke ;)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „OKIAM“ ()

    Das Problem ist, deine Aussage ist dafür nicht eindeutig.

    Willst du alle Dateien in den selben Ordner speichern aus dem du sie auch geholt hast?
    Willst du die Dateien in dem selben Ordner abarbeiten in der das Script läuft?
    Willst du sie aus einem bestimmten Pfad lesen und reinschreiben, der immer ein anderer ist
    bei jedem Start des Scripts?

    Ergänzung: Leider speichert er nur die Datei, die geöffnet war, als ich gespeichert habe. Aber nicht IMMER die erste! :(
    Das verstehe ich nicht.



    Bei mir hat das Script alle Dateien im Ordner abgearbeitet und als CSV abgespeichert und überall waren ";" als Trennzeichen drin.
    Hi Lightsource,

    ich möchte dich nicht verven und verstehe mich bitte nicht falsch. Wahrscheinlich liegt es etwas an meiner Unkenntnis: Wenn ich meine Excel datei bearbeitet habe und beispielsweise Tabelle 2 bearbeite und auf speichern klicke, wandelt er dann auch diese Tabelle um und nicht standardmäßig Tabelle 1. außerdem fragt er, ob eine bereits vorhandene Datei überschrieben werden soll - ja soll er automatisch. Alles soll im selben verzeichnis passieren, wo auch das script liegt und alle dateien bleiben auch immer in diesem verzeichnis zusammen. (Trennzeichen sind bei mir übrigens Kommas)

    Willst du alle Dateien in den selben Ordner speichern aus dem du sie auch geholt hast?
    ja
    Willst du die Dateien in dem selben Ordner abarbeiten in der das Script läuft?
    ja
    Willst du sie aus einem bestimmten Pfad lesen und reinschreiben, der immer ein anderer ist
    bei jedem Start des Scripts?
    nein

    Liebe Grüße und sorry noch einmal wegen der Unklarheiten - ich bin über deine Hilfe sehr DANKBAR!!!
    OKIAM
    Aus deiner Aussage lese ich noch etwas anderes raus...
    Willst du alle Tabellen einer Arbeitsmappe als CSV abspeichern?
    Dir ist schon klar, dass jede Tabelle dann als einzelnes File abgespeichert wird?

    Weil das halt so ist, muss man die Filenamen entsprechend anpassen. Also z.B.

    Dateisowieso_Tabelle1.csv
    Dateisowieso_Tabelle2.csv

    Dateianders_Tabelle1.csv
    Dateianders_Tabelle2.csv
    Dateianders_Tabelle3.csv

    Das mit deinen Trennzeichen habe ich immer noch nicht verstanden.

    supportnet.de/listthread/38796
    Das Script liest alle XLS-Tabellen jeder Arbeitsmappe aus dem Verzeichnis des Scripts ein und
    speichert die einzelnen enthaltenen Tabellen als einzelne CSV-Datei, im gleichen Verzeichnis, mit dem im System
    angegebenen Listen-Trennzeichen. Dateien werden überschrieben.

    Visual Basic-Quellcode

    1. Set XL = CreateObject("Excel.Application")
    2. Set fso = CreateObject("Scripting.FileSystemObject")
    3. Set wss = CreateObject("WScript.Shell")
    4. OrdnerEin = wss.currentdirectory
    5. For Each Datei In fso.GetFolder(OrdnerEin).Files
    6. If LCase(fso.GetExtensionName(Datei.Name)) = "xls" Then
    7. XL.Workbooks.Open Datei.Path
    8. For Each Wsheet In XL.ActiveWorkbook.Worksheets
    9. if fso.FileExists(OrdnerEin & "\" & fso.GetBaseName(Datei.Name) & "_" & Wsheet.Name & ".csv") Then
    10. fso.DeleteFile(OrdnerEin & "\" & fso.GetBaseName(Datei.Name) & "_" & Wsheet.Name & ".csv")
    11. end if
    12. Wsheet.SaveAs OrdnerEin & "\" & fso.GetBaseName(Datei.Name) & "_" & Wsheet.Name & ".csv", 6, , , , False
    13. Next
    14. XL.ActiveWorkbook.Close False
    15. End If
    16. Next
    17. XL.Quit
    18. Set XL = Nothing
    19. Set wss = Nothing
    20. Set fso = Nothing

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Lightsource“ ()

    immer noch Probleme...

    Hi Lightsource,

    ich traue es mir gar nicht zu sagen, aber das Script speichert immer nur das Tabellenblatt, was beim Speichervorgang geöffnet war! Wahrscheinlich kann ich das irgendwie angeben, leider fehlen mir echt die Kenntnisse... ;-). Meine Datei heißt 1.xlsx das Tabellenblatt vt-plan.
    Das mit dem Semikolon oder Komma scheint laut LINK eine echt komische Sache zu sein. Das ist im Prinzip aber nicht schlimm, das stelle ich mir dann einfach ein.

    Was trotzdem auch noch schwierig ist, dass er die Datei einfach nicht überschreibt - das bekomme ich leider auch nicht hin!
    Na ja, wenn du sagst ich nerve dich zu sehr (;-)) dann verstehe ich das, ansonsten würde ich mich über Hilfe freuen! Die ganzen Beiträge in anderen Foren machen deutlich, dass es sich um ein echtes Problem handelt. Woanders gibt es bisher auch noch keine Lösung, die zufriedenstellend arbeitet!!!

    Wie auch immer: DANKESCHÖN für deine Mühe,
    Gruß OKIAM
    Hey,

    das ist ja total super jetzt!
    Nur noch zum Verständnis: Vermutlich lässt sich nur eine Datei (also ein definiertes Tabellenblatt) nicht erzeugen, oder?
    Falls es nicht gehen sollte, kann ja batchmäßig die nicht gebrauchten gleich wieder gelöscht werden.
    Falls doch, hast du dafür noch eine Idee?

    Das mit dem Überschreiben der Datei funktioniert nun auch: Du bist der Größte!!!

    Das Beste finde ich: Das Script läuft super und ist ohne Schicki-Micki!

    Dankeschön noch einmal und falls dieser Beitrag nicht noch ergänzt wird (mit definiertem Datebellenblatt) schließe ich diesen Thread!
    Für alle weiteren Interessenten: das letzte Script von Lightsource funktioniert superschnell, tadellos und lässt sich auch von der Konsole aus einsetzen!

    Danke,
    OKIAM
    Hallo, vielleicht hat jemand für den Quellcode eine Lösung?

    Folgender Hintergrund:
    Office 2016 (Excel) = *.xlsx
    mehrere Dateien in einem Ordner Beispiel:c:\temp\download sollen von xlsx nach csv konvertiert werden.
    Problem wenn jemand Zellen aus der *.xlsx löscht werden diese auch in der csv als";;;;;;;" angezeigt.
    Sobald alle csv Dateien erstellt sind sollen diese zu einer csv Datei zusammen gefasst werden.
    Beispiel:
    test1.xlsx = test1.csv
    test2.xlsx=test2.csv
    test1.csv+test2.csv= neue.csv

    Soweit so gut eine ENDZEILE muss nicht vorhanden sein, da das Script nur vorhandene Daten Sätze lesen darf.
    Das Script siehe Anfang:

    Visual Basic-Quellcode

    1. OrdnerEin = "C:\temp\download\"
    2. OrdnerAus = "C:\temp\download\test"
    3. AbZeile = 1
    4. AbSpalte = 1 'Spalte A
    5. Feldanzahl = 13
    6. Endzeile = 70
    7. Set XL = CreateObject("Excel.Application")
    8. Set fso = CreateObject("Scripting.FileSystemObject")
    9. For Each Datei In fso.GetFolder(OrdnerEin).Files
    10. If LCase(fso.GetExtensionName(Datei.Name)) = "xlsx" Then
    11. XL.Workbooks.Open Datei.Path
    12. Zeile = AbZeile
    13. Aus = ""
    14. Do While Zeile < Endzeile
    15. Satz = XL.Worksheets(1).Cells(Zeile, AbSpalte)
    16. For i = 1 To Feldanzahl - 1
    17. Satz = Satz & ";" & XL.Worksheets(1).Cells(Zeile, AbSpalte + i).Value
    18. Next
    19. Aus = Aus & vbCrLf & Satz
    20. Zeile = Zeile + 1
    21. Loop
    22. fso.CreateTextFile(OrdnerAus & "\" & fso.GetBaseName(Datei.Name) & ".csv").Write Mid(Aus, 3)
    23. XL.ActiveWorkbook.Close False
    24. End If
    25. Next
    26. XL.Quit


    Das zusammensetzten der einzelnen *.csv Dateien erledige ich über einen Batch eintrag
    set "Ordner=c:\temp\download\" set "Sammel=c:\temp\incoming\new.csv" pushd "%Ordner%" if exist "%Sammel%" del "%Sammel%" for %%i in (*.csv) do if not exist "%Sammel%" for /f "usebackq delims=" %%z in ("%%i") do if not exist "%Sammel%" echo %%z>"%Sammel%" for /f "delims=" %%i in ('dir /b /od *.csv') do more +1 "%%i">>"%Sammel%" popd

    Hat jemand eine Idee wie ich es umsetzten kann, das zumindest die csv Dateien ohne Leerzeilen erstellt werden?

    Vielen Dank im Voraus
    Danke Bewie

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Bewie“ ()

    Neu

    Hi,

    eingestellt habe ich es wie folgt':
    und bekomme frei nach dem Motto und EWIG GRÜSST DAS MURMELTIER
    Die "erste" Datei wird geöffnet, bleibt geöffnet aber es passiert nichts.

    Visual Basic-Quellcode

    1. 1.
    2. OrdnerEin = "C:\temp\download\"
    3. OrdnerAus = "C:\temp\download\test"
    4. For Each Datei In fso.GetFolder(OrdnerEin).Files
    5. If LCase(fso.GetExtensionName(Datei.Name)) = "xlsx" Then
    6. XL.Workbooks.Open Datei.Path
    7. Zeile = AbZeile
    8. Aus = ""
    9. Do While Zeile < Endzeile
    10. Satz = XL.Worksheets(1).Cells(Zeile, AbSpalte)
    11. For i = 1 To Feldanzahl - 1
    12. Satz = Satz & ";" & XL.Worksheets(1).Cells(Zeile, AbSpalte + i).Value
    13. Next
    14. if satz <> ";;;;;;;" then
    15. Aus = Aus & vbCrLf & Satz
    16. Zeile = Zeile + 1
    17. end if
    18. Loop
    19. fso.CreateTextFile(OrdnerAus & "\" & fso.GetBaseName(Datei.Name) & ".csv").Write Mid(Aus, 3)
    20. XL.ActiveWorkbook.Close False
    21. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    22. 2. Einfach ist es:
    23. OrdnerEin = "C:\temp\download\"
    24. OrdnerAus = "C:\temp\download\test"
    25. Set XL = CreateObject("Excel.Application")
    26. Set fso = CreateObject("Scripting.FileSystemObject")
    27. For Each Datei In fso.GetFolder(OrdnerEin).Files
    28. If LCase(fso.GetExtensionName(Datei.Name)) = "xlsx" Then
    29. XL.Workbooks.Open Datei.Path
    30. XL.ActiveWorkbook.SaveAs OrdnerAus & "\" & fso.GetBaseName(Datei.Name) & ".csv", 6, , , , False
    31. XL.ActiveWorkbook.Close False
    32. End If
    33. Next
    34. XL.Quit
    35. Set XL = Nothing
    36. Set fso = Nothing

    Problem:
    Die erste Datei (Test1.xlsx) xlsx wird als csv konvertiert, die zweite Datei (Test2.xlsx) im gleichen Verzeichnis wird geöffnet, kann aber nur per Taskmanager geschlossen werden.
    Eine Fehlermeldung erscheint nicht.

    Vielleicht hat jemand eine Lösung wieso, nach der ersten Datei keine weitere konvertiert wird, bzw geöffnet bleibt.

    Gruß
    Bewie



    Gruß
    Bewie

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Bewie“ ()