Page 1 of 1

Excel Objekt trennen und wieder neu verbinden

Posted: 21 Jun 2019, 02:06
by Milchmann
Hallo,

ich ahbe wieder mal ein problem.


Ich erstelle ein Objekt:

Code: Select all

oExcel := ComObjCreate("Excel.Application")
str := "ahk_id" oExcel.hwnd
oExcel_Datei := oExcel.Workbooks.Add()
oExcel_Blatt := oExcel_Datei.Worksheets[1]
Dieses verändere ich in dem ich viele Spalten hinzufüge.
Dann habe ich leider einen Server, der beim Speichern der Exceldatei aussteigt. Da kommt von Excel einen Fehlermeldung.
Nun will ich alle Prozesse von Excel abschiessen mit folgenden Code:

Code: Select all

Loop,
{
Process,exist,excel.exe
if (errorlevel != 0)
Process,Close,excel.exe
else
break
}
Es bestehen ja danach noch die Objekte "oExcel_Datei " und "oExcel_Blatt "
Kann ich nach schliessen aller Excel Prozesse die Objekte wieder Excel zuweisen, so dass ich diese dann weiter bearbeiten oder speichern kann?

Danke

Re: Excel Objekt trennen und wieder neu verbinden

Posted: 21 Jun 2019, 12:27
by Kobaltauge
Ich bin nicht ganz sattelfest, was COM betrifft. Meines Wissens wird die COM Schnittstelle von Windows zur Verfügung gestellt. Deshalb ist es auch ein Unterschied, ob z.B. Excel schon läuft oder nicht. Ich habe vor langer Zeit diesen Code gefunden und verwende ihn immer in meine Skripts.

Code: Select all

try XL := ComObjActive("Excel.Application") ;handle to running application
Catch {
    MsgBox % "no existing Excl object:  Need to create one"
XL := ComObjCreate("Excel.Application")
Dann kann man jede Excel Datei öffnen.

Code: Select all

XL.Workbooks.Open("c:\temp\excel.xlsx")
Und beim Beenden wieder schließen.

Code: Select all

XL.Workbooks.Close()
XL.Quit
XL=
Ich würde an deiner Stelle, nachdem ich alle Excel Prozesse geschlossen habe, diese mit dem o.g. Code wieder öffnen.

Wenn deine Server Verbindung immer wieder abkackt, dann könntest du doch das Excel lokal bearbeiten und dann am Ende auf den Server kopieren. Damit könntest du das Problem vielleicht umgehen.

Re: Excel Objekt trennen und wieder neu verbinden

Posted: 23 Jun 2019, 12:38
by Milchmann
Hallo Kobaltauge,

den Code kenne ich. Nützt mir aber nichts, da ich es nicht schaffe die veränderte Excel zu speichern. Da kommt immer eine Fehlermeldung hoch. Deswegen wollte ich ja alle Instanzen von EXCEl schliessen und habe noch das Objekt workbook, wo ich die geänderten Daten ja drin habe.
Diese Objekt will ich wieder mit einer Excelinstanz verbinden , um diese Daten dann neu zu speichern.

Re: Excel Objekt trennen und wieder neu verbinden

Posted: 23 Jun 2019, 16:38
by just me
Moin,

ich mag mich da irren, aber mir scheint es logisch, dass Du kein AHK-Objekt sondern ein Excel-Objekt hast, das an einen laufenden Excel-Prozess gebunden ist. Wenn Du alle zugehörigen Excel-Prozesse erfolgreich abgeschossen hast, dürfte der in AHK gespeicherte Verweis auf das Excel-Objekt kaum noch gültig sein.

Heißt soviel wie: "Dieser Weg ist kein Weg, und wer es dennoch tut, ist selbst dran Schuld"!

Re: Excel Objekt trennen und wieder neu verbinden

Posted: 25 Jun 2019, 10:39
by Kobaltauge
Gut erklärt @just me. So sehe ich das auch. Ein COM Objekt ist eine Verbindung zwischen zwei Programmen/Prozessen. Wenn die abreißt, dann gibt es da nichts mehr.
Dann hilft nur noch mein zweiter Vorschlag. Editiere lokal und kopiere dann die Datei auf den Server. Wenn dann die Verbindung abbricht, kannst du per Checksumme den Zustand prüfen und ggf. nochmal kopieren.

Re: Excel Objekt trennen und wieder neu verbinden

Posted: 26 Jun 2019, 00:47
by nnnik
Dein Excel Objekt speichert nichts sondern sendet die Daten direkt einfach nur an die Excel instanz.
Wenn diese weg ist kommt einfach nur eine Fehlermeldung nichts weiter.
Falls du es nun doch tatsächlich schaffen solltest dein altes Objekt mit einer neuen Excel instanz zu verbinden dann wird das Objekt alle Daten der neuen Excel instanz enthalten.
Das heißt jedoch es ist ziemlich sicher, dass deine alten Daten da nicht sind.

Ich verstehe nicht ganz wieso du davon ausgegangen bist, dass das Excel Objekt deine Daten für dich speichert.

Re: Excel Objekt trennen und wieder neu verbinden

Posted: 01 Jul 2019, 11:33
by Milchmann
Hallo,

ok danke für die Aufklärung. Ich war bisher der Meinung das in der oExcel_Datei immer noch der gesamte Inhalt der Daten drin ist und nur neu verbunden werden muss und dann der Inhalt des Alten Objektes "oExcel_Datei " in die neue Datei z Bsp:

Code: Select all

oExcel_neu := ComObjCreate("Excel.Application")
oExcel_Datei_neu:= oExcel_neu.Workbooks.Add()
oExcel_Datei_neu := oExcel_Datei ; Altes Exceldatei Objekt 
kopiert werden kann. Wenn dieses aber nur Durchlauferhitzer ist, dann geht das natürlich nicht.
Danke für Eure Bemühungen!