{"id":55000075,"date":"2012-04-01T00:00:00","date_gmt":"2020-01-24T15:57:54","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=75"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Fehlerbehandlung_in_der_Praxis","status":"publish","type":"post","link":"https:\/\/access-basics.de\/index.php\/Fehlerbehandlung_in_der_Praxis.html","title":{"rendered":"Fehlerbehandlung in der Praxis"},"content":{"rendered":"<p class='introduction'>Wer die technischen Grundlagen zur Fehlerbehandlung im Artikel Fehlerbehandlung unter VBA gelesen hat, braucht nun ein paar Praxisbeispiele. Kein Problem: Der vorliegende Artikel erg&auml;nzt noch ein paar Kleinigkeiten und zeigt dann, wie Sie die Befehle zur Fehlerbehandlung sinnvoll in Ihre eigenen Anwendungen integrieren. Dabei erfahren Sie, dass eine Fehlerbehandlung nicht nur unvorhergesehene Fehler abfangen, sondern auch ganz gezielt eingesetzt werden kann.<\/p>\n<h2>Beispieldatenbank<\/h2>\n<p>Die Beispiele dieses Artikels finden Sie in der Beispieldatenbank <b>11_08_FehlerbehandlungVBAII.mdb<\/b>.<\/p>\n<h2>Fehler als Option<\/h2>\n<p>Einer der wichtigsten Anwendungsf&auml;lle neben dem gesteuerten Behandeln von Laufzeitfehlern ist das Provozieren von Fehlern. Gut, eigentlich soll kein Fehler provoziert werden, aber das Auftreten eines Fehlers bei einer bestimmten Aktion kann hier als Option behandelt werden.<\/p>\n<p>Stellen Sie sich vor, Sie h&auml;tten eine kleine Prozedur, die einen Eintrag in eine Lookup-Tabelle vornehmen soll &#8211; zum Beispiel den Namen einer Kategorie in der Tabelle <b>tblKategorien<\/b>. Das Feld <b>Kategoriename <\/b>ist dabei durch den Wert <b>Ja (Ohne Duplikate) <\/b>f&uuml;r die Eigenschaft <b>Indiziert <\/b>als eindeutiges Feld markiert (siehe Bild 1). Das wiederholte Anlegen des gleichen Wertes schon in der Datenblattansicht der Tabelle f&uuml;hrt dabei zu einer Fehlermeldung. Das Gleiche geschieht, wenn Sie einen Wert wie mit der folgenden VBA-Prozedur einf&uuml;gen:<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_75_005.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_75_005.png\" alt=\"Das Hinzuf&uuml;gen doppelter Werte in dieses Feld l&ouml;st einen Fehler aus.\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 1: Das Hinzuf&uuml;gen doppelter Werte in dieses Feld l&ouml;st einen Fehler aus.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>KategorieHinzufuegen(strKategorie                                          <span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     db.Execute \"INSERT INTO             tblKategorien(Kategoriename) VALUES('\"                 & strKategorie & \"')\", dbFailOnError\r\n     <span style=\"color:blue;\">Set<\/span> db = Nothing\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Es erscheint die Fehlermeldung aus Bild 2.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_75_006.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_75_006.png\" alt=\"Fehlermeldung beim Anlegen doppelter Werte im eindeutigen Feld\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 2: Fehlermeldung beim Anlegen doppelter Werte im eindeutigen Feld<\/p>\n<p>Wie k&ouml;nnen Sie diesen Fehler umgehen Dazu gibt es zwei Varianten. Die erste pr&uuml;ft zuvor, ob es bereits eine Kategorie mit dem angegebenen Namen gibt:<\/p>\n<pre><span style=\"color:blue;\">If <\/span>IsNull(DLookup(\"KategorieID\", \"tblKategorien\",        \"Kategoriename = '\" & strKategorie & \"'\"))<span style=\"color:blue;\"> Then<\/span>\r\n     db.Execute \"INSERT INTO             tblKategorien(Kategoriename) VALUES('\"                 & strKategorie & \"')\", dbFailOnError\r\n<span style=\"color:blue;\">Else<\/span>\r\n     <span style=\"color:blue;\">MsgBox<\/span> \"Die Kategorie '\" & strKategorie                         & \"' ist bereits vorhanden.\"\r\n<span style=\"color:blue;\">End If<\/span><\/pre>\n<p>Die zweite Variante fragt gar nicht gro&szlig; nach, sondern legt den Datensatz einfach an. Da vorher mit <b>On Error Resume Next <\/b>die eingebaute Fehlerbehandlung deaktiviert wird, l&ouml;st die <b>Execute<\/b>-Methode keinen Fehler aus, wenn der anzulegende Datensatz bereits vorhanden ist. Daf&uuml;r wird aber nachher gepr&uuml;ft, ob nicht vielleicht doch ein Fehler aufgetreten ist &#8211; beispielsweise der mit der Nummer <b>3022<\/b>. In diesem Fall zeigt die in der <b>If&#8230;Then<\/b>-Bedingung enthaltene Anweisung eine entsprechende Meldung an:<\/p>\n<pre>On Error Resume <span style=\"color:blue;\">Next<\/span>\r\ndb.Execute \"INSERT INTO             tblKategorien(Kategoriename) VALUES('\"                 & strKategorie & \"')\", dbFailOnError\r\n<span style=\"color:blue;\">If <\/span>Err.Number = 3022<span style=\"color:blue;\"> Then<\/span>\r\n     <span style=\"color:blue;\">MsgBox<\/span> \"Die Kategorie '\" & strKategorie                         & \"' ist bereits vorhanden.\"\r\n<span style=\"color:blue;\">End If<\/span><\/pre>\n<h2>Wirkungsbereich einer Fehlerbehandlung<\/h2>\n<p>Eine Fehlerbehandlung aktivieren Sie durch die <b>On Error&#8230;<\/b>-Anweisung aktiviert und sie und endet sp&auml;testens mit dem Ende der Prozedur. Sie m&uuml;ssen allerdings zwei Besonderheiten beachten:<\/p>\n<ul>\n<li>Sie k&ouml;nnen die Fehlerbehandlung auch vor dem Prozedurende mit der Anweisung <b>On Error Goto 0 <\/b>deaktivieren.<\/li>\n<li>Wenn die Prozedur eine weitere Prozedur oder Funktion aufruft, w&auml;hrend die Fehlerbehandlung aktiviert ist, gilt die Fehlerbehandlung auch hier als aktiviert. Das Gleiche gilt auch f&uuml;r weitere Verschachtelungen.<\/li>\n<\/ul>\n<p>Wenn Sie also in einer Prozedur wie folgt eine Fehlerbehandlung aktivieren, von dort eine weitere Prozedur aufrufen, in der dann schlie&szlig;lich ein Fehler auftritt, wird der Fehler von der Fehlerbehandlung der aufrufenden Prozedur behandelt. Die aufrufende Prozedur mit der Fehlerbehandlung sieht so aus:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>VerschachtelteFehlerbehandlung()\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> Fehler\r\n     <span style=\"color:blue;\">Call<\/span> WeitereProzedur\r\nEnde:\r\n     <span style=\"color:blue;\">Exit Sub<\/span>\r\nFehler:\r\n     <span style=\"color:blue;\">MsgBox<\/span> \"Fehler \" & Err.Number & \", '\"                              & Err.Description & \"'\"\r\n     GoTo Ende\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Dies ist die aufgerufene Prozedur:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>WeitereProzedur()\r\n     <span style=\"color:blue;\">Debug.Print<\/span> 1 \/ 0\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Auch wenn der Fehler erst in der Prozedur <b>Weitere-Prozedur <\/b>ausgel&ouml;st wird, wird er dennoch in der aufrufenden Prozedur verarbeitet.<\/p>\n<p>Wenn Sie jedoch in der aufgerufenen Prozedur gleich zu Beginn die Anweisung <b>On Error Goto 0<\/b> einf&uuml;gen, deaktiviert dies die Fehlerbehandlung nicht! Um dies zu testen, haben wir an verschiedenen Stellen <b>Debug.Print<\/b>-Anweisungen zur Ausgabe von Zahlen in der Reihenfolge des erwarteten Ablaufs hinzugef&uuml;gt. Bei folgendem Beispiel werden <b>1 <\/b>und <b>2 <\/b>ausgegeben, dann erscheint die Fehlermeldung der Fehlerbehandlung:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>VerschachtelteFehlerbehandlung()\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> Fehler\r\n     <span style=\"color:blue;\">Debug.Print<\/span> 1\r\n     <span style=\"color:blue;\">Call<\/span> WeitereProzedur\r\n     <span style=\"color:blue;\">Debug.Print<\/span> 4\r\n     <span style=\"color:blue;\">Debug.Print<\/span> 1 \/ 0\r\n     <span style=\"color:blue;\">Debug.Print<\/span> 5\r\nEnde:\r\n     <span style=\"color:blue;\">Exit Sub<\/span>\r\nFehler:\r\n     <span style=\"color:blue;\">MsgBox<\/span> \"Fehler \" & Err.Number & \", '\"                              & Err.Description & \"'\"\r\n     GoTo Ende\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Public Sub <\/span>WeitereProzedur()\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     <span style=\"color:blue;\">Debug.Print<\/span> 2\r\n     <span style=\"color:blue;\">Debug.Print<\/span> 1 \/ 0\r\n     <span style=\"color:blue;\">Debug.Print<\/span> 3\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\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\/55000075\/\">\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\/55000075?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\/55000075\/\"\/>\n\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"8d63f6cbe9\"\/>\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 die technischen Grundlagen zur Fehlerbehandlung im Artikel Fehlerbehandlung unter VBA gelesen hat, braucht nun ein paar Praxisbeispiele. Kein Problem: Der vorliegende Artikel erg&auml;nzt noch ein paar Kleinigkeiten und zeigt dann, wie Sie die Befehle zur Fehlerbehandlung sinnvoll in Ihre eigenen Anwendungen integrieren. Dabei erfahren Sie, dass eine Fehlerbehandlung nicht nur unvorhergesehene Fehler abfangen, sondern auch ganz gezielt eingesetzt werden kann.<\/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,66082011,44000011],"tags":[],"class_list":["post-55000075","post","type-post","status-publish","format-standard","hentry","category-662011","category-66082011","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 in der Praxis - Access [basics]<\/title>\n<meta name=\"description\" content=\"Wer die technischen Grundlagen zur Fehlerbehandlung im Artikel Fehlerbehandlung unter VBA gelesen hat, braucht nun ein paar Praxisbeispiele. Kein Problem: Der vorliegende Artikel erg\u00e4nzt noch ein paar Kleinigkeiten und zeigt dann, wie Sie die Befehle zur Fehlerbehandlung sinnvoll in Ihre eigenen Anwendungen integrieren. Dabei erfahren Sie, dass eine Fehlerbehandlung nicht nur unvorhergesehene Fehler abfangen, sondern auch ganz gezielt eingesetzt werden kann.\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-basics.de\/index.php\/Fehlerbehandlung_in_der_Praxis.html\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Fehlerbehandlung in der Praxis - Access [basics]\" \/>\n<meta property=\"og:description\" content=\"Wer die technischen Grundlagen zur Fehlerbehandlung im Artikel Fehlerbehandlung unter VBA gelesen hat, braucht nun ein paar Praxisbeispiele. Kein Problem: Der vorliegende Artikel erg\u00e4nzt noch ein paar Kleinigkeiten und zeigt dann, wie Sie die Befehle zur Fehlerbehandlung sinnvoll in Ihre eigenen Anwendungen integrieren. Dabei erfahren Sie, dass eine Fehlerbehandlung nicht nur unvorhergesehene Fehler abfangen, sondern auch ganz gezielt eingesetzt werden kann.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-basics.de\/index.php\/Fehlerbehandlung_in_der_Praxis.html\" \/>\n<meta property=\"og:site_name\" content=\"Access [basics]\" \/>\n<meta property=\"article:published_time\" content=\"2020-01-24T15:57:54+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_75_005.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=\"10\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_in_der_Praxis.html#primaryimage\",\"inLanguage\":\"de\",\"url\":\"..\/tl_files\/images\/pic_75_005.png\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Fehlerbehandlung_in_der_Praxis.html#webpage\",\"url\":\"https:\/\/access-basics.de\/index.php\/Fehlerbehandlung_in_der_Praxis.html\",\"name\":\"Fehlerbehandlung in der Praxis - Access [basics]\",\"isPartOf\":{\"@id\":\"https:\/\/access-basics.de\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/access-basics.de\/index.php\/Fehlerbehandlung_in_der_Praxis.html#primaryimage\"},\"datePublished\":\"2020-01-24T15:57:54+00:00\",\"dateModified\":\"-0001-11-30T00:00:00+00:00\",\"author\":{\"@id\":\"https:\/\/access-basics.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f\"},\"description\":\"Wer die technischen Grundlagen zur Fehlerbehandlung im Artikel Fehlerbehandlung unter VBA gelesen hat, braucht nun ein paar Praxisbeispiele. Kein Problem: Der vorliegende Artikel erg\\u00e4nzt noch ein paar Kleinigkeiten und zeigt dann, wie Sie die Befehle zur Fehlerbehandlung sinnvoll in Ihre eigenen Anwendungen integrieren. Dabei erfahren Sie, dass eine Fehlerbehandlung nicht nur unvorhergesehene Fehler abfangen, sondern auch ganz gezielt eingesetzt werden kann.\",\"breadcrumb\":{\"@id\":\"https:\/\/access-basics.de\/index.php\/Fehlerbehandlung_in_der_Praxis.html#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/access-basics.de\/index.php\/Fehlerbehandlung_in_der_Praxis.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Fehlerbehandlung_in_der_Praxis.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_in_der_Praxis.html\",\"url\":\"https:\/\/access-basics.de\/index.php\/Fehlerbehandlung_in_der_Praxis.html\",\"name\":\"Fehlerbehandlung in der Praxis\"}}]},{\"@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\/55000075","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=55000075"}],"version-history":[{"count":0,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts\/55000075\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/media?parent=55000075"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/categories?post=55000075"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/tags?post=55000075"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}