Ich weiß das funktioniert ja auch.
AI öffnet das Makro und Excel beendet das Makro und Excel.
Dann kommt die Fehlermeldung komischerweise.
Ich weiß das funktioniert ja auch.
AI öffnet das Makro und Excel beendet das Makro und Excel.
Dann kommt die Fehlermeldung komischerweise.
Damit wir hier nicht unnötig rumraten müssen. Poste bitte das Skript sowie die Ausgabe der SciTE Konsole.
Wenn AutoIt Excel startet, solltest du das Beenden auch von AutoIt erledigen lassen (logische Konsistenz). Wenn da das Makro zwischenfunkt, führt das nur zu Fehlern.
Hier das Sript wie gewünscht.
#include <Excel.au3>
#include <MsgBoxConstants.au3>
; ===> COM Errorhandler : Kommentarzeichen bei Bedarf entfernen
;~ Local $oErrorHandler = ObjEvent("AutoIt.Error", "_COMErrFunc")
; Erstellt ein Excel Anwendungs-Objekt oder verbindet zu einer bereits Instanz
Local $oExcel = _Excel_Open()
If @error Then
MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_Open ", _
"Fehler beim Erstellen des Excel Anwendungs-Objekt." & @CRLF & _
"@error = " & @error & ", @extended = " & @extended)
Else
MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_Open ", _
"Excel Anwendung wurde erfolgreich geöffnet." & @CRLF)
; öffnet ein existierendes workbook und gibt den Objectidentifier zurück :
Local $sWorkbook = "C:\DHL-Versand\Versand.xlsm"
Local $oWorkbook = _Excel_BookOpen($oExcel, $sWorkbook)
If @error Then
MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_BookOpen ", _
"Fehler beim Öffnen des Workbooks : " & @CRLF & _
"Dateiname : " & $sWorkbook & @CRLF & _
"@error = " & @error & ", @extended = " & @extended)
_Excel_Close($oExcel)
Exit
Else
$oWorkbook.parent.run("Versand") ; Name des Makros
EndIf
Sleep(2000)
; Schließt das Excel Anwendungs-Objekt
_Excel_Close($oExcel)
If @error Then
MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_Close ", _
"Fehler beim Schließen des Excel Anwendungs-Objekt." & @CRLF & _
"@error = " & @error & ", @extended = " & @extended)
Else
MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_Open ", _
"Excel Anwendung wurde erfolgreich geschlossen." & @CRLF)
EndIf
EndIf
; ===> COM Errorhandler : Kommentarzeichen bei Bedarf entfernen
Func _COMErrFunc($oError)
MsgBox(16, "COM Error", "COM-Error ! " & @CRLF & _
"Number is : " & "0x" & Hex($oError.number) & @CRLF & _
"Retcode is : " & "0x" & Hex($oError.retcode) & @CRLF & _
"Scriptline is : " & $oError.scriptline & @CRLF & _
"Windescription is: " & $oError.windescription & @CRLF & _
"Description is: " & $oError.description)
Return SetError(1)
EndFunc ;==>_COMErrFunc
Ich habe das Skript mal etwas gekürzt und die unnötigen Zeilen in Kommentar gesetzt. Wenn das Makro nach getaner Arbeit Excel schließt, dann brauchst Du das im Skript nicht mehr zu tun.
Im Gegenteil: Das Makro beendet Excel. Damit ist die Referenz von AutoIt auf das Excel Objekt nicht mehr gültig und bringt daher einen Fehler, wenn sich _Excel_Close darauf bezieht.
#include <Excel.au3>
#include <MsgBoxConstants.au3>
; ===> COM Errorhandler : Kommentarzeichen bei Bedarf entfernen
;~ Local $oErrorHandler = ObjEvent("AutoIt.Error", "_COMErrFunc")
; Erstellt ein Excel Anwendungs-Objekt oder verbindet zu einer bereits Instanz
Global $oExcel = _Excel_Open()
If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_Open ", _
"Fehler beim Erstellen des Excel Anwendungs-Objekt." & @CRLF & _
"@error = " & @error & ", @extended = " & @extended)
MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_Open ", "Excel Anwendung wurde erfolgreich geöffnet.")
; öffnet ein existierendes workbook und gibt den Objectidentifier zurück :
Local $sWorkbook = "C:\DHL-Versand\Versand.xlsm"
Local $oWorkbook = _Excel_BookOpen($oExcel, $sWorkbook)
If @error Then
MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_BookOpen ", _
"Fehler beim Öffnen des Workbooks : " & @CRLF & _
"Dateiname : " & $sWorkbook & @CRLF & _
"@error = " & @error & ", @extended = " & @extended)
_Excel_Close($oExcel)
Exit
EndIf
$oWorkbook.Parent.Run("Versand") ; Name des Makros
#cs
Sleep(2000)
; Schließt das Excel Anwendungs-Objekt
_Excel_Close($oExcel)
If @error Then
MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_Close ", _
"Fehler beim Schließen des Excel Anwendungs-Objekt." & @CRLF & _
"@error = " & @error & ", @extended = " & @extended)
Else
MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_Open ", _
"Excel Anwendung wurde erfolgreich geschlossen." & @CRLF)
EndIf
#ce
; ===> COM Errorhandler : Kommentarzeichen bei Bedarf entfernen
Func _COMErrFunc($oError)
MsgBox(16, "COM Error", "COM-Error ! " & @CRLF & _
"Number is : " & "0x" & Hex($oError.number) & @CRLF & _
"Retcode is : " & "0x" & Hex($oError.retcode) & @CRLF & _
"Scriptline is : " & $oError.scriptline & @CRLF & _
"Windescription is: " & $oError.windescription & @CRLF & _
"Description is: " & $oError.description)
Return SetError(1)
EndFunc ;==>_COMErrFunc
Alles anzeigen
Folgende Fehler Meldung
>"C:\Program Files (x86)\AutoIt3\SciTE\..\autoit3.exe" /ErrorStdOut "C:\DHL-Versand\Test.au3"
"C:\DHL-Versand\Test.au3" (24) : ==> The requested action with this object has failed.:
$oWorkbook.Parent.Run("Versand")
$oWorkbook.Parent^ ERROR
>Exit code: 1 Time: 10.54
kommt jetzt Makro und Excel werden nicht mehr beendet
Habe das Makro so verändert das Excel nicht mehr durch das Makro gespeichert wird.
Den gleichen Fehler und Excel bleibt offen
>"C:\Program Files (x86)\AutoIt3\SciTE\..\autoit3.exe" /ErrorStdOut "C:\DHL-Versand\Test.au3"
"C:\DHL-Versand\Test.au3" (24) : ==> The requested action with this object has failed.:
$oWorkbook.Run("Versand")
$oWorkbook^ ERROR
>Exit code: 1 Time: 12.07
Dann brauchen wir jetzt die Version mit dem COM error handler.
Jetzt läuft es fehlerfrei, Excel wird nicht beendet und ist in einer Endlosschleife.
Gut. Nächste Version wo wir den COM error der Run-Funktion abfangen und bei Fehler das Skript beenden.
Bei Erfolg wird Excel sauber beendet.
Die Schleife wird 2 mal durchlaufen,
dann wird Excel ohne Fehler beendet.
Welche Schleife?
Die Makrodatei wird 2 mal durchlaufen und beim
2. mal beendet.
Ich habe einen Beenden Button in der Datei, der die Einträge in den Datenblätter löscht.
Mit AI wird das Makro aufgerufen.
Bearbeitet wird nur mit Userforms und Makros
nicht mit Excel (läuft nur im Hintergrund.)
Wenn das Makro abgearbeitet ist muss ich es ja mit einem Button beenden.
Gebe ich per VBA den Befehl zum beenden, kommt die Fehlermeldung.
Was (BugFix #23) geschrieben hat kann nicht funktionieren.
Irgendwie muss ja AI erfahren wann das Makro beendet ist.
Was (BugFix #23) geschrieben hat kann nicht funktionieren.
Du machst also alles mit AutoIt ausser dem Makro? Führe das (also den Inhalt!) doch auch mit AutoIt aus. dann läuft alles in einer Ebene und du hast keine Probleme. Der VBA-Code des Makros kann völlig problemlos in AutoIt-Code übersetzt werden. Womit wir wieder beim Stichwort Excel-UDF sind.
EDIT:
Wenn du natürlich extrem umfangreiche xlsm erstellt hast, kann das etwas aufwändig sein. Ich würde es aber bevorzugen, weil man dann unabhängig von den xlsm wird.
Danke für deine Rückmeldung!
Die xlsm ist sehr umfangreich.
Sehr viele Userforms, SpinButtons, Funktionen, Module, Barcodeerzeugung und Druckersteuerung.
Wie muß ich denn vorgehen um alles über Autoit zu machen.
Das ist das 1. mal wo ich was mit Autoit mache.
Gruß Windi
Da die Excel Makros in VBA (Visual Basic for Applications) geschrieben sind, sind sie halbwegs "einfach" in AutoIt umsetzen.
Mit Userforms, SpinButtons, Barcoderzeugung habe ich bisher keine Erfahrungen ... müsste man also probieren.
Ich habe vor etlichen Jahren mal getestet, wie sich GUI und Controls in VBA erstellen und anwenden lassen. Mein Fazit war: Wenn viel in Excel abzuarbeiten ist, sollte man die Grafik auch gleich in VBA machen. Die Objekte lassen sich leicht erstellen, sind über ihre Properties gut zu händeln und bieten optische Features, die man in AutoIt nicht (oder nicht ohne Weiteres) realisieren kann - z.B. lassen sich hinter alle Control auch Grafiken legen.
Der Objektkatalog im VBA-Editor (Alt+F11) listet dir alle verfügbaren Methoden, Properties und Konstanten auf. Im Editor kann man sich super mit den Objekten vertraut machen und mal mit spielen.
Leider kann ich mein Bsp. nicht mehr auffinden, ist bei einem Forenupdate mit vielen anderen Konversationen verloren gegangen.