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.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.