_ExcelBookClose reagiert nicht

  • Salü miteinander

    Ich hab hier ein völlig schräges Problem, und ich DREH DURCH!

    Folgendes (abgespecktes) Script:

    Spoiler anzeigen

    #include <GuiConstantsEx.au3>
    #include <Excel.au3>
    #include <Array.au3>
    #include <EditConstants.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <Date.au3>
    #include <WinAPI.au3>
    #include <File.au3>
    #include <Inet.au3>


    InitializeMoneygramExcel()

    ; ------- Das ist der Teil, der mich zum heulen bringt weil excel prozess nicht schliesst ------------------------

    Local $oExcel = _ExcelBookOpen(@scriptdir&"\MONEYGRAM MASTERLISTE.xlsx", @SW_HIDE)

    _ExcelBookClose($oExcel)

    ;excel sollte verschwunden sein, tut es aber nicht.

    ; ---------------------------- Teil Ende, der mich zum heulen bringt ----------------------


    ; --------------------------- hier funktionierts , excel prozess geht auf und wieder zu ---------------------------------

    Func InitializeMoneygramExcel()
    Local $oExcel = _ExcelBookOpen(@scriptdir&"\MONEYGRAM MASTERLISTE.xlsx", @SW_HIDE)

    Local $i=1
    Local $sCellValue="xxx"
    Global $CountMoneygramLines=0
    ProgressOn("Records einlesen","Records")
    while NOT($sCellValue=="")

    ProgressSet(Round($CountMoneygramLines/10, -1) , $CountMoneygramLines& " Records")
    $sCellValue = _ExcelReadCell($oExcel, $i, 1)


    $CountMoneygramLines=$CountMoneygramLines+1
    $i=$i+1


    WEnd


    $CountMoneygramLines=$CountMoneygramLines-1
    Global $aVST_List = _ExcelReadArray($oExcel, 1, 1, $CountMoneygramLines, 1) ;Direction is Vertical


    ProgressOff()
    _ExcelBookClose($oExcel)


    EndFunc



    Nun, ich lese ja erst die Anzahl Zeilen im Programm. Dazu öffne ich das Excel Sheet, lese, schreibe in den Array, schliesse via Excel handler $oExcel. <- funktioniert

    Dann, an einer anderen Stelle des Programms möchte ich das Excel wieder öffnen (um eine Zeile zu lesen), um es danach wieder zu schliessen. Und das funktioniert nur an genau dieser Stelle des 7000 schweren programms nicht. Ich hab via Taskmanager die Instanzen überprüft. Es ist genau keine drin wenn ich an jene Stelle komme... der Fehler MUSS hier drin sein, aber ich verstehe nicht was daran falsch sein soll.

    Kann mir hier jemand weiterhelfen oder eine Erlärung dafür liefern?

    Ich bitte ganz dringend um Rückmeldung.

    Einmal editiert, zuletzt von Landfloh (4. November 2013 um 13:36)

  • Ganz einfach 8)
    _ExcelBookClose gibt die globale Variable $oExcel nicht frei. Dadurch gibt es immer noch eine Referenz auf das Excel Applikationsobjekt. Excel wird erst beendet, wenn das Skript beendet wird und AutoIt alle angeforderten Speicher etc. freigibt.
    Füge nach _ExcelBookClose

    [autoit]

    $oExcel = 0

    [/autoit]

    ein und das Problem ist behoben.

    Andere Lösung:
    Verwende meine aktualisierte Version der Excel UDF (ist aber komplett neu geschrieben und daher nicht kompatibel!)

  • Ey, danke vielmals.. ich hab inzwischen gemerkt, dass es in funktionen klappt, da ja die $oExcel als "local" existiert. So kann ich das ganze umgehen, nach Verlassen der jew. Funktionen wird die Excel-Instanz gekillt.

    Trotzdem danke für die Hilfe, ist lieb von Dir.


    Lieber Gruss


    Flo

  • Solltest Du übrige Zeit haben, dann wäre ich froh, wenn Du mit der ExcelEX UDF etwa spielen könntest.
    Je mehr testen umso besser und umso eher wird sie Teil von AutoIt und ersetzt die bestehende Excel UDF.