{"id":55000069,"date":"2012-02-01T00:00:00","date_gmt":"2020-01-24T15:57:52","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=69"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Fehlerbehandlung_unter_VBA","status":"publish","type":"post","link":"https:\/\/access-basics.de\/index.php\/Fehlerbehandlung_unter_VBA.html","title":{"rendered":"Fehlerbehandlung unter VBA"},"content":{"rendered":"<p class='introduction'>Wer mit VBA arbeitet, wird fr&uuml;her oder sp&auml;ter auf das Thema Fehlerbehandlung sto&szlig;en. Je komplexer Code wird und je mehr sein Ablauf von externen Faktoren beeinflusst wird, desto mehr sind sie auf eine Fehlerbehandlung angewiesen. Die Fehlerbehandlung sorgt daf&uuml;r, dass der Benutzer nicht mit schwer interpretierbaren oder noch besser gar nicht mit Fehlermeldungen konfrontiert wird. Im Hintergrund hilft eine Fehlerbehandlung aber noch in vielen anderen F&auml;llen, von denen der Benutzer gar nichts mitbekommt.<\/p>\n<h2>Wozu eine Fehlerbehandlung<\/h2>\n<p>Eine perfekte Anwendung arbeitet ohne Fehler. Perfekte Anwendungen sind jedoch selten, also treten auch Fehler auf. Zumindest der Benutzer einer Anwendung sollte jedoch den Eindruck erhalten, dass er mit einer perfekten Anwendung arbeitet &#8211; oder zumindest mit einer, die Fehler, wenn sie denn auftreten, entsprechend professionell verarbeitet.<\/p>\n<p>Sprich: Besser, eine Anwendung wird im schlimmsten Fell beim Auftreten eine Fehlers kontrolliert beendet, als wenn sie unkontrolliert abst&uuml;rzt &#8211; und am Ende sogar noch Daten verloren gehen.<\/p>\n<p>Wenn unter VBA ein Fehler auftritt, geht das in der Regel beispielsweise mit dem Leeren von Objektvariablen einher. Wenn Sie also gerade eine globale Objektvariable mit einem Verweis auf ein Objekt wie ein Formular gef&uuml;llt haben und dann ein Fehler auftritt, wird die Objektvariable geleert. Mit der Folge, dass ein Zugriff auf das mit dieser Variable referenzierte Objekt ebenfalls zu einem Fehler f&uuml;hrt.<\/p>\n<p>Wenn Sie in einem solchen Fall eine Fehlerbehandlung verwenden, verhindern Sie zumindest den Folgefehler. Und Sie pr&auml;sentieren dem Benutzer damit gegebenenfalls eine aussagekr&auml;ftige Fehlermeldung statt einer von Access\/VBA generierten Fehlermeldung, mit welcher der Benutzer oft nichts anfangen kann.<\/p>\n<p>Dieser Artikel zeigt, wie Sie die unter VBA auftretenden Fehler so behandeln, dass Ihre Anwendung stabil weiterl&auml;uft und der Benutzer gegebenenfalls erf&auml;hrt, was warum schief gelaufen ist.<\/p>\n<h2>Fehler ohne Fehlerbehandlung<\/h2>\n<p>Tritt ein Fehler ohne Fehlerbehandlung auf, l&ouml;st dieser eine entsprechende Meldung aus und zeigt die fehlerhafte Stelle im Code an. Dies gilt jedoch nur, wenn Sie die Vollversion von Access verwenden und die Datei im <b>.mdb<\/b>-, dem <b>.accdb<\/b>&#8211; oder einem anderen nicht gesch&uuml;tzten Format vorliegt. Wenn die Datenbank als <b>.mde<\/b>&#8211; oder <b>.accde<\/b>-Datenbank kompiliert wurde, also ihr Code nicht mehr im Entwurf eingesehen werden kann, erhalten Sie nur die Fehlermeldung mit Nummer und Text, k&ouml;nnen aber nicht mehr den fehlerhaften Code einsehen. Bei Verwendung der Runtime-Version von Access (mehr dazu in einem sp&auml;teren Artikel) erhalten Sie nur noch eine allgemeine Fehlermeldung. Deshalb ist gerade in diesem Fall eine benutzerdefinierte Fehlerbehandlung sehr wichtig!<\/p>\n<p>Die Meldung sieht beispielsweise wie in Bild 1 aus, weitere Beispiele und Grundlagen zu den verschiedenen Fehlerarten erhalten Sie im Artikel Fehler unter VBA. <\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_69_600.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_69_600.png\" alt=\"Fehlermeldung eines unbehandelten Fehlers\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 1: Fehlermeldung eines unbehandelten Fehlers<\/p>\n<h2>Fehlerbehandlung von Laufzeitfehler<\/h2>\n<p>Im Gegensatz zu Syntax- oder Kompilierfehlern k&ouml;nnen Sie auf Fehler zur Laufzeit mit entsprechenden Anweisungen reagieren. Die einfachste M&ouml;glichkeit ist es, den Fehler einfach zu ignorieren. Dazu tragen Sie die Anweisung <b>On Error Resume Next <\/b>innerhalb der Routine, aber vor der fehlerhaften Zeile ein. Ein Beispiel sieht so aus:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>DivisionDurchNullFehlerbehandlung()\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Debug.Print<\/span> 1 \/ 0\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Das Resultat dieser Vorgehensweise ist, dass der in der Zeile <b>Debug.Print 1\/0 <\/b>auftretende Fehler einfach ignoriert wird. Dummerweise tut die Zeile aber auch nichts mehr.<\/p>\n<p>Im folgenden Beispiel tritt in der Zeile <b>i = 32768 <\/b>ein &uuml;berlauf auf (Fehler <b>6<\/b>). Die fehlerhafte Zeile wird nicht ausgef&uuml;hrt, <b>i <\/b>wird also nicht mit dem angegebenen Wert gef&uuml;llt. <b>Integer<\/b>-Variablen haben den Standardwert <b>0<\/b>, also gibt das Meldungsfenster den Wert <b>0 <\/b>aus:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Ueberlauf()\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     i = 32768\r\n     <span style=\"color:blue;\">MsgBox<\/span> i\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Das ist ein Problem, denn durch den &uuml;bergangenen Fehler entsteht ein logischer Fehler: Obwohl <b>i <\/b>eigentlich den Wert <b>32768 <\/b>enthalten sollte, liefert das Meldungsfenster den Wert <b>0<\/b>. Solche logischen Fehler entstehen oft, wenn man &#8211; teilweise aus Bequemlichkeit &#8211; einen Fehler mit <b>On Error Resume Next <\/b>unterbindet.<\/p>\n<p><b>On Error Resume Next <\/b>sollten Sie also nur dort einsetzen, wo es nicht anders geht &#8211; oder dort, wo Sie vielleicht sogar einen Fehler provozieren m&ouml;chten (hierzu sp&auml;ter mehr).<\/p>\n<p>Ein Beispiel f&uuml;r den sinnvollen Einsatz ist etwa das Anlegen eines Verzeichnisses im aktuellen Datenbankverzeichnis &#8211; beispielsweise, um dort Daten etwa im Excel-Format zu exportieren. Die Anweisung <b>MkDir <\/b>legt ein mit dem einzigen Parameter angegebenes Verzeichnis an. Wenn Sie diesen Parameter wie folgt verwenden, entsteht dadurch etwa das Verzeichnis <b>Export <\/b>in dem Ordner, in dem sich auch die Datenbankdatei befindet (<b>CurrentProject.Path <\/b>liefert den Datenbankpfad):<\/p>\n<pre>MkDir CurrentProject.Path & \"\\Export\"<\/pre>\n<p>Das Dumme ist nur: Wenn Sie die Prozedur, in der sich diese Anweisung befindet, ein zweites Mal ausf&uuml;hren, ist das Verzeichnis bereits vorhanden; der erneute Versuch, dieses anzulegen, f&uuml;hrt zu einem Fehler (siehe Bild 2).<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_69_601.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_69_601.png\" alt=\"Ein bereits vorhandenes Verzeichnis l&auml;sst sich nicht nochmals anlegen.\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 2: Ein bereits vorhandenes Verzeichnis l&auml;sst sich nicht nochmals anlegen.<\/p>\n<h2>Fehlerbehandlung deaktivieren<\/h2>\n<p>Nun gibt es zwei M&ouml;glichkeiten: Entweder Sie pr&uuml;fen zuvor, ob das Verzeichnis schon vorhanden ist, oder Sie ignorieren einfach den Fehler beim erneuten Anlegen, indem Sie zuvor die Anweisung <b>On Error Resume Next <\/b>ausf&uuml;hren. Letzteres ist kein Problem, wenn Sie sehr vorsichtig damit umgehen. Das zieht in diesem Fall vor allem nach sich, dass Sie die Fehlerbehandlung unmittelbar im Anschluss an die betroffene Anweisung wieder so einstellen, dass Fehlermeldungen angezeigt werden! Dies erledigen Sie mit der Anweisung <b>On Error Goto 0<\/b>. Wenn Sie die folgende Prozedur ausf&uuml;hren, l&ouml;st das wiederholte Anlegen des Verzeichnisses keine Fehlermeldung aus, wohl aber die folgende Division durch <b>0<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>VerzeichnisAnlegen()\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     MkDir CurrentProject.Path & \"\\Export\"\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     <span style=\"color:blue;\">Debug.Print<\/span> 1 \/ 0\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Was also erledigt <b>On Error Goto 0 <\/b>genau Es deaktiviert eine eventuell zuvor aktivierte benutzerdefinierte Fehlerbehandlung, die im einfachsten Fall nur aus dem Ignorieren von Fehlern durch die Anweisung <b>On Error Resume Next <\/b>besteht.<\/p>\n<div class=\"rcp_restricted\"><p><span style=\"color: #ff0000;\">M&ouml;chten Sie weiterlesen? Dann l&ouml;sen Sie Ihr Ticket!<\/span><br \/>\n<span style=\"color: #ff0000;\">Hier geht es zur Bestellung des Jahresabonnements des Magazins <strong>Access &#091;basics&#093;<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/shop.minhorst.com\/magazine\/282\/access-basics?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000;\">Danach greifen Sie sofort auf <strong>alle rund 400 Artikel<\/strong> unseres Angebots zu - auch auf diesen hier!<\/span><br \/>\n<span style=\"color: #000000;\">Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:<\/span><\/p>\n<\/div>\n\n\t\n\t<form id=\"rcp_login_form\"  class=\"rcp_form\" method=\"POST\" action=\"https:\/\/access-basics.de\/data\/wp\/v2\/posts\/55000069\/\">\n\n\t\t\n\t\t<fieldset class=\"rcp_login_data\">\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_login\">Username or Email<\/label>\n\t\t\t\t<input name=\"rcp_user_login\" id=\"rcp_user_login\" class=\"required\" type=\"text\"\/>\n\t\t\t<\/p>\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_pass\">Password<\/label>\n\t\t\t\t<input name=\"rcp_user_pass\" id=\"rcp_user_pass\" class=\"required\" type=\"password\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t\t<p>\n\t\t\t\t<input type=\"checkbox\" name=\"rcp_user_remember\" id=\"rcp_user_remember\" value=\"1\"\/>\n\t\t\t\t<label for=\"rcp_user_remember\">Remember me<\/label>\n\t\t\t<\/p>\n\t\t\t<p class=\"rcp_lost_password\"><a href=\"\/index.php\/data\/wp\/v2\/posts\/55000069?rcp_action=lostpassword\"><\/a><\/p>\n\t\t\t<p>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_action\" value=\"login\"\/>\n\t\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/access-basics.de\/data\/wp\/v2\/posts\/55000069\/\"\/>\n\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"123b777de9\"\/>\n\t\t\t\t<input id=\"rcp_login_submit\" class=\"rcp-button\" type=\"submit\" value=\"Login\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t<\/fieldset>\n\n\t\t\n\t<\/form>\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wer mit VBA arbeitet, wird fr&uuml;her oder sp&auml;ter auf das Thema Fehlerbehandlung sto&szlig;en. Je komplexer Code wird und je mehr sein Ablauf von externen Faktoren beeinflusst wird, desto mehr sind sie auf eine Fehlerbehandlung angewiesen. Die Fehlerbehandlung sorgt daf&uuml;r, dass der Benutzer nicht mit schwer interpretierbaren oder noch besser gar nicht mit Fehlermeldungen konfrontiert wird. Im Hintergrund hilft eine Fehlerbehandlung aber noch in vielen anderen F&auml;llen, von denen der Benutzer gar nichts mitbekommt.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662011,66072011,44000004,44000011],"tags":[],"class_list":["post-55000069","post","type-post","status-publish","format-standard","hentry","category-662011","category-66072011","category-Formulare_fuer_die_Dateneingabe","category-VBAGrundlagen"],"aioseo_notices":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v15.9.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Fehlerbehandlung unter VBA - Access [basics]<\/title>\n<meta name=\"description\" content=\"Wer mit VBA arbeitet, wird fr\u00fcher oder sp\u00e4ter auf das Thema Fehlerbehandlung sto\u00dfen. Je komplexer Code wird und je mehr sein Ablauf von externen Faktoren beeinflusst wird, desto mehr sind sie auf eine Fehlerbehandlung angewiesen. Die Fehlerbehandlung sorgt daf\u00fcr, dass der Benutzer nicht mit schwer interpretierbaren oder noch besser gar nicht mit Fehlermeldungen konfrontiert wird. Im Hintergrund hilft eine Fehlerbehandlung aber noch in vielen anderen F\u00e4llen, von denen der Benutzer gar nichts mitbekommt.\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-basics.de\/index.php\/Fehlerbehandlung_unter_VBA.html\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Fehlerbehandlung unter VBA - Access [basics]\" \/>\n<meta property=\"og:description\" content=\"Wer mit VBA arbeitet, wird fr\u00fcher oder sp\u00e4ter auf das Thema Fehlerbehandlung sto\u00dfen. Je komplexer Code wird und je mehr sein Ablauf von externen Faktoren beeinflusst wird, desto mehr sind sie auf eine Fehlerbehandlung angewiesen. Die Fehlerbehandlung sorgt daf\u00fcr, dass der Benutzer nicht mit schwer interpretierbaren oder noch besser gar nicht mit Fehlermeldungen konfrontiert wird. Im Hintergrund hilft eine Fehlerbehandlung aber noch in vielen anderen F\u00e4llen, von denen der Benutzer gar nichts mitbekommt.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-basics.de\/index.php\/Fehlerbehandlung_unter_VBA.html\" \/>\n<meta property=\"og:site_name\" content=\"Access [basics]\" \/>\n<meta property=\"article:published_time\" content=\"2020-01-24T15:57:52+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"-0001-11-30T00:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/..\/tl_files\/images\/pic_69_600.png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Gesch\u00e4tzte Lesezeit\">\n\t<meta name=\"twitter:data1\" content=\"14\u00a0Minuten\">\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"https:\/\/access-basics.de\/#website\",\"url\":\"https:\/\/access-basics.de\/\",\"name\":\"Access [basics]\",\"description\":\"DAS ACCESS-MAGAZIN F\\u00dcR ALLE, DIE VON 0 AUF 100 WOLLEN\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":\"https:\/\/access-basics.de\/?s={search_term_string}\",\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"de\"},{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Fehlerbehandlung_unter_VBA.html#primaryimage\",\"inLanguage\":\"de\",\"url\":\"..\/tl_files\/images\/pic_69_600.png\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Fehlerbehandlung_unter_VBA.html#webpage\",\"url\":\"https:\/\/access-basics.de\/index.php\/Fehlerbehandlung_unter_VBA.html\",\"name\":\"Fehlerbehandlung unter VBA - Access [basics]\",\"isPartOf\":{\"@id\":\"https:\/\/access-basics.de\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/access-basics.de\/index.php\/Fehlerbehandlung_unter_VBA.html#primaryimage\"},\"datePublished\":\"2020-01-24T15:57:52+00:00\",\"dateModified\":\"-0001-11-30T00:00:00+00:00\",\"author\":{\"@id\":\"https:\/\/access-basics.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f\"},\"description\":\"Wer mit VBA arbeitet, wird fr\\u00fcher oder sp\\u00e4ter auf das Thema Fehlerbehandlung sto\\u00dfen. Je komplexer Code wird und je mehr sein Ablauf von externen Faktoren beeinflusst wird, desto mehr sind sie auf eine Fehlerbehandlung angewiesen. Die Fehlerbehandlung sorgt daf\\u00fcr, dass der Benutzer nicht mit schwer interpretierbaren oder noch besser gar nicht mit Fehlermeldungen konfrontiert wird. Im Hintergrund hilft eine Fehlerbehandlung aber noch in vielen anderen F\\u00e4llen, von denen der Benutzer gar nichts mitbekommt.\",\"breadcrumb\":{\"@id\":\"https:\/\/access-basics.de\/index.php\/Fehlerbehandlung_unter_VBA.html#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/access-basics.de\/index.php\/Fehlerbehandlung_unter_VBA.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Fehlerbehandlung_unter_VBA.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/\",\"url\":\"https:\/\/access-basics.de\/\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"position\":2,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Fehlerbehandlung_unter_VBA.html\",\"url\":\"https:\/\/access-basics.de\/index.php\/Fehlerbehandlung_unter_VBA.html\",\"name\":\"Fehlerbehandlung unter VBA\"}}]},{\"@type\":\"Person\",\"@id\":\"https:\/\/access-basics.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/access-basics.de\/#personlogo\",\"inLanguage\":\"de\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","_links":{"self":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts\/55000069","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/comments?post=55000069"}],"version-history":[{"count":0,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts\/55000069\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/media?parent=55000069"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/categories?post=55000069"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/tags?post=55000069"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}