Hallo,
ich bekomme demnächst einige 100 Exceldateien. Um mit diesen Dateien
etwas anfangen zu können, muß ich jede Datei öffnen und als
TAB-getrennten Text wieder abspeichern. Vom Prinzip her ja kein Problem,
z.B. mit dem Makrorecorder und Schaltfläche anlegen. Aber bei einigen
100 Dateien will ich am Geiste gesund bleiebn und das irgendwie
automatisieren.
Ich habe nun schon nach Aufrufparametern für Excel gesucht und könnte
damit auch die jeweils gewünschte Datei automatisch öffnen. Aber in der
dann geöffneten Excel-Instanz weiß ich momentan nicht weiter. Ich stelle
mir das im Moment so vor, daß ich Excel beim Start das Makro als
Parameter mit übergebe. Das scheint aber prinzipiell nicht vorgesehen zu
sein.
Als nächstes habe ich jetzt folgendes gefunden: Ein Makro, was
automatisch beim Öffnen einer Arbeitsmappe ausgeführt wird.
Private Sub Workbook_Open()
//Code
End Sub
Das müßte doch eigentlich klappen. Da ich privat kein Excel habe, kann
ich es leider momentan nicht testen. Und LibreOffice ist hier ja leider
auch inkompatibel.
Hat da jemand einen Tip? Ich brauche nichts vorgekaut, einfach nur einen
Wink in die bzw. eine richtige Richtung.
Statt das Macro in Excel abzulegen, könntest Du es auch mit
Automationsmethoden von außen aufrufen. Das geht z.B. aus VBScript
heraus.
Ein (willkürlich im Netz gefundenes Beispiel)
1
Dim xlApp, xlBook, xlSht
2
Dim filename, value1, value2, value3, value4
3
4
on error resume next
5
6
filename = "c:\warehouse.xls"
7
8
Set xlApp = CreateObject("Excel.Application")
9
set xlBook = xlApp.WorkBooks.Open(filename)
10
set xlSht = xlApp.activesheet
11
12
xlApp.DisplayAlerts = False
13
14
'write data into the spreadsheet
15
xlSht.Cells(2, 2) = "New Data"
16
17
xlBook.Save
18
xlBook.Close SaveChanges=True
19
xlApp.Close
20
xlApp.Quit
21
22
'always deallocate after use...
23
set xlSht = Nothing
24
Set xlBook = Nothing
25
Set xlApp = Nothing
Als "Beispiel.vbs" speichern und mit
1
cscript beispiel.vbs
ausführen.
Du musst hier mehrere Dinge verändern.
Zunächst musst Du herausfinden, wie Du in vbs alle Dateinamen in einem
Verzeichnis bestimmst, um dann die eigentlichen Dinge mit diesen
Dateinamen anzustellen; schließlich heißen Deine Dateien sicher nicht
"c:\warehouse.xls" und Du hast auch sicher keine Lust, die einzeln so
umzubenennen.
Dann kommt dazu, daß Du die Excel-Datei selbst nicht als TSV speichern
kannst, sondern nur die darin enthaltenen Arbeitsblätter, so daß Du mit
einer Schleife alle in xlBook enthaltenen Worksheets (Arbeitsblatt)
iterieren musst, um diese zu speichern.
Ist tatsächlich mehr als ein Arbeitsblatt enthalten, solltest Du Dir
Gedanken um den zu verwendenden Dateinamen machen; Du könntest eine
aufsteigende Nummer anhängen
(bla.xls -> bla.1.csv, bla.2.csv ...) oder den Namen der Arbeitblätter
verwenden, sofern da was sinnvolles drinsteht.
Das Speichern geht mit der SaveAs-Funktion, der Du noch als Parameter
mitgeben musst, welches Format Du verwenden willst.
Hier findest Du ein paar weiterführende Informationen; irgendwo gibt es
auch ein Excel-Automations-Handbuch, das das alles beschreibt.
Bei Google-Suchen ist es immer etwas mühselig, VBA von VBS zu trennen,
ersteres ist für Macros in Excel, letzteres ist für den
windows-eigenen Skriptinterpreter.
Viel Erfolg.
Vielen Dank,
sehr interessanter und mir bisher völlig unbekannter Ansatz. VBS kannte
ich noch gar nicht.
Rufus Τ. F. schrieb:> Du musst hier mehrere Dinge verändern.> Zunächst musst Du herausfinden, wie Du in vbs alle Dateinamen in einem> Verzeichnis bestimmst, um dann die eigentlichen Dinge mit diesen> Dateinamen anzustellen; schließlich heißen Deine Dateien sicher nicht> "c:\warehouse.xls" und Du hast auch sicher keine Lust, die einzeln so> umzubenennen.
Da eine VBS-Datei ja letztendlich eine Textdatei zu sein scheint, kann
ich deren Inhalt ja vor Ausführung mit einem C#-Programm
"aktualisieren". Namen der aktuell vorhandenen Excel-Dateien im
Verzeichnis bestimmen usw., also den variablen Teil des Skripts
anpassen. In C# ist das ja sehr komfortabel.
Werde ich auf jeden Fall mal weiterverfolgen.
>Da eine VBS-Datei ja letztendlich eine Textdatei zu sein scheint, kann>ich deren Inhalt ja vor Ausführung mit einem C#-Programm>"aktualisieren".
Puh, mir scheint das macht die Sache nur komplizierter. Aber probier
mal.
Kleiner tip:
Nie über activesheet auf ein sheet zugreifen, das ist nämlich das gerade
aktive in allen excel-instanzen. immer über den index :
worksheet.sheets(1)
Gruß J
In der Tat ist das etwas "von hinten durch die Brust ins Auge": Mit
einem Programm ein anderes Programm editieren...
War halt ein spontaner Gedanke, da ich VBS nun noch gar nicht kenne.
Wenn es ohne großes Einarbeiten in VBS mit VBS "pur" klappt, werde ich
natürlich das machen.
Danke für die Warnung mit activesheet. Habe gerade mal kurz
nachgeschaut. Wenn ich es richtig verstehe, kann bei nur einem
vorhandenen sheet im workbook nichts schiefgehen; ist bei mir der Fall.
Aber für andere Sachen versuche ich das mal im Hinterkopf zu behalten.
Eigentlich wollte ich mich mit VBA nicht weiter beschäftigen, da hier
nur Mittel zum Zweck. Komme ich wohl aber nicht drum rum und VBA ist ja
zum Glück (zumindest für den Hausgebrauch) auch nicht so kompliziert.
Eric schrieb:> Da eine VBS-Datei ja letztendlich eine Textdatei zu sein scheint, kann> ich deren Inhalt ja vor Ausführung mit einem C#-Programm> "aktualisieren". Namen der aktuell vorhandenen Excel-Dateien im> Verzeichnis bestimmen usw., also den variablen Teil des Skripts> anpassen. In C# ist das ja sehr komfortabel.
Das ist schon ein ziemlich merkwürdiger Ansatz. Warum verwendest du
nicht Microsoft.Office.Interop.Excel, wenn du sowieso schon C# einsetzt?
Kann ja eine einfache Konsolenanwendung sein (kein Add-In). Welche
Version von Excel ist denn installiert?
Eric,
anstelle der Excel-Automatisierung, die ja vermutlich auch eine
installierte Excel-Installation voraussetzt, kannst Du das Problem auch
innerhalb von Excel lösen.
Dazu nutzt Du eine ganz normale Excel-Datei mit VBA-Code, genannt, die
Steuerdatei.
Auf ein Blatt packst Du zeilenweise untereinander in eine Spalte die 100
Namen, bzw. Pfad und Namen der zu konvertierenden Dateien.
Falls die nur den Inhalt eines Ordners darstellen, lassen diese sich
auch per Makrocode einlesen.
Du erstellst eine VBA-Prozedur, die diese Namen alle durchläuft, die
entsprechende Datei öffnet und wieder im richtigen Format abspeicherst
und schließt.
Die richtige Syntax für das Abspeichern guckst Du Dir bei Excel selber
ab, indem Du den Vorgang einmal manuell durchführst und mit dem
Makrorekorder aufzeichnest.
Tip: Auf Inhalte in der "Kontrolldatei" mit "ThisWorkbook." zugreifen.
>Das ist schon ein ziemlich merkwürdiger Ansatz. Warum verwendest du>nicht Microsoft.Office.Interop.Excel, wenn du sowieso schon C# einsetzt?
100% ack.
Wenn du nur auf die Werte in den Tabellenblätter zugreifen willst, ist
das tatsächlich die einfachste Methode. Das geht gut, alles andere ist
sehr frickelig im Vergleich zu VBA.