Excel VBA Error Handler bei Application.Run

Ich rufe eine Funktion in einer externen Datei auf:

Set wb=Workbooks.Open(„c:\extern.xls“)
On Error Resume Next
retval=Application.Run ("‚extern.xls‘!ExternalFunction")

Das funktioniert auch hervorragend.
Wenn aber während der Ausführung der Funktion ein Fehler auftritt, bekomme ich das Visual-Basic-Fenster mit entsprechender Fehlermeldung und der Auswahl „Beenden / Debuggen“.

Mein eigener ErrorHandler (On Error Resume Next) wird nicht aktiv.
Ich habe keinen Einfluss auf den Code der externen Funktion, kann also dort keinen Error-Handler einbauen.

Wie verhindere ich im Fehlerfall den Last-Chance-Handler der externen Funktion?

Hi Wolfgang,

Ich rufe eine Funktion in einer externen Datei auf:

bevor du rufst, sag doch mal hallo ihr da oder sowas, kommt immer gut an. Eine Grußformel wird auch gern gesehen.

Wenn aber während der Ausführung der Funktion ein Fehler
auftritt, bekomme ich das Visual-Basic-Fenster mit
entsprechender Fehlermeldung und der Auswahl „Beenden /
Debuggen“.
Mein eigener ErrorHandler (On Error Resume Next) wird nicht
aktiv.

Soweit ich weiß gilt der Errorhandlerhinweis nur in der jeweiligen Prozedur, aber nicht in der Prozedur die aufgerufen wird.

Ich habe keinen Einfluss auf den Code der externen Funktion,
kann also dort keinen Error-Handler einbauen.

Doch, das könntest du *denk* Du müßtest nur in den Modulen der externen Mappe nach der Prozedur, deren Namen du ja kennst suchen und dann deren Code unten mit „Exit Sub“ und anschließender Fehlerbehandlungsroutine aufstocken und anfangs des Codes ein „On Error goto Errorhandler“ einfügen.

Wie verhindere ich im Fehlerfall den Last-Chance-Handler der
externen Funktion?

Ist Last-Chance-Handler das was man als Errorhandler kennt? Ich weiß, mein grad geprägter Begriff „Errorhandlerhinweis“ ist nur verständlich wenn man sich gut eindenken kann was ich denn damit meine, mir file halt grad nix besseres ein :smile:

Melde dich bitte hier, wenn mein Ansatz den „fremden“ Code erst zu manipulieren und dann erst per Run zu starten was für dich ist, dann schau ich mal ob ich da was basteln kann.

Gruß
Reinhard

Hallo Reinhard,

bevor du rufst, sag doch mal hallo ihr da oder sowas, kommt
immer gut an. Eine Grußformel wird auch gern gesehen.

Ich wollte es möglichst knapp halten, um die kostbare Zeit der Leser nicht unnötig zu verschwenden. OK, ich sehe ein: Soviel Zeit muss sein.

Soweit ich weiß gilt der Errorhandlerhinweis nur in der
jeweiligen Prozedur, aber nicht in der Prozedur die aufgerufen
wird.

Wenn ich eine lokale Prozedur ohne Error-Handler aufrufe und dort einen Fehler produziere, kehrt die Prozedur in den übergeordneten Handler zurück:

Sub Test()
On Error GoTo ErrHnd
x = LocalFunction
x = 5
ErrHnd:
MsgBox Err.Description
End Sub
Function LocalFunction()
LocalFunction = 5 / 0
End Function

Hier ist x leer und die MsgBox gibt „Division Durch Null“ aus.

Doch, das könntest du *denk* Du müßtest nur in den Modulen der
externen Mappe nach der Prozedur, deren Namen du ja kennst
suchen und dann deren Code unten mit „Exit Sub“ und
anschließender Fehlerbehandlungsroutine aufstocken und anfangs
des Codes ein „On Error goto Errorhandler“ einfügen.

OK, die Idee ist nicht schlecht.
Das VBA-Projekt ist allerdings Passwort-geschützt und ich kenne das Passwort nicht. Ich muss mal testen, ob ich den Code trotzdem modifizieren kann.

Ist Last-Chance-Handler das was man als Errorhandler kennt?

Das ist der Error-Handler, der in VB eingebaut ist und dann zuschlägt, wenn kein anderer Error-Handler greift.

Melde dich bitte hier, wenn mein Ansatz den „fremden“ Code
erst zu manipulieren und dann erst per Run zu starten was für
dich ist, dann schau ich mal ob ich da was basteln kann.

Ich glaube, die Code-Manipulation bekomme ich hin, sofern mir die Berechtigung keinen Streich spielt.

Wolfgang

Melde dich bitte hier, wenn mein Ansatz den „fremden“ Code
erst zu manipulieren und dann erst per Run zu starten was für
dich ist, dann schau ich mal ob ich da was basteln kann.

Ich glaube, die Code-Manipulation bekomme ich hin, sofern mir
die Berechtigung keinen Streich spielt.

Die Code-Manipulation klappt gut.
Leider hilft es mir nichts, weil das VBA-Projekt Passwort-geschützt ist. Fehlermeldung:
„Die Operation kann nicht durchgeführt werden, solange das Projekt geschützt ist.“

Falls sich jemand trotzdem für den Code interessiert:

Public Function AddErrorHandler(wb As Workbook, ModuleName As String, ProcName As String) As Long
On Error GoTo End_Function
Set CodeModule = wb.VBProject.VBComponents(ModuleName).CodeModule
BodyLine = CodeModule.ProcBodyLine(ProcName, 0)
’ check if Sub or Function
BodyTags = Split(CodeModule.Lines(BodyLine, 1), " ")
For i = LBound(BodyTags) To UBound(BodyTags)
If BodyTags(i) Like ProcName & „(*“ Then
ProcType = BodyTags(i - 1)
Exit For
End If
Next
’ insert code after header row
’ Attention: assumes one single header row, real start of code should be calculated here!
CodeModule.InsertLines BodyLine + 1, „On Error Goto Added___Error___Handler“
CodeModule.InsertLines BodyLine + 2, „Added___Error___Handler:“
CodeModule.InsertLines BodyLine + 3, "If Err.Number Then Exit " & ProcType
End_Function:
AddErrorHandler = Err.Number
End Function