Forum: PC-Programmierung Excel automatisch öffnen und speichern unter


von Eric (Gast)


Lesenswert?

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.

von Helmut H. (helmuth)


Lesenswert?


von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Eric (Gast)


Lesenswert?

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.

von fpga (Gast)


Lesenswert?

>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

von Eric (Gast)


Lesenswert?

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.

von Flip (Gast)


Lesenswert?

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?

von Peter M. (r2d3)


Lesenswert?

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.

von fpga (Gast)


Lesenswert?

>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
Noch kein Account? Hier anmelden.