Excel - Referenz auf offene Datei und Makro starten

  • Hallo Freunde der automatisierten Schritte,

    zur Excel-UDF <Excel.au3> habe ich in der deutschsprachigen Hilfe gelesen, dass mit der Funktion zuerst immer eine Excel-Datei geöffnet wird und eine Objekt-ID erstellt wird.

    Wie kann ich die Referenz (Objekt-ID) auf eine bereits geöffnete Excel-Datei setzen (es sind mehrere Excel-Dateien in separaten Fenstern – Office 2010 bzw. 2013 – geöffnet)?

    Ich möchte die zu "verbindende" Excel-Datei über den Fenster-Namen finden.

    Wie kann ich das Makro „Test“, welches in dieser Excel-Datei gespeichert ist, ausführen?


    Viele Grüße und vielen Dank :)
    AutoMit


    [Hilfe erbeten]
    + Nutze aktuelles Autoit
    - mangels guter Englischkenntnisse verstehe ich die englische Hilfe-Datei kaum und greife daher auf die letzte deutschsprachige Hilfe von 2013 zurück
    + Bin ebenso an Lösungen interessiert, die auf der englischen Hilfe basieren. Bitte schreibt dann lauffähige Script-Beispiele mit in Eure Antworten. Das wäre eine echte Hilfe.
    (diese Zeilen verdankt Ihr einer Bitte von Bugfix :-))

    2 Mal editiert, zuletzt von AutoMit (29. Januar 2016 um 21:29)

  • Du setzt noch die 3.3.8.1 Version von Autoit ein? Gibt's dafür einen Grund? Die Excel UDF der 3.3.12.0 und später ist um Hausecken schneller und einfacher.

  • Du setzt noch die 3.3.8.1 Version von Autoit ein? Gibt's dafür einen Grund? Die Excel UDF der 3.3.12.0 und später ist um Hausecken schneller und einfacher.

    Ich sag ja, heute ist der Wurm drin. Zitat: "die deutsche Hilfe v3.3.8.1 vom 23.12.2013" und danke für den Hinweis, ich abe es oben editiert und ergänzt, dass ich natürlich die aktuelle Autoit-Version nutze.

    Einmal editiert, zuletzt von AutoMit (29. Januar 2016 um 20:41)

  • Für die aktuelle Autoit Version hilft Dir die 3.3.8.1 Hilfe nichts. Die Excel UDF wurde völlig neu geschrieben mit vielen Script Breaking Changes.
    Also:

    Code
    #include <Excel.au3>
    Global $oExcel = _Excel_Open()
    Global $oWorkbook = _Excel_BookAttach($sTitel, "Title")
  • Danke, dass ist ein Ansatz - ich versuche mich dann mal in der englischen Hilfe, auch wenn ich fast Wort für Wort nachschlagen muss :)

    Ohne Englischkenntnisse ist man bei Autoit zum Teil aufgeschmissen.

    "Script Breaking Changes" laut Google
    "Script Aktuelle Änderungen"Ah - also viele Neuerungen. Gebe es Gott :) - oder wer auch realistisch gesehen das könnte - dass es eine aktualisierte deutsche Hilfe gibt.


    Wie kann ich per Hotkey in Scite von der deutschen auf die englische Hilfe umschalten? Gibt es dafür eine einfache Möglichkeit?

    Einmal editiert, zuletzt von AutoMit (29. Januar 2016 um 20:54)

  • Global $oWorkbook = _Excel_BookAttach($sTitel, "Title")

    Ich habe eine Excel-Datei namens test.xlsx offen.

    Alle Deine Scriptzeilen eingefügt und die letzte geändert in

    Global $oWorkbook = _Excel_BookAttach($sTitel, "test")

    oder

    $sString = "test"
    Global $oExcel = _Excel_Open()
    Global $oWorkbook = _Excel_BookAttach($sString)

    Ausgeführt.

    Jetzt ist Excel zusätzlich 2x offen, die Zeilen und Spalten sind weg. Eine große graue Fläche. Excel lässt sich nicht mehr schließen. Nur die Excel-Tabelle "test", die zuvor offen war, konnte ich per Hand schließen.

    Ich glabue, ich brauche doch noch Hilfe.

  • kurzer Nachtrag aus der alten deutschen Hilfe - dort steht:

    _ExcelBookAttach

    Hängt eine Excel-Datei an die erste Instanz von Microsoft Excel an, dessen Suchstring passt, je nach ausgewähltem Modus

    "Hängt eine Excel-Datei an die erste Instanz von Microsoft Excel an"

    Diesen Satz verstehe ich nicht - was bedeutet dieser?

    Ich will nichts an eine erste Excel-Instanz hängen.

    Ich habe eine Excel-Datei offen, und auf die brauche ich wohl eine Referenz, um eine Object-Id zu erhalten, um dort Makros starten zu können - oder?

  • Code
    $sString = "test"
    Global $oExcel = _Excel_Open()
    Global $oWorkbook = _Excel_BookAttach($sString, "Title")

    Sollte funktionieren.

  • Leider hier nicht - Excel 2013 / Windows 8.1 / 64

    Als Rückgabewert $oWorkbook = 0, was laut Hilfe ein Fehler ist.

    Der Effekt bleibt:

    Jetzt ist Excel zusätzlich 2x offen, die Zeilen und Spalten sind bei den 2 neuen Fenstern weg. Die zuvor geöffnete text.xlsx ist unberührt.

    Eine große graue Fläche. Excel lässt sich nicht mehr schließen. Nur die
    Excel-Tabelle "test", die zuvor offen war, konnte ich per Hand
    schließen.

    Kann jemand bitte, der Excel 2013 hat, diese Zeilen aus Post 10 gegentesten, ob er eine Objekt-ID erhält?

    AutoIt
    #include <Excel.au3>
    
    
    $sString = "test"                                       ; hier den Titel des Excel-Fensters eintragen
    Global $oExcel = _Excel_Open()
    Global $oWorkbook = _Excel_BookAttach($sString, "Title") ; unverändert lassen
    MsgBox (0, "",$oWorkbook & "   ... sollte ungleich 0 sein")

    PS: Dabei spielt es keine Rolle, ob ich eine einfache .xlsx oder eine .xlsm (mit Makros) nehme.

    4 Mal editiert, zuletzt von AutoMit (30. Januar 2016 um 00:10)

  • Was ist der Wert von @error nach BookAttach?

  • Fehler: 1 Objekt-ID: 0 @extended: -2147352570

    laut Hilfe:

    @error:
    1 - An error occurred or $sString can't be found in any of the open
    workbooks. @extended is set to the COM error code

    PS:

    Fehler: 1 Objekt-ID: 0 @extended: -2147352570

    Gleiche Werte auch, wenn Excel geschlossen ist. Dann werden auch nicht 2x neue Excel-Instanzen geöffnet, die hängen bleiben und bei denen zwar die Ribbon-Bar mit der Maus benutzt werden kann. Aber deren Zellenraster verschwunden sind. Man kann das Menü bedienen, aber es bewirkt nichts. Einige wenige Funktionen sind grau, wie "Datei speichern untern", hingegen Datei speichern gibts :)

    Ich habe keine Idee, warum 2 neue Excel-Instanzen bei dem 4Zeiler aus Post 10 geöffnet werden.

    PS 2:

    Gleicher Fehler, wenn ich den kompletten Titel übergebe:
    "test - Excel"

    PS 3:

    ;~ Suche nach dem Fenstertitel -> Fehler: 1 Objekt-ID: 0 @extended: -2147352570

    weiter getestet

    ;~ Suche nach dem Dateinamen -> Fehler: 1 Objekt-ID: 0 @extended: -2147352570

    ;~ Suche nach dem kompletten Pfad -> Fehler: 0 Objekt-ID: @extended: 0
    (erstaundlich - Veränderung bei @extended)

    auch bei den beiden letzten Varianten gleiches Fehlerbild. 2 weitere Excel-Instanzen, grau ohne Raster ...


    Bleibt abzuwarten, ob hier jemand auch Excel hat und den 4Zeiler aus Post 9 testen kann.


    .

    5 Mal editiert, zuletzt von AutoMit (30. Januar 2016 um 00:08)

    • Offizieller Beitrag

    Ist dir das Excel-Objektmodell bekannt? Zumindest im Groben sollte man wissen, wie es funktioniert.
    Hier mal mit nativem AutoIt-Code ein Bsp., wie man ein neues Excel-Objekt erstellt oder auf ein geöffnetes Excel referenziert. Ich bin der Meinung, wenn man auf der Basis des VBA-Codes (den man im Office-VBA-Editor nachvollziehen kann) erst mal beginnt mit Excel zu arbeiten, versteht man auch besser, was hinter den Funktionen der UDF steckt.
    Aber du wirst nicht umhin kommen, deine Englischkenntnisse zu verbessern, wenn du im Netz nach Programmierhinweisen suchst. Deutsch ist da eher die Ausnahme.

    AutoIt
    Local $oExcel = ObjCreate("Excel.Application")                                 ; Excel-Objekt neu erstellen
    ; oder bei bereits geöffnetem Excel
    $oExcel = ObjGet('', "Excel.Application")                                      ; Excel-Objekt bei bereits geöffnetem Excel erstellen (zusätzlich steuerbar über Parameter 'Datei' und 'Instanz')
    
    
    Local $oBook = $oExcel.Workbooks.Open($sFilePath)                              ; bestimmte Datei öffnen und darauf Referenz erhalten
    Local $oSheet = $oBook.Sheets(1)                                               ; Referenz auf Tabellenblatt 1 (alternativ kann der Name verwendet werden)
  • Probier mal das aus:

    Code
    #include <Excel.au3>
    Global $sWorkbook = "C:\temp\test.xlsx"
    Global $oExcel = _Excel_Open()
    Global $oWorkbook = _Excel_BookOpen($oExcel, $sWorkbook)
    MsgBox(0, "Excel", "Titel: " & $oWorkbook.Application.Caption)
    
    
    $sTitle = "Microsoft Excel - Test.xlsx" ; Muss der Ausgabe der vorigen MsgBox entsprechen (bei Excel 2010)
    $oWorkbook = _Excel_BookAttach($sTitle, "title")
    MsgBox(0, "Excel", "Fehler bei _Excel_BookAttach: " & @error)

    Die erste MsgBox gibt den Titel aus, so wie er dann von _Excel-BookAttach (bzw. Excel) erwartet wird.

  • Und die Lösung lautet? Dann hat der nächste Benutzer mit diesem Problem auch etwas von diesem Thread.