Excel schließen - Absturz

  • Hi,

    ich werd wahnsinnig. Script öffnet Excel und zeigt Auswertung, bei Mausklick soll sich Excel wieder schließen:

    [autoit]

    #include <GUIConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #Include <Misc.au3>
    #include <excel.au3>

    [/autoit][autoit][/autoit][autoit]

    $oExcel = 0
    $gui = GUICreate("Excel Auswertung", 400, 400)
    $knopf = GUICtrlCreateButton("Auswertung",200,200)
    GUISetState()
    while True
    $msg = GUIGetMsg()
    Select
    case $msg = $GUI_EVENT_CLOSE
    ExitLoop
    case $msg = $knopf
    ; $excel.Application.DisplayFullScreen = True
    $oExcel = ObjCreate("Excel.Application") ; Excel-Objekt erstellen
    $oExcel.Application.DisplayAlerts = 0
    $oExcel.Visible = 1
    $oExcel.SheetsInNewWorkbook = 1 ; Anzahl der gewünschten Sheets beim Erstellen festlegen
    Local $oBook = $oExcel.Workbooks.Add ; im Excel-Objekt ein Workbook-Objekt erstellen
    Local $oSheet = $oBook.Sheets(1) ; Sheet-Objekt für Sheet 1 erstellen (Name oder Index)
    $oSheet.Name = 'Mein Sheet' ; Eigenschft Name ändern
    $oChart = $oSheet.ChartObjects.Add(1, 1, 1000, 600).Chart
    $oChart.ChartType = 4
    for $j = 1 to 2
    for $k = 1 to 30
    $oExcel.Sheets('Mein Sheet').Cells($k+ 12, 2+ $j*5).Value = Random(20)
    next
    $oChart.SeriesCollection.NewSeries
    $oChart.SeriesCollection($j).Values = "='Mein Sheet'!Z14S" & 2 + $j*5 & ":Z" & 30 + 12 & "S" & 2 + $j*5
    $oChart.SeriesCollection($j).Name = "Nummero " & $j
    Next ;= > weiter mit For
    $oChart.HasTitle = True ; Titel aktivieren
    $oChart.ChartTitle.Characters.Text = "Maustaste drücken um Diagramm zu schließen"
    do
    sleep(10)
    until _IsPressed(01)
    ;$oExcel.Close
    $oExcel.Application.Quit()
    $oExcel = ""
    ; If WinExists("Microsoft Excel - Mappe1") Then
    ; winclose("Microsoft Excel - Mappe1")
    ; else
    ;; MsgBox(0, "", "Window exists not")
    ; EndIf
    ;_ExcelBookClose($oExcel,0)
    EndSelect
    WEnd

    [/autoit]

    Funktioniert. Aber wenn ich es öfter mache kommt es irgendwann zum Absturz.
    C:\autoit sachen\GUI+\temp.au3 (50) : ==> The requested action with this object has failed.:
    $oExcel.Application.Quit()

    Manchmal beim 4ten Mal, manchmal erst beim 30ten Mal.
    Ich kann keine Gesetzmäßigkeit finden wann es abstürtz.

    Betriebssystem Win 7 Excel Version 2003, ich habe versucht 32- und 64 bit kompilieren, macht keinenUnterschied.

    Kann mir wer helfen oder zumindest das Problem nachvollziehen?

    Ich danke Euch!

    Einmal editiert, zuletzt von pipo28 (15. Juli 2012 um 09:30)

  • Mit einem COM error handler könntest Du zumindest Informationen sammeln was da tatsächlich passiert.

  • Übrigens: Für Excel Charts gibt's ein UDF (siehe meine Signatur).

  • Sowas gibt es? Sehr praktisch!

    Der Fehler ist die 80020009, Fehlerbeschreibung keine.
    Beim googlen habe ich nur das gefunden was passen könnte:

    ExcelWriter.1 error '80020009': Number of formats has exceeded Excel's limit

    Mache ich vielleicht was falsch weil ich die Resourcen von Excel nicht richtig freigebe?

    Reicht

    [autoit]

    $oExcel.Application.Quit()
    $oExcel = ""

    [/autoit]


    um Excel richtig zu beenden oder muss ich da noch was machen?

    Ich werd wohl morgen versuchen das ganze als Excel Makro in Excel zu schreiben und schaun ob es da auch abstürzt.

  • 80020009 kenn ich nur als allgemeinen Wald- und Wiesen-Fehler. Exception occurred. Das kann alles ein.
    Ist Excel 2003 unter Windows 7 eigentlich noch unterstützt?

  • im folgenden post ging es auch schonmal um das schließen!

    [ gelöst ] _ExcelBookClose erst nach Programmenden?

    [autoit]


    #include <excel.au3>

    [/autoit][autoit][/autoit][autoit]

    $oExcel = _ExcelBookNew(0)
    _ExcelWriteCell($oExcel, "test 123", 1, 1)
    _ExcelBookSaveAs($oExcel, "c:\temp\test.xls")
    _ExcelBookClose($oExcel)
    $oExcel = 0 ; delete object

    [/autoit][autoit][/autoit][autoit][/autoit]
  • Danke euch für die Antworten.

    water Ich werde morgen mal probieren ob ich den Fehler auch mit Win XP und Excel 2007 bekomme, ich glaube aber, dass ich es da auch schon probiert habe und es war das gleiche.

    gmmg das hilt mir leider nicht, das $oExcel = "" aus meinem Code hat die gleiche Wirkung wie $oExcel = 0

    Ich habe jetzt eine unsaubere Lösung gefunden die mir aber erstmal reicht. Ich fange den Fehler mit Error Handler ab, dann stürzt mein Autoit Script nicht mehr ab und wenn er auftritt dann schließe ich Excel über ProcessClose:

    [autoit]

    $oMyError = ObjEvent("AutoIt.Error","MyErrFunc")

    [/autoit][autoit][/autoit][autoit]

    Func MyErrFunc()
    ConsoleWrite("Fehler abgefangen" & @CRLF)
    SetError(1)
    Endfunc

    [/autoit][autoit]

    $oExcel.Application.Quit()
    if @error then
    ProcessClose("Excel.exe")
    EndIf
    $oExcel = 0

    [/autoit]
    • Offizieller Beitrag

    Du solltest das Excel-Objekt erstellen bei Programmstart (oder, falls eine Excel-Instanz bereits läuft, mit ObjGet darauf referenzieren).
    Und bei Programmende schließt du das Excel-Objekt wieder (vorher prüfen ob dein aktuelles Workbook-Objekt, auch das einzige ist --> .Count )
    Dann kommst du gar nicht erst in die Situation, dass evtl. mehrere Instanzen existieren oder nicht aus dem Speicher entfernt sind.

  • Perfekt, genau das ist es!

    Nochmal für alle zum Nachvollziehen:

    Falsch:

    [autoit]

    Do
    $oExcel = ObjCreate("Excel.Application")
    $oExcel.Workbooks.add
    ;irgendwas mit Excel machen
    $oExcel.Application.Quit()
    $oExcel = 0
    until $irgendwas = $passiert

    [/autoit]

    Richtig:

    [autoit]

    $oExcel = ObjCreate("Excel.Application")
    Do
    $oExcel.Visible = 1
    $oExcel.Workbooks.add
    ;irgendwas mit Excel machen
    $oExcel.Workbooks.close
    $oExcel.Visible = 0
    until $irgendwas = $passiert
    $oExcel.Application.Quit()

    [/autoit]