VBA - Konkurrierende On-Error-Anweisungen

Moderator: ModerationP

VBA - Konkurrierende On-Error-Anweisungen

Beitragvon Proma » 28. Sep 2021, 17:53

Hallo liebe Experten,

wie muss ich verfahren, wenn ich in EINER Prozedur zunächst die Anweisung ON Error GoTo ErrHandler verwenden möchte, in einem späteren Abschnitt derselben Prozedur mit On Error Resume Next fortfahren möchte und ein paar Code-Zeilen weiter wieder mit der Anweisung ON Error GoTo ErrHandler weitermachen möchte? Google hat mir hierzu schon Antworten geliefert, ich möchte jedoch gerne wissen, ob ich das alles auch richtig verstanden habe. Zu meiner Frage habe ich nun einen Beispiel-Code gebastelt (siehe nachstehend), in dem ich jeden dieser Code-Abschnitte (mit Ausnahme des letzten Abschnittes) mit der Anweisung On Error GoTo 0 beendet und den nachfolgenden Abschnitt mit der Anweisung On Error GoTo ErrHandler bzw. der Anweisung On Error Resume Next begonnen habe.

Könnt Ihr bitte mal kurz drüber schauen, ob das so richtig ist oder ob ich wieder mal nur Bahnhof verstanden habe?

Meine Ausstattung:
Windows 10, Office 2010

Vielen Dank für Eure Unterstützung und liebe Grüße
vom Martin
Code: Alles auswählen
Public Sub pErrTest()
 
'DEKLARATION
  Dim objApp            As Object                               'Objekt-Variable für die aufzurufende Application
  Dim bolExcelLiefSchon As Boolean                              'Merkt sich, ob die Application bereits geöffnet war
 
'=====< Fehlerbehandlung EIN >=========================================================================================
'VERWEIS AUF FEHLER-ROUTINE
  On Error GoTo Err_pErrTest                                    'Bei Fehler gehe zu SM: Fehler
'======================================================================================================================
 
'EINN BISSCHEN CODE
  '...                                                          'Mache irgendetwas fehleranfälliges, was nicht
  '...                                                          'mit "On Error Resume Next" abgefangen werden kann/soll

'=====< Fehlerbehandlung AUS >=========================================================================================
  On Error GoTo 0                                               'Schalte die Fehler-Behandlung AUS
'======================================================================================================================

 
'APPLICATION ÖFFNEN
'=====< Fehlerbehandlung EIN >=========================================================================================
  On Error Resume Next                                          'Bei Fehler setze fort mit der nächsten Anweisung
'======================================================================================================================
 
  bolExcelLiefSchon = True                                      'Voreinstellung (tu' so, als würde Excel schon laufen)
  Set objApp = GetObject(, "Excel.Application")                 'Versuche, eine wietere Instanz von Excel zu laden
  If Err.Number <> 0 Then                                       'Wenn dieser Versuch fehlschlägt
    Set objApp = CreateObject("Excel.Application")              '  Starte Excel
    bolExcelLiefSchon = False                                   '  Halte fest, dass Excel vorher noch nicht gelaufen ist
  End If                                                        'Ende Wenn

'=====< Fehlerbehandlung AUS >=========================================================================================
  On Error GoTo 0
'======================================================================================================================
 
 
'NEUERLICHER VERWEIS AUF FEHLER-ROUTINE
'=====< Fehlerbehandlung EIN >=========================================================================================
  On Error GoTo Err_pErrTest                                    'Bei Fehler gehe zu SM: Fehler
'======================================================================================================================
 
 
'WEITERER CODE
'...                                                            'Mache irgendetwas fehleranfälliges, was nicht
'...                                                            'mit "On Error Resume Next" abgefangen werden kann/soll
 
 
'AUSGANG
Exit_pErrTest:                                                'SM: Ausgang
  If bolExcelLiefSchon = False Then objApp.Quit                 'Wenn Excel noch nicht lief, schließe Excel
  Set objApp = Nothing                                          'Setze die Objekt-Variable für Excel-Application zurück
  Exit Sub                                                      'Verlasse diese Prozedur


'FEHLER-ROUTINE
Err_pErrTest:                                                 'SM: Fehler
  MsgBox "Fehler-Nr.: " & Err.Number & vbLf & Err.Description   'Zeige Fehlermeldung
  Resume Exit_pErrTest                                          'Setze fort bei SM: Ausgang

End Sub
Proma
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 594
Registriert: 08. Sep 2015, 11:43

Re: VBA - Konkurrierende On-Error-Anweisungen

Beitragvon @Mase » 28. Sep 2021, 18:59

Quergedacht:

Code: Alles auswählen
Sub Prozedur()

    Dim wdAPP As Object
   
    On Error GoTo Finisherr
   
    '*** Falls Word geöffnet, referenziere die gelieferte Instanz
    Set wdAPP = GetObject(class:="Word.Application")
   
    'weiter im Programm
   

Finisherr:
Select Case Err.Number
    Case 429 '*** Wenn GetObject() keine Instanz liefert, dann CreateObject() dann mach weiter im Programm
        Set wdAPP = CreateObject(class:="Word.Application")
        Resume Next
End Select


End Sub



Folgende Seite könnte interessant für Dich sein:
https://www.online-excel.de/excel/singsel_vba.php?f=144
@Mase
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 19
Registriert: 08. Sep 2021, 06:51

Re: VBA - Konkurrierende On-Error-Anweisungen

Beitragvon Proma » 29. Sep 2021, 16:25

Hallo Mase,

herzlichen Dank für Deine Nachricht, den Beispiel-Code und die empfohlene URL!

Leider bin ich erst heute dazugekommen, das alles näher zu betrachten. Dein Code ist natürlich die weitaus elegantere Variante, einen durch GetObject() verursachten Fehler aufzufangen! Allerdings muss ich schon auch sagen, dass mein Code nur verdeutlichen sollte, wo der Schuh drückt; meine bisherigen "Werke" sind nicht ganz so schlimm, wie man vielleicht angesichts des beigefügten Code-Beispiels vermuten möchte. :P

Und die Seiten von Peter Haserodt - das bräuchte man nicht eigens zu betonen - sind doch immer wieder einen Besuch wert! Dort habe ich letztlich auch die Antwort auf meine Frage gefunden: Die Anweisungen On Error Resume Next und On Error GoTo 0 sind eher zum Testen eines Code-Abschnittes gedacht; in der Praxis sollte dann ein Verweis (oder auch mehrere Verweise) auf eine / mehrere Sprungmarke(n) genügen, um dort die möglichen Fehler aufzuarbeiten, etwa in der Form On Error Goto Code-Zeile. Bei Verwendung von mehreren On-Error-Goto-Anweisungen muss also nicht zwingend jede dieser Anweisungen durch ein On Error Goto 0 abgeschlossen werden, bevor die nächste On Error GoTo Code-Zeile folgt.

Wieder was dazugelernt! :P

Vielen Dank nochmal und liebe Grüße
vom Martin
Proma
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 594
Registriert: 08. Sep 2015, 11:43


Zurück zu Excel Forum (provisorisch)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 13 Gäste