Welche Version von AutoIt verwendest Du?
Excel-Modul löschen
-
P1xelfehler -
15. Februar 2016 um 15:25 -
Erledigt
-
-
v3.3.14.1
-
Dann brauchst Du einen COM Error Handler der den Fehler abfängt.
Siehe ObjEvent in der Hilfe. -
So? Der Fehler kommt jedenfalls noch immer.
Code
Alles anzeigenGlobal $__goCOMErrorHandler = ObjEvent("AutoIt.Error", "_COMErrFunc") ;Löschen des Moduls $oWorkbook.VBProject.VBComponents.Remove($oWorkbook.VBProject.VBComponents("Modul1")) MsgBox(0,"","Das Modul wurde gelöscht.") Func Template_COMErrFunc() ; Do nothing special, just check @error after suspect functions. EndFunc ;==>Template_COMErrFunc
-
Dann poste mal was Du in SciTE für Meldungen bekommst.
-
"C:\Users\peter\Documents\AutoIT\test 5.au3" (18) : ==> The requested action with this object has failed.:
$oWorkbook.VBProject.VBComponents.Remove($oWorkbook.VBProject.VBComponents("Modul1"))
$oWorkbook.VBProject.VBComponents.Remove($oWorkbook.VBProject^ ERROR
>Exit code: 1 Time: 0.3428Also, dass er das Modul nicht findet im Grunde.
-
-
Du bist ein Gott!
Danke, funktioniert jetzt so wie ich es will!
-
Dann lassen wir das mal so
-
Nicht ganz:
Wenn ich die Datei nicht gespeichert habe, geht es, da im Titel nur z.B. "Mappe1" steht
Wenn ich allerdings eine gespeicherte Datei öffne, geht es nicht mehr, da im Titel "Mappe1.xlsx" steht. Rechts die Endung abschneiden hat seltsamerweise auch nichts gebracht. Ich prüfe morgen mal, ob es am Leerzeichen im Dateinamen liegt. Heute ist erstmal Feierabend
-
Dann versuch beides, zuerst "Mappe1" und wenn das einen Fehler gibt, dann "Mappe1.xlsx".
-
Hm... Es funktioniert weiterhin nur bei der ungespeicherten Mappe1.
Code:
C
Alles anzeigen#include <Excel.au3> #include <ExcelConstants.au3> Opt("WinTitleMatchMode", 2) Global $oExcel = _Excel_Open() Global $__goCOMErrorHandler = ObjEvent("AutoIt.Error", "_COMErrFunc") Func _COMErrFunc() ;Wenn ein Fehler auftritt... ;...nichts tun und mit Code fortfahren! $a = 1 EndFunc ;==>Template_COMErrFunc ;Ordnerpfad aus Registry auslesen Local $Pfad = RegRead("HKEY_CURRENT_USER\Software\VB and VBA Program Settings\ProjektExcel\Andere","Ordnerpfad") $a = 0 ;Titel auslesen $Title = WinGetTitle("Microsoft Excel") $Title = StringTrimLeft($Title,18) Global $oWorkbook = _Excel_BookAttach($Title) Loeschen() If $a = 1 Then $Title = StringTrimRight($Title,5) Global $oWorkbook = _Excel_BookAttach($Title) Loeschen() EndIf Importieren() Func Loeschen() $oWorkbook.VBProject.VBComponents.Remove($oWorkbook.VBProject.VBComponents("mdl_Neubau")) $oWorkbook.VBProject.VBComponents.Remove($oWorkbook.VBProject.VBComponents("mdl_Renovierung")) $oWorkbook.VBProject.VBComponents.Remove($oWorkbook.VBProject.VBComponents("mdl_Reparatur")) $oWorkbook.VBProject.VBComponents.Remove($oWorkbook.VBProject.VBComponents("mdl_Tabelle")) $oWorkbook.VBProject.VBComponents.Remove($oWorkbook.VBProject.VBComponents("mdl_Sortieren")) $oWorkbook.VBProject.VBComponents.Remove($oWorkbook.VBProject.VBComponents("FrmAnfangsdialog")) $oWorkbook.VBProject.VBComponents.Remove($oWorkbook.VBProject.VBComponents("FrmSortierenFehler")) $oWorkbook.VBProject.VBComponents.Remove($oWorkbook.VBProject.VBComponents("FrmTabellenAendern")) EndFunc Func Importieren() $oExcel.Application.VBE.ActiveVBProject.VBComponents.Import ($Pfad & "\Module\mdl_Neubau.bas") $oExcel.Application.VBE.ActiveVBProject.VBComponents.Import ($Pfad & "\Module\mdl_Renovierung.bas") $oExcel.Application.VBE.ActiveVBProject.VBComponents.Import ($Pfad & "\Module\mdl_Reparatur.bas") $oExcel.Application.VBE.ActiveVBProject.VBComponents.Import ($Pfad & "\Module\mdl_Tabelle.bas") $oExcel.Application.VBE.ActiveVBProject.VBComponents.Import ($Pfad & "\Module\mdl_Sortieren.bas") $oExcel.Application.VBE.ActiveVBProject.VBComponents.Import ($Pfad & "\Module\FrmAnfangsdialog.frm") $oExcel.Application.VBE.ActiveVBProject.VBComponents.Import ($Pfad & "\Module\FrmSortierenFehler.frm") $oExcel.Application.VBE.ActiveVBProject.VBComponents.Import ($Pfad & "\Module\FrmTabellenAendern.frm") EndFunc
Gibt es hier eigentlich "nur" water im forum?^^
-
Habs rausgefunden!!!!
Man muss es so machen, dann gehts:
Hier nochmal der komplette Code (bisschen aufgeräumter):
C
Alles anzeigen#include <Excel.au3> #include <ExcelConstants.au3> Opt("WinTitleMatchMode", 2) Global $oExcel = _Excel_Open() Global $__goCOMErrorHandler = ObjEvent("AutoIt.Error", "_COMErrFunc") HotKeySet("{ESC}","_Beenden") ;ESC-Taste zum Beenden Local $Pfad = RegRead("HKEY_CURRENT_USER\Software\VB and VBA Program Settings\ProjektExcel\Andere","Ordnerpfad") ;Ordnerpfad aus Registry auslesen $Title = WinGetTitle("Microsoft Excel") ;Titel auslesen Loeschen() Importieren() Func _Beenden () Exit EndFunc Func _COMErrFunc() ;Wenn ein Fehler auftritt... ;...nichts tun und mit Code fortfahren! EndFunc ;==>Template_COMErrFunc Func Loeschen() Global $oWorkbook = _Excel_BookAttach($Title,"Title") $oWorkbook.VBProject.VBComponents.Remove($oWorkbook.VBProject.VBComponents("mdl_Neubau")) $oWorkbook.VBProject.VBComponents.Remove($oWorkbook.VBProject.VBComponents("mdl_Renovierung")) $oWorkbook.VBProject.VBComponents.Remove($oWorkbook.VBProject.VBComponents("mdl_Reparatur")) $oWorkbook.VBProject.VBComponents.Remove($oWorkbook.VBProject.VBComponents("mdl_Tabelle")) $oWorkbook.VBProject.VBComponents.Remove($oWorkbook.VBProject.VBComponents("mdl_Sortieren")) $oWorkbook.VBProject.VBComponents.Remove($oWorkbook.VBProject.VBComponents("FrmAnfangsdialog")) $oWorkbook.VBProject.VBComponents.Remove($oWorkbook.VBProject.VBComponents("FrmSortierenFehler")) $oWorkbook.VBProject.VBComponents.Remove($oWorkbook.VBProject.VBComponents("FrmTabellenAendern")) EndFunc Func Importieren() $oExcel.Application.VBE.ActiveVBProject.VBComponents.Import ($Pfad & "\Module\mdl_Neubau.bas") $oExcel.Application.VBE.ActiveVBProject.VBComponents.Import ($Pfad & "\Module\mdl_Renovierung.bas") $oExcel.Application.VBE.ActiveVBProject.VBComponents.Import ($Pfad & "\Module\mdl_Reparatur.bas") $oExcel.Application.VBE.ActiveVBProject.VBComponents.Import ($Pfad & "\Module\mdl_Tabelle.bas") $oExcel.Application.VBE.ActiveVBProject.VBComponents.Import ($Pfad & "\Module\mdl_Sortieren.bas") $oExcel.Application.VBE.ActiveVBProject.VBComponents.Import ($Pfad & "\Module\FrmAnfangsdialog.frm") $oExcel.Application.VBE.ActiveVBProject.VBComponents.Import ($Pfad & "\Module\FrmSortierenFehler.frm") $oExcel.Application.VBE.ActiveVBProject.VBComponents.Import ($Pfad & "\Module\FrmTabellenAendern.frm") EndFunc
-
Perfekt!
-
Ich melde mich hier doch nochmal
Habe das jetzt erstmal so gemacht (so wird nur neu importiert, wenn noch nicht importiert wurde - Idealfall also):
C
Alles anzeigen#include <Excel.au3> #include <ExcelConstants.au3> Opt("WinTitleMatchMode", 2) Global $oExcel = _Excel_Open() Global $__goCOMErrorHandler = ObjEvent("AutoIt.Error", "_COMErrFunc") HotKeySet("{ESC}","_Beenden") ;ESC-Taste zum Beenden Local $Pfad = RegRead("HKEY_CURRENT_USER\Software\VB and VBA Program Settings\ProjektExcel\Andere","Ordnerpfad") ;Ordnerpfad aus Registry auslesen $Title = WinGetTitle("Microsoft Excel") ;Titel auslesen Loeschen() Func _Beenden () Exit EndFunc Func _COMErrFunc() ;Wenn ein Fehler auftritt... Importieren() ;Importiert deshalb nur, wenn noch nicht importiert wurde, also das Löschen fehlschlägt! Exit EndFunc ;==>Template_COMErrFunc Func Loeschen() Global $oWorkbook = _Excel_BookAttach($Title,"Title") $oWorkbook.VBProject.VBComponents.Remove($oWorkbook.VBProject.VBComponents("mdl_Neubau")) $oExcel.Application.VBE.ActiveVBProject.VBComponents.Import ($Pfad & "\Module\mdl_Neubau.bas") EndFunc Func Importieren() $oExcel.Application.VBE.ActiveVBProject.VBComponents.Import ($Pfad & "\Module\mdl_Neubau.bas") $oExcel.Application.VBE.ActiveVBProject.VBComponents.Import ($Pfad & "\Module\mdl_Renovierung.bas") $oExcel.Application.VBE.ActiveVBProject.VBComponents.Import ($Pfad & "\Module\mdl_Reparatur.bas") $oExcel.Application.VBE.ActiveVBProject.VBComponents.Import ($Pfad & "\Module\mdl_Tabelle.bas") $oExcel.Application.VBE.ActiveVBProject.VBComponents.Import ($Pfad & "\Module\mdl_Sortieren.bas") $oExcel.Application.VBE.ActiveVBProject.VBComponents.Import ($Pfad & "\Module\FrmAnfangsdialog.frm") $oExcel.Application.VBE.ActiveVBProject.VBComponents.Import ($Pfad & "\Module\FrmSortierenFehler.frm") $oExcel.Application.VBE.ActiveVBProject.VBComponents.Import ($Pfad & "\Module\FrmTabellenAendern.frm") EndFunc
Dass nur ein Fehler beim Löschen abgefangen wird, ist sehr gut. Jetzt möchte ich aber eine Fehlermeldung haben, wenn Excel nicht geöffnet ist, das Skript aber gestartet wurde. Wie mache ich das?
-
Schau Dir mal die Hilfe zu _Excel_Open an. @extended wird auf 0 gesetzt, wenn Excel vorher noch nicht lief und gestartet wurde.
-