Excel.au3 - _Excel_Open und _Excel_BookOpen geben kein Excel application object zurück

  • Hallo,

    zunächst einen ganz herzlichen Dank an alle Fragesteller und vor allem an alle, die bereit sind, hier Zeit zu investieren um zu Antworten und sich über UDFs einzubringen. Davon habe ich in der Vergangenheit schon so oft profitiert.
    Diesmal kämpfe ich aber mit einem Problem, wo ich voll auf dem Schlauch stehe und Google und dieses Forum mir auch nicht weiterhelfen konnten.

    Daher hoffe ich auf Eure Hilfe.

    Ich habe ein ganz grundlegendes Problem mit der Excel.au3 und weiß einfach nicht weiter.

    Ich möchte eigentlich nur eine .xlsx Datei öffnen, drei Zellen ausfüllen und wieder schließen.
    Bis auf das Schließen funktioniert auch alles.
    Das Schließen funktioniert nicht, weil er beim Öffnen meine benutzten Variablen nicht mit dem notwendigen Excel application object befüllt. Somit bekomme ich beim Schließen (oder auch Speichern) immer die Fehlermeldung "$oExcel is not an object or not an application object".

    Habe es mal auf das einfachste runtergebrochen - ein Script mit drei Zeilen:

    #include <Excel.au3>;um in Excel Dokumenten zu arbeiten
    Local $prog_Excel = _Excel_Open()
    ConsoleWrite("Excelvariable: " & $prog_Excel)

    Wenn ich es nicht ganz furchtbar falsch verstanden habe, sollte er mir doch jetzt in die Console irgendwas schreiben für die Variable $prog_Excel. Ich sehe da aber nur "Excelvariable: ".

    Mein kompletter Code sieht so aus:


    Hab schon alle möglichen Kombinationen der Parameter für Open und Close ausprobiert und komme auf keinen grünen Zweig.
    Die Variablen $prog_Excel und $Excel_Workbook sind immer leer.
    @error und @extended sind immer 0.

    Nur bei _Excel_Close bekomme ich dann @error=1 und @extended=0.

    Nutze die folgenden Versionen
    Autoit 3.3.14. Auch schon neu installiert heute. 32 Bit bei der Installation ausgewählt.
    Scite 3.5.4. Auch schon neu installiert heute.
    Excel 2010 - 32 Bit.
    Windows 7 64 Bit

    Habt Ihr irgendeine Idee?

    • Offizieller Beitrag

    Wenn ich es nicht ganz furchtbar falsch verstanden habe, sollte er mir doch jetzt in die Console irgendwas schreiben für die Variable $prog_Excel.

    Das hast du dann leider falsch verstanden. Es wird eine Objektvariable erstellt und diese kannst du nicht in die Konsole schreiben.
    Prüfe einfach mal mit:
    If IsObj($prog_Excel) Then ConsoleWrite('Excel-Objekt existiert' & @LF)
    Und wenn du eine Datei öffen möchtest, ist es doch sinnvoll deren Pfad beim Erstellen des Excelobjektes mit anzugeben. Dann sparst du dir den extra Schritt über _Excel_BookOpen (wenn ich nicht irre).

  • so mache ich das immer :)


    Gruß gmmg ;)

  • Hallo,

    vielen Dank für Eure Antworten.

    Problem gelöst.

    Ich habe für die Bearbeitung des Excelsheets mit "Send" gearbeitet.
    Das mag die UDF wohl nicht und verliert dann die Objektvariable.
    Danach kann man das Excel nicht mehr schließen, speichern etc.
    Arbeite jetzt mit _Excel_RangeWrite und jetzt geht alles (und viel schneller ;-))
    Diese Funktion hatte ich gar nicht beachtet, weil ich im gleichen Programm auch Word Dokumente über "Send" ausfülle.

    Gruß
    TomClancy

  • Generell ist die Vermischung von "Send" (Du automatisierst damit die GUI) und einer UDF (die greift auf das Objekt Modell der Anwendung zu) keine gute Idee und führt oft zu Problemen.
    COM ist unabhängig vom Benutzer und damit stabiler.
    Eine gute Idee ist auch die Abfrage von @error nach einem UDF-Funktionsaufruf. Wenn der 0 ist, dann kann das Skript weiterlaufen.