Office: On Error

Helfe beim Thema On Error in Microsoft Excel Hilfe um das Problem gemeinsam zu lösen; Hallo zusammen, weiß nicht, ob mein Beitrag in Excel oder in Outlook gehört, denn der Code befindet sich in einem Excel-Dokument, benutzt aber Outlook... Dieses Thema im Forum "Microsoft Excel Hilfe" wurde erstellt von offy, 12. Juli 2008.

  1. On Error


    Hallo zusammen,

    weiß nicht, ob mein Beitrag in Excel oder in Outlook gehört, denn der Code befindet sich in einem Excel-Dokument, benutzt aber Outlook Applications.

    Ich möchte gerne automatisch eine Email versenden lassen. Ihr kennt sicher die Warnmeldung, die dann in Outlook erscheint ("Eine Anwendung versucht, automatisch Nachrichten in Ihrem Auftrag zu senden. Möchten Sie dies zulassen? ..."). Wenn man diesen Dialog mit "Nein" beendet, dann gibt mir Excel einen Laufzeitfehler zurück, nämlich bei der Zeile "myMail.Send" (myMail ist mein Outlook.MailItem). Das Programm wird später eine unerfahrene Benutzerin verwenden und würde mit diesem Fehler überfordert sein.
    Ich habe deswegen vor diese Zeile eingebaut:
    On Error Goto SendError

    SendError ist weiter unten definiert, setzt die ganzen Variablen zurück und gibt eine Fehlermeldung aus, bevor er das Programm an anderer Stelle fortsetzt. Aus irgendeinem Grund nimmt er diese Sprungmarke allerdings nicht wahr und so schlägt mir Excel weiterhin vor, den Debug-Modus zu starten.

    Was kann ich tun?

    :)
     
  2. Hallo offy,

    mit Excel 2003 und Outlook 2003 habe ich folgenden Codeschnipsel getestet (Verweis auf Outlook 11 Object Library ist gesetzt):

    Code:
    Das funktioniert bei mir bestens - der Fehler wird sauber abgefangen.

    Welcher Fehler tritt bei Dir auf? Die 287? Nutzt Du Late- oder Early-Binding? Welche Version nutzt Du? Kannst Du mal Deinen kompletten Code posten (zumindest den Teil rund um das Versenden)?

    Grüße
    EarlFred
     
    EarlFred, 13. Juli 2008
    #2
  3. Hallo Earl!

    Ja, es tritt Fehler 287 auf. Die Bezeichnungen Late- oder Early-Binding kenne ich leider nicht.
    Kompletten Code kann ich nicht posten (Firmen-intern), aber ich kann dir das Grundgerüst nachbauen.
    Zum Verständnis:

    In meinem Dokument befinden sich zwei Worksheets.
    Im einen ist eine Tabelle, in Spalte A die Namen unserer Lieferanten, in Spalte B die dazugehörige Email-Adresse des Ansprechpartners. Zu jedem Lieferanten gibt es im Worksheet zwei eine Tabelle zur Liefertreue.

    Per Knopfdruck wird ein Makro ausgelöst, das eine Schleife beginnt:
    Der erste Lieferant wird erkannt, entsprechendes Worksheet kopiert, als Attachement zum MailItem angehängt und an die entsprechende Email-Adresse verschickt.
    Danach springt er eine Zeile weiter, liest den nächsten Lieferanten aus etc.

    Wenn man in Outlook die Meldung "Eine Anwendung versucht ..." mit "NEIN" abbricht, kommt wie geplant die Fehlermeldung, er überspringt den Lieferanten und beginnt beim nächsten.
    Wenn ich aber auch den abbreche, dann kommt der Laufzeitfehler.

    Das heißt: Beim ersten Mal springt er zum ErrorHandler, beim zweiten Mal nicht mehr. Muss ich vielleicht irgendetwas zurücksetzen?

    Ein kleiner Auszug aus dem Code:
    Code:
    Excel 2003
     
  4. On Error

    Hallo offy,

    nach diesem Muster sollte es klappten (anstelle For..Next natürlich auch Do...Loop machbar)

    Code:
    Grüße
    EarlFred
     
    EarlFred, 14. Juli 2008
    #4
  5. Ich sehe eigentlich nur einen einzigen Unterschied: Du hast im ErrorHandler ein "Resume next" eingebaut.
    Müsste er nicht dann ab dem "myMail.Send" weiter machen? Wenn ja, wäre das etwas blöd, weil er lieber ab dem ErrorHandler einfach weiter machen soll -deswegen habe ich Resume Next ausgelassen.
     
  6. Hallo offy,

    ein weiterer Unterschied zwischen EarlFreds und deinem Code besteht darin, dass EarlFred die Fehlerbehandlungsroutine aus der Schleife ausgelagert und an's Ende des Codes platziert hat. Dort gehört sie auch hin und das hat einen gewichtigen Grund. Wenn auf Grund einer On Error-Anweisung ein Laufzeitfehler nicht ausgelöst und statt dessen in eine Fehlerbehandlungsroutine verzweigt wird, schaltet VBA vom normalen in den Fehlerbehandlungsmodus um. In diesem Fehlerbehandlungsmodus werden weitere Laufzeitfehler nicht mehr unterdrückt, die On Error-Anweisung ist sozusagen inaktiv. Dieser Fehlerbehandlungsmodus kann nur durch eine Resume-Anweisung beendet werden. Erst dann schaltet VBA wieder in den normalen Modus zurück und die On Error-Anweisung wird wieder beachtet, so dass nachfolgende Laufzeitfehler nun wieder unterdrückt werden.

    Eine Fehlerbehandlungsroutine muss daher immer mit einer Resume-Anweisung beendet werden und ist aus diesem Grund in einer Schleifen- oder Entscheidungsstruktur oder sonst in der Mitte des Codes fehl am Platz. Mit der Resume-Anweisung kann in der Zeile, die den Laufzeitfehler ausgelöst hat mit Resume oder in der darauf folgenden Zeile mit Resume Next fortgefahren werden. Es besteht auch die Möglichkeit, mit Resume Sprungmarke an einer Sprungmarke (so wie beim Verzweigen in eine Fehlerbehandlungsroutine) weiterzumachen.

    Möchte man einen bestimmten Codeteil nicht ausführen, wenn ein bestimmter Laufzeitfehler auftritt, kann man auch so vorgehen, dass man in der Fehlerbehandlungsroutine eine boolesche Variable auf True setzt, die Fehlerbehandlungsroutine mit Resume Next abschließt und den betreffenden Codeteil dann in eine If...Then...Else-Struktur packt. In der If-Zeile wird die Variable abgefragt. Ist sie False, wird der Codeteil ausgeführt, ist sie True, wird nur die Variable zurückgesetzt.

    Also so:

    Code:
     
    IngGi, 14. Juli 2008
    #6
  7. Hallo Ingolf!

    Deine Ausführung war so schön beschrieben, dass ich mir nun vorstellen kann, woran es liegt:
    Beim ersten Mal springt er zur vereinbarten Sprungmarke. Der ErrorHandler wird allerdings nicht durch ein Resume abgeschlossen und kann deswegen nicht erneut als Sprungmarke dienen.

    In meinem Code befinden sich leider schon viel zu viele If-Schleifen, Case-Funktionen und Do...Loop-Schleifen, dass ich es vorerst lieber mal mit "Resume Sprungmarke" probiere.

    Ich muss mich leider noch kurz um etwas anderes kümmern, danach gibt es wieder Rückmeldung.
     
  8. On Error

    Ok, funktioniert jetzt wunderbar!
    Alle ErrorHandlers befinden sich nun außerhalb sämtlicher Schleifen und werden durch einen Resume-Befehl abgeschlossen. Er macht es nun so, wie ich es möchte.
    Dankeschön!

    Ein kleines Problemchen habe ich allerdings noch:
    Am Anfang der Prozedur lasse ich meine ganzen Variablen deklarieren. Für den VBA-Code benötigt man die Microsoft Outlook 11.0 Object Library. Ist diese unter den Verweisen nicht aktiviert, gibt Excel einen Laufzeitfehler aus, sobald man die Variable deklariert:
    Dim OutApp As Outlook.Application

    Ich habe vor diese Zeile ein "On Error Goto" gesetzt, der zu einer MsgBox führen soll, welche den Nutzer darüber informiert, dass er diese Library aktivieren muss.
    Aus irgendeinem Grund will VBA aber nicht springen. Ist das bei Deklarationen nicht möglich?
     
  9. Hallo offy,

    bei diesem Fehler handelt es sich nicht um einen Laufzeit- sondern um einen Kompilierungsfehler. Excel meckert bereits vor dem Ausführen des Makros (vor der "Laufzeit" des Makros), während das Makro in ausführbaren Code übersetzt ("kompiliert") wird. Solche Fehler kannst du nicht abfangen.

    Du kannst das Problem aber von vornherein umgehen. Die Outlook Objektbibliothek muss nämlich nicht unbedingt eingebunden sein. Durch die Anweisung Set OutApp = CreateObject("Outlook.Application") bzw. Set OutApp = GetObject(, "Outlook.Application") wird die Outlook Objektbibliothek nämlich zur Laufzeit des Makros eingebunden, wenn sie nicht ohnehin bereits durch einen Verweis eingebunden ist. Dabei müssen dann nur zwei Dinge beachtet werden, die bereits vor der Laufzeit zu Kompilierungsfehlern führen. Du darfst erstens keine Variablentypen aus der Outlook Objektbibliothek verwenden (wie z.B. Outlook.Application). Statt dessen deklarierst du die betreffenden Objektvariablen einfach allgemein als Objekt (Dim OutApp As Object). Und zweitens kannst du keine Konstanten, die von Outlook zur verfügung gestellt werden, verwenden. Verwende statt dessen entweder direkt die Werte, für die die Konstanten stehen oder deklariere die Konstanten in deiner Excelprozedur und weise ihnen dabei den entsprechenden Wert zu (z.B. Const olMailItem As Integer = 0), dann kannst du sie auch ohne Verweis in der Excelprozedur verwenden.

    Gruß Ingolf
     
    IngGi, 14. Juli 2008
    #9
  10. Hi Ingolf,

    super, dass es diese Möglichkeit gibt! Davon habe ich noch nie gehört, aber es erleichert die Arbeit mit dem Programm unheimlich! Dachte schon, ich muss zu dem Makro eine Anleitung schreiben, wie auf jedem PC die Object Library von Outlook eingebaut werden kann...

    Aber damit auch alles ganz sicher läuft:
    OutApp = CreateObject("Outlook.Application")
     
  11. Hallo offy,

    CreateObject("Outlook.Application") öffnet eine neue Instanz von Outlook. Wenn Outlook bereits läuft, hast du dadurch ein zweites Outlook, das im Hintergrund läuft. Mit GetObject(, "Outlook.Application") übernimmst du dagegen eine bereits laufende Outlookinstanz in die Variable und alles, was du danach in deinem Code mit Outlook anstellst, läuft in der bereits gestarteten Outlookinstanz.

    Gruß Ingolf
     
Thema:

On Error

Die Seite wird geladen...
  1. On Error - Similar Threads - Error

  2. Excel Powerquery: Nach Schließen & Laden Fehlermeldung [DataFormat.Error]

    in Microsoft Excel Hilfe
    Excel Powerquery: Nach Schließen & Laden Fehlermeldung [DataFormat.Error]: Hallo zusammen! Ich bin gerade dabei von einem Teams-Sharepoint-Ordner Daten mit Power-Query abzurufen. Ich lade die Daten über "Daten Abrufen -> Datei -> Sharepoint-Ordner" und gebe dann den...
  3. #WERT! error + Formula Issue (horizontal vs vertikal)

    in Microsoft Excel Hilfe
    #WERT! error + Formula Issue (horizontal vs vertikal): Hallo zusammen, ich bräuchte bitte Hilfe bei einer summenprodukt formel. Ich möchte im angefügten xls in zelle x2 den Wert wiedergeben der sich ergibt, wenn ich im jeweiligen Zeitslot mich...
  4. Gmail Synchronisation: IMAP Error 78754

    in Microsoft Outlook Hilfe
    Gmail Synchronisation: IMAP Error 78754: Hallo zusammen, bin total verzweifelt. Mein Gmail Mail Konto war bisher problemlos in meinem Oulook 2016 eingebunden. Urplötzlich, ohne dass ich was geändert hab, hat das Konto nicht mehr...
  5. On Error wird immer ausgeführt

    in Microsoft Access Hilfe
    On Error wird immer ausgeführt: Hi, ich bin relativ neu beim Programmierungen unter VBA und habe mir alles selbst anhand diverser Lektüre beigebracht. Ich muss eine Datenbank einrichten, die dann als Software genutzt werden...
  6. Bei meinen Teams wird statt meinen Gruppen der Error {{::buttonText}} angezeigt.

    in Microsoft Teams Hilfe
    Bei meinen Teams wird statt meinen Gruppen der Error {{::buttonText}} angezeigt.: Ich kann nicht auf Teams Gruppen zugreifen, weil dort wo sie normalerweise angezeigt werden nur folgendes steht: {{::buttonText}} Wie kann ich das beheben? 1845df93-2721-49eb-8c6f-b6ffa6ed9a4b
  7. Teams for private use error

    in Microsoft Teams Hilfe
    Teams for private use error: Hello, when i want to use the Teams app for private use, i have to verify my phone umber twice or more. It pops up a Messeage "Coudn´t switch organization! Please try again."...
  8. MS Teams (Planner App) "Error loading user settings. Please try again. If this continues ...

    in Microsoft Teams Hilfe
    MS Teams (Planner App) "Error loading user settings. Please try again. If this continues ...: Hallo Community/Support Team, Ich folgendes Problem: MS Teams (64 Bit) auf einem RDS (Server 2019) installiert Öffnet man die Registerkarte Planner in Teams erhält man die Fehlermeldung "Error...
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Auf dieser Website werden Cookies für die Zugriffsanalyse und Anzeigenmessung verwendet.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden