Philipp_John Geschrieben 19. November 2012 Geschrieben 19. November 2012 Hallo, ich hab ein Problem bei dem ich seit langem nicht weiter komme. Ich hab schon sehr viel gesucht, gegoogelt usw. Viele der gefundenen Lösungsansätze haben auch was gebracht, aber das abschließende Problem ist immernoch da. Mein Vorgang besteht aus 2 Scripten, 1 Batch-Script und 1 VBS-Script. Script 1 (Batch) start excel_aktu.vbs echo >wait.vbs wscript.sleep (65000) cscript wait.vbs del wait.vbs xcopy Beispiel.xls "\\server\ablage\" /R /U /Y pause exit Script 2 (VBS) set excel = Createobject("Excel.Application") excel.Visible = false excel.Workbooks.Open "D:\Excel\Beispiel\Beispiel.xls" WScript.Sleep (2000) excel.ActiveWorkbook.RefreshAll WScript.Sleep (30000) For Each Zelle In excel.Worksheets("Tabelle1").Range("A1:A3000") s = Zelle.Value If s <> "" And IsNumeric(s) Then s = s * 1 Zelle.Value = s End If Next WScript.Sleep (2000) excel.Application.DisplayAlerts = False excel.ActiveWorkbook.Save excel.Application.DisplayAlerts = True WScript.Sleep (2000) excel.Quit WScript.Quit Programmablauf: 1. Script 1 wird per geplanten Task ausgeführt, startet das vbs-Script und wartet anschl. 2. Script 2 öffnet die zu aktualisierende Exceldatei 2. - Daten werden aktualisiert; 3. - Erste Spalte wird in Zahlen umgewandelt; 4. - Exceldatei wird gespeichert und anschl. geschlossen; 5. Das wartende Script 1 kopiert abschließend die Exceldatei an den Ort, an den es vom Mitarbeiter gebraucht wird. Nun zu meinem Problem: Wenn ich die Batch anschmeiße läuft alles einwandfrei durch, es gibt keine Überschreibabfragen etc, nichts. Alles wunderbar. Sobald das Script aber über den Taskplaner läuft bleibt als Prozess immer Excel.exe und WScript.exe hängen. Das kuriose dabei ist, dass es manmal ohne Probleme läuft und manchmal hängen bleibt. Dann muss ich diese händisch killen, damit die Exel-Datei wieder beschreibbar ist. Kann mir hier jemand weiterhelfen was in meinem Script falsch oder fehlerhaft programmiert ist? Es kann ja eigentlich nur an den Wartezeiten oder am beenden der ausführenden Programme liegen. Ich finde den Fehler aber einfach nicht. Für Hilfe wäre ich sehr dankbar. Zitieren
lupo49 Geschrieben 19. November 2012 Geschrieben 19. November 2012 Dann baue erstmal Debug-Schritte in deine Skripte ein, um identifizieren zu können an welcher Stelle sich die Prozesse weghängen. Kannst du die Fenster bei der Ausführung durch den Taskplaner nicht sichtbar machen? Für den Einbau einer Wartezeit kannst du unter Windows auch sleep.exe nehmen. Zitieren
Philipp_John Geschrieben 20. November 2012 Autor Geschrieben 20. November 2012 Ich dachte eigentlich daran, ob mir jemand sagen kann, dass ich eventuell falsche Exel-VBA Befehle verwende. So wie ich das über google herausgefunden habe gibt es ja scheinbar einige verschiedene Methoden zum unterdrücken von Meldungen und Speichern, etc von Exel-Mappen. Aber danke für deinen Vorschlag mit der sleep.exe habe dadurch eine noch elegantere Lösung gefunden: ping -n 1 -w 1000 1.2.3.4>nul Ohne zusatzprogramm direkt in der batch ausführbar, da ping.exe am warscheinlichsten überall verfügbar ist. Zitieren
streffin Geschrieben 10. Dezember 2012 Geschrieben 10. Dezember 2012 (bearbeitet) Script 2 : set excel = Createobject("Excel.Application") die Office Interop ist notorisch schlecht darin, die Prozesse aufzuräumen. Wenn du mal nach excel.Quit suchst, wirst du seehr viel finden zu "warum funktioniert das nicht". Beispiel Ich hatte in der Vergangenheit ähnliche Probleme, (allerdings in .NET) und habe die dann auch über Marshal.FinalReleaseComObject() gelöst. Ich würd an deiner Stelle da ein kleines, .NET Progrämmchen schreiben, dem du per Command line die Parameter mitgibst, aber dann dafür auch mehr möglichkeiten hast, den Excel Prozess sauber zu töten wenn du fertig bist. Das unterdrücken von MessageBoxen in Excel ist recht heikel. Appliacation.displayAlerts = false fängt dir nur einen Teil. Wenn du z.b. einen SQL Fehler in einer DB Abfrage hast, dann bleibt dir der Prozess da trozdem hängen. Das kannst du eventuell mit onError GOTO abfangen, aber schön ist das nicht. Du Fährst besser wenn du die Daten von Aussen in das Excel Sheet einfügst. Tipp dazu : ein Range Objekt in VBA ist nichts anderes als ein 2 Dimensionales Array. Bearbeitet 10. Dezember 2012 von streffin Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.