okidoki
Goto Top

VBS: Excel öffnen, aktualisieren und speichern ohne Nachfrage

Ich möchte gerne mittels vbs eine Excel-Datei öffnen, aktualisieren und ohne Nachfrage speichern. Soweit bin ich, leider funktioniert speichern nicht:
Set appXLS = CreateObject("Excel.Application")  
Set wbkXLS = appXLS.Workbooks.Open("test.xlsx", , true)  
wbkXLS.RefreshAll

wbkXLS.SaveChanges = True

wbkXLS.Close 0
Set wbkXLS = Nothing
appXLS.Quit
Set appXLS = Nothing

Habe ihr einen Tipp für mich?
Gruß okidoki

Content-ID: 81158150187

Url: https://administrator.de/forum/vbs-excel-oeffnen-aktualisieren-und-speichern-ohne-nachfrage-81158150187.html

Ausgedruckt am: 22.12.2024 um 18:12 Uhr

rubberman
rubberman 23.03.2024 um 14:30:53 Uhr
Goto Top
Hallo,

SaveChanges ist der Name des ersten Parameters der Close Methode. VBS kennt diese Namen aber ohnehin nicht, darum Zeile 5 weg und in Zeile 7
wbkXLS.Close True
wobei das True das Argument für den SaveChanges Parameter ist.

Grüße
Steffen
OKIDOKI
OKIDOKI 23.03.2024 um 16:44:48 Uhr
Goto Top
Hallo rubberman,

vielen Dank für deine RM face-smile
Durchlaufen tut er - gute Nachricht!
Allerdings habe ich noch irgendwo einen Stein drin ...
Denn, aktualisieren tut er die Datei nicht (hat er vorher auch irgendwie nicht gemacht).
Nach dem händischen öffnen aktualisiert er sich merklich, bei der Automatik gelingt dies nicht.

Hast du eine Idee?
okidoki
12168552861
12168552861 23.03.2024 aktualisiert um 17:41:32 Uhr
Goto Top
Denn, aktualisieren tut er die Datei nicht
Wenn du die Mappe mit dem dritten Open-Parameter "ReadOnly" öffnest was erwartest du 🙃?
With CreateObject("Excel.Application")  
    .DisplayAlerts = False
    With .Workbooks.Open("test.xlsx",true ,false)  
        .RefreshAll
        .Close True
    End With
    .DisplayAlerts = True
    .Quit
End With
RTFM
https://learn.microsoft.com/de-de/office/vba/api/excel.workbooks.open

Gruß pp.
OKIDOKI
OKIDOKI 24.03.2024 aktualisiert um 16:19:45 Uhr
Goto Top
... da hatte ich "natürlich" andere Erwartungen face-smile face-smile face-smile

Leider klappt das irgendwie immer noch nicht ... bist du so lieb uns schaust noch einmal drüber?

Hier noch einmal mein kompletter Code. Dabei wird ein Tabellenblatt auch extern gespeichert. Vielleicht ist mein Code auch total durcheinander (tut mir sehr leid). Bis auf das Aktualisieren und speichern hat bis jetzt aber immer funktioniert:
 >print.vbs ECHO Set appXLS = CreateObject^("Excel.Application"^)  
>>print.vbs ECHO Set wbkXLS = appXLS.Workbooks.Open^("%weg%Ganztag.xlsx",true ,false^)  
>>print.vbs ECHO wbkXLS.RefreshAll
>>print.vbs ECHO wbkXLS.sheets^("%sheet%"^).SaveAs"%weg%%sheet%.txt", 6, , , , false  
>>print.vbs ECHO wbkXLS.Close 0
>>print.vbs ECHO Set wbkXLS = Nothing
>>print.vbs ECHO appXLS.Quit
>>print.vbs ECHO Set appXLS = Nothing
print.vbs
erase /Q  print.vbs

PS: DisplayAlerts hatte ich noch nicht eingebaut ... es kam aber auch keine Meldung, also schließe ich daraus, dass er nicht speichert face-sad
PS2: >>print.vbs ECHO wbkXLS.Close true funktioniert leider nicht, daher wieder '0' eingesetzt - warum auch immer!
12168552861
12168552861 24.03.2024 um 15:51:32 Uhr
Goto Top
Wenn du schon eacapst dann doch bitte alles was muss!
OKIDOKI
OKIDOKI 24.03.2024 um 16:20:45 Uhr
Goto Top
Total richtig - erledigt -
dennoch, speichern gelingt immer noch nicht ...
12168552861
Lösung 12168552861 24.03.2024 aktualisiert um 17:50:00 Uhr
Goto Top
Zitat von @OKIDOKI:

Total richtig - erledigt -
dennoch, speichern gelingt immer noch nicht ...

Sind ja auch immer noch einige Syntaxfehler in deinem Code ...🙃. Und wieso überhaupt alles in ne Batch quetschen geht doch simpel mit ner VBS oder PS.

Naja die ewigen Jagdgründe halt...
>print.vbs (
    echo With CreateObject^("Excel.Application"^)    
    echo .DisplayAlerts = False
    echo With .Workbooks.Open^("%weg%Ganztag.xlsx",true ,false^)    
    echo .RefreshAll
    echo .Close True
    echo End With
    echo .DisplayAlerts = True
    echo .Quit
    echo End With
)
wscript //NOLOGO print.vbs
del print.vbs

Ich bin raus, Kasperltheater 😂
OKIDOKI
OKIDOKI 25.03.2024 um 08:38:31 Uhr
Goto Top
Ich danke dir für deine Mühe!

Als Teilzeit-Mini-Programmierer ist es nachvollziehbar fatal, mit der alten Technik umzugehen ... dennoch bin ich bei meinem kleinen Projekt schnell überfordert, das zumindest lauffähig vorhandene in eine aktuelle Spreche zu transformieren.
Du hast aber vollkommen recht, die Jagdgründe sollten da bleiben wo sie sind face-smile

Vielen Dank noch einmal!
OKIDOKI
OKIDOKI 26.03.2024 um 09:13:58 Uhr
Goto Top
Eine kleine Ergänzung, mit der es jetzt auch in den "ewigen Jagdgründen" klappt (klappen sollte):
 >print.vbs ECHO Set appXLS = CreateObject^("Excel.Application"^)    
>>print.vbs ECHO Set wbkXLS = appXLS.Workbooks.Open^("test.xlsx",true ,false^)    
>>print.vbs ECHO wbkXLS.RefreshAll
>>print.vbs ECHO appXLS.DisplayAlerts = False
>>print.vbs ECHO wbkXLS.SaveAs "test.xlsx", 51  
>>print.vbs ECHO appXLS.DisplayAlerts = True
>>print.vbs ECHO wbkXLS.Close 0
>>print.vbs ECHO Set wbkXLS = Nothing
>>print.vbs ECHO appXLS.Quit
>>print.vbs ECHO Set appXLS = Nothing
print.vbs
erase /Q  print.vbs
Hier sind einige andere häufig verwendete Dateiformat-Codes für die SaveAs-Methode:
51: XLSX (Standard Excel-Dateiformat ohne Makros)
52: XLSM Excel-Dateiformat mit Makros
56: CSV (Kommagetrennte Werte)
17: PDF (Portable Document Format)

Vielleicht kann damit jemand etwas anfangen face-smile
rubberman
rubberman 27.03.2024 um 16:59:13 Uhr
Goto Top
OKIDOKI
OKIDOKI 28.03.2024 um 21:18:51 Uhr
Goto Top
Hey, das ist noch einmal eine gute Ergänzung - diese Liste habe ich vermisst!!!
Wie ich zur "51" kam, kann ich jetzt ja verraten - wir sind ja unter uns face-smile
Zuerst habe ich an 'Area 51' gedacht, geht ja immer!
Nein im Ernst, die Lösung brachte Windows Copilot face-smile
Woher er allerdings die Zahl hatte (Quelle), das konnte er mir nicht sagen!
Also in sofern, rubberman: Du bist unersetzlich!!!
rubberman
rubberman 29.03.2024 um 13:35:42 Uhr
Goto Top
Ich bin absolut ersetzlich denn ich weiß den Link auf diese Werte ganz sicher nicht auswendig, gehe aber anders vor als du. Die 51 wird als Argument an SaveAs übergeben. Heißt, eine Suche nach "Excel Workbook SaveAs method" führt dich geradeaus zu
https://learn.microsoft.com/en-us/office/vba/api/excel.workbook.saveas
und dort ist o.g. Seite der XlFileFormat Enumeration für den FileFormat Parameter verlinkt.
That's it ¯\_(ツ)_/¯

Grüße
Steffen
OKIDOKI
OKIDOKI 29.03.2024 um 17:38:23 Uhr
Goto Top
Hallo rubberman,
meine Bemerkung war nur als Kompliment gedacht! Ich war dankbar über die Hilfe der Community, wobei es keine finale Lösung gab (alte Jagdgründe, was ich auch verstehe!). Dennoch läuft bei mir ein "altes" System (seit Jahren), mit dem ich sehr gut klar komme. Ein "neues" Aufsatteln würde meine Fähigkeiten schlicht überfordern ...
Es sind auch nur Kleinigkeiten zu optimieren (daher meine Frage) und mein beschriebenes Problem lag mir schon lange im Magen - nun wollte ich es noch einmal angehen face-smile.
Und - das ist ja ein Kern einer Community - mit eurer Hilfe bin ich sogar selbst auf eine Lösung gekommen!
Noch einmal vielen Dank!!!

Ein Wunsch hätte ich dennoch: Auch wenn vieles Coding modernen admins "alt" vorkommt, gibt es eben noch Existenzen ... ich wüsste selbst gar nicht so recht, wie ich meinen ganzen Batch-vbs-Excel-Kram in modern umwandeln sollte - auch wenn ich mir das wünschen würde!!! Zumindest komme ich im Code sehr gut selbst zurecht, was eigentlich auch ausreicht!!!
Nur kurz zu meinem Projekt: Alles wird in Excel verwaltet. Um nun bestimmte Blätter nach einer Berechnung auszugeben (teilweise bis zu 50 Stk.), baute ich auf ein kleines Batch, dass über vbs alles steuert, sogar mit wenigen Klickibuntis, das immer weiter wuchs und ich optimierte (aktuell 933 Zeilen) ... wie das nun umzusetzen in modern wäre (was ich mir wünschte) wüsste ich nicht anzugehen.
Das Problem ist, dass die Selbstlernkurve sehr flach verläuft und ich wirklich sehr viel nachfragen müsste ...
Oder es gibt irgendwo ein Tut, wo ich mir den Code selbst anpassen könnte und rein käme. Wie gesagt, ich möchte gerne Excel von außen steuern: Dateien kopieren anhand einer Auswahl, umbenennen, Blätter aktualisieren und Ergebnisse als pdfs ausgeben. Denn jedes einzelne pdf in Excel händisch zu erzeugen ist sehr zeitaufwändig! Daher kleines Menu in Batch, Abarbeitung in vbs und zur Krönung noch WBusy von Horst Schaeffler https://www.horstmuc.de/w32dial.htm#wbusy
Natürlich old, old, oldschool, was ist die Alternative???

Vielleicht hat jemand einen Tipp? Link o.ä.? Oder soll ich mein Projekt bei administrator skizzieren, quasi für andere Oldies zum Mitschreiben? Wenn es ok wäre, würde ich es vorstellen - bei "Hand vor Kopf hauen" wäre es mir zu peinlich face-smile
Bis dahin freue ich mich erst einmal über das aktuelle Ergebnis und muss zwangsläufig in den Jagdgründen verbleiben face-smile

VG okidoki
rubberman
rubberman 30.03.2024 aktualisiert um 12:12:02 Uhr
Goto Top
Moin okidoki.

meine Bemerkung war nur als Kompliment gedacht
Hatte ich so verstanden, danke! Meine Antwort war als Hilfe zur Selbsthilfe gedacht. Vieles ist gut dokumentiert und statt nach der copy/paste Komplettlösung zu suchen, macht es Sinn sich solche Dokumentationen anzusehen und zu verstehen. Dann wird nicht nur die Lernkurve steiler, sondern du kannst dir besser und schneller selbst helfen.

Vielleicht hat jemand einen Tipp?
Alles was unter Windows möglich ist, kannst du mit PowerShell umsetzen, incl. grafischen Oberflächen. Mit der Syntax muss man sich natürlich erst mal beschäftigen, aber jede Sprache ist nur Mittel zum Zweck. Wenn du ein gutes Konzept hast und weißt wie man die einzelnen Aufgaben in Codealgorithmen umsetzt, ist die Sprache zweitrangig. Die ganze Fernbedienungsgeschichte von Excel beruht auf der entsprechenden COM Schnittstelle von Office, und zwar sowohl in VBS als auch in jeder anderen Scriptsprache, wie PS. Heißt, das lässt sich einfach von einer in die andere Sprache übernehmen. Davon abgesehen habe ich bis vor ~15 Jahren auch viel mit Excel gemacht, hab aber die Automationen gleich in Excel VBA umgesetzt. In der Regel gibt es keinen Grund um mehr als eine Sprache zu verwenden, sofern diese Sprache alles abbilden kann was man braucht. Alles andere macht es nur unübersichtlich und langsam, da fremder Code auch in anderen Apps läuft für die neue Prozesse gestartet werden. Von z.T. nötigen Kommunikationen zwischen Prozessen, will ich besser gar nicht erst reden.

Was deine 1000 Zeilen Code angehen, so wird sich das vermutlich tatsächlich niemand ansehen. Davon ausgehend, dass sich darin 100 GOTO Anweisungen verbergen, obwohl auch Batch bereits seit 25 Jahren prozedural geschrieben werden kann (ohne dir was unterstellen zu wollen, lasse mich auch gern vom Gegenteil überzeugen), ist so etwas nur von dem zu durchschauen, der den Code geschrieben hat. Alle anderen finden sich darin erst nach Stunden zurecht. Und so viel Zeit investiert niemand.

Grüße
Steffen