Excel Embedded

  • Hallo zusammen,

    ich möchte gern eine Excel-Datei(2010 mit Macros) die auf einem Server liegt und in unregelmäßigen Abständen aktualiesiert wird, zur Ansicht auf einem lokalen Rechner starten.

    Da das ausführen der Excel-Datei auf dem Server ausfällt(da sie als geöffnette Datei nicht mehr aktualiesiert werden kann) erstelle ich als erstes eine lokale Kopie.

    Dann starte ich die Datei als Embedded, was auch schon funktioniert. Dann möchte ich das auf dem Button unten in der Mitte die Excel-Datei aktualiesiert wird. Hier mein bisheriges Werk(ja teilweise auch zusammenkopiert)

    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    ;~ Local $sSource = 'xxxx'; life Serverpath
    Local $sSource = 'D:\Test\Test.xlsm'; test Lokal
    Local $sWorkDir = 'D:\Temp'
    $sWorkFile = _FileCopyToLocal($sSource, $sWorkDir); erstellen einer lokalen Kopie
    Local $Obj1 = ObjGet($sWorkFile)
    If Not IsObj($Obj1) Then Exit MsgBox(0, 'Abbruchfehler', 'Excel-Objekt konnte nicht erstellt werden.')
    GUICreate('Embedded Excel', @DesktopWidth / 1, @DesktopHeight / 1.1, -1, -1, $WS_MINIMIZEBOX + $WS_MAXIMIZEBOX + $WS_SYSMENU + $WS_CLIPCHILDREN)
    $GUI_ObjExcel = GUICtrlCreateObj($Obj1, 0, 52, @DesktopWidth - 5, @DesktopHeight - 175); die 52 steht für die Höhe der Ribbonbar
    Local $btnRefresh = GUICtrlCreateButton('Neu laden', @DesktopWidth / 2 - 75, @DesktopHeight / 1.1725, 150)
    ; Alle Befehlsschaltflächen deaktivieren:
    ;~ For $Bar In $Obj1.CommandBars
    ;~ If $Bar.Enabled = True Then $Bar.Enabled = False
    ;~ If $Bar.Visible = True Then $Bar.Visible = False
    ;~ Next
    $Obj1.Application.DisplayFormulaBar = False
    $Obj1.Application.CommandBars("Shadow Settings").Visible = False
    $Obj1.Application.DisplayScrollBars = True
    $Obj1.Application.DisplayStatusBar = False
    ;~ GUISetState(@SW_SHOW)
    GUISetState(@SW_MAXIMIZE)
    While 1
    Switch GUIGetMsg()
    Case $btnRefresh
    ;~ MsgBox(0,'','Jetzt wird das ExelWorkbook neu geladen', 2); nur zur info
    $Obj1.Close; Exceldokument schließen
    $work = _FileCopyToLocal($sSource, 'D:\Temp'); aktuelles File vom Server ziehen
    $Obj1 = ObjGet($work); Objekt referenzieren
    If Not IsObj($Obj1) Then Exit MsgBox(0, 'Fehler', 'Excel-Objekt konnte nicht erstellt werden.')
    GUISetState(@SW_SHOW)
    Case $GUI_EVENT_CLOSE
    $Obj1.Close
    Exit
    EndSwitch
    GUIDelete()
    WEnd
    ;~ #ce
    Func _FileCopyToLocal($strFileFullPath, $strDirDestination)
    Dim $arrString, $strFile
    If FileExists($strFileFullPath) Then
    $arrString = StringSplit($strFileFullPath, '\')
    $strFile = $arrString[$arrString[0]]
    If FileCopy($strFileFullPath, $strDirDestination & '\' & $strFile, 9) = 0 Then
    SetError(0, 1)
    Else
    Return $strDirDestination & '\' & $strFile
    EndIf
    EndIf
    EndFunc;==>_FileCopyToLocal

    [/autoit]

    So jetzt zu meinen Problemen:

    - das aktualiesieren funzt noch garnicht

    - was noch schlimmer ist, das Objekt scheint nicht richtig geschlossen zu werden. Beim ersten Start geht es noch, danach benötigt es ewig zum Starten, und beim runterfahren des Rechners bekomme ich hinweismaldungen das es noch geöffnette Excel-Dateien gibt.

    Ich gebe bald auf.

    MfG Jescho

    Jeder hat mal klein angefangen - aber nicht jeder kommt groß raus!

  • [autoit]

    $work = _FileCopyToLocal($sSource, 'D:\Temp'); aktuelles File vom Server ziehen

    [/autoit]

    liefert 0 zurück, da die Datei durch

    [autoit]

    $Obj1.Close; Exceldokument schließen

    [/autoit]

    nicht geschlossen bzw. freigegeben wird.
    Habe aber leider auch keinen Weg gefunden das Problem zum beheben :(

  • water ja das ist richtig. Nachdem ich im Taskmanager den Excel-Prozess geschlossen habe, kommt als Rückgabe von _FileCopyToLocal auch wieder der Dateipath.

    Bleibt die Frage wie ich das Objekt sauber beende.

    Wer kann helfen?

    MfG Jescho

    Jeder hat mal klein angefangen - aber nicht jeder kommt groß raus!