{"id":2070,"date":"2013-11-11T23:10:21","date_gmt":"2013-11-11T21:10:21","guid":{"rendered":"http:\/\/www.ramses.de\/?p=2070"},"modified":"2013-11-11T23:10:21","modified_gmt":"2013-11-11T21:10:21","slug":"faq-access-guter-vba-code","status":"publish","type":"post","link":"https:\/\/www.ramses.de\/?p=2070","title":{"rendered":"FAQ Access &#8211; Guter VBA Code"},"content":{"rendered":"<div>\n<h1>Access VBA &#8211; Guter VBA Code<\/h1>\n<\/div>\n<div>\n<h2><strong>Problem <\/strong><\/h2>\n<p>VBA Code zu schreiben ist einfach, aber guten VBA Code zu schreiben ist schwierig. Was zeichnet nun einen &#8222;guten&#8220; VBA Code aus ? Das Programm mu\u00df laufen (Keine Bugs), das Programm mu\u00df dokumentiert sein, das Programm mu\u00df schnell sein.<\/p>\n<h2><strong>L\u00f6sung <\/strong><\/h2>\n<p>Es versteht sich von selbst, dass man \u00fcber die folgenden Regeln trefflich diskutieren kann.<\/p>\n<p>Hier nun 17 Regeln zum Erstellen &#8222;guten&#8220; VBA Codes<\/p>\n<h3>1. Verwende Option Explicit<\/h3>\n<p>Die Function Explicit legt fest, da\u00df alle Variablen vor der Benutzung dimensioniert werden m\u00fcssen. Das verhindert das &#8222;Verschreiben&#8220; bei der Benutzung der Variablen.<\/p>\n<h3>2. Deklariere die Variablen korrekt<\/h3>\n<p>Jede Variable sollte in einer einzelnen Zeile deklariert werden. Dadurch verhindern wir, da\u00df durch falsche Deklaration eine Variant Variable entsteht.<br \/>\nDim a, b, c as String<br \/>\nIn diesem Beispiel ist nur c as String, a und b jedoch als Vairant deklariert.<br \/>\nDim a as String<br \/>\nDim as String<br \/>\nDim ca String<\/p>\n<h3>\n3. Vermeide Variant Variablen<\/h3>\n<p>Variant Variablen schlucken alles, sie geben daher keine Fehlermeldung, wenn zum Beispiel ein nicht korrektes Datum in die Vairable gesetzt wird. Variant ist langsam und k\u00f6nnen unerwartete Ergebnisse bringen da keine Plausibilit\u00e4tskontrollen erfolgen.<\/p>\n<h3>4. Verwende keine Typkennzeichen<\/h3>\n<p>Viele Variablen haben so genannte Typkennzeichen, so kann eine Variable als String definiert werden, indem das $ Zeichen als String Typkennzeichen verwendet wird :<br \/>\nDim Nachname$<br \/>\nDiese Art der Deklaration ist veraltet und nur aus Gr\u00fcnden der Abw\u00e4rtskompatibilit\u00e4t noch vorhanden. Nicht alle Variablentypen haben ein solches Kennzeichen.<\/p>\n<h3>5. Achte auf die Reichweite Deiner Variablen<\/h3>\n<p>Eine als Public deklarierte Variant Variable kann von jedem Modul der Datenbank aus genutzt werden, aber ist dies auch notwendig ? Im Gegensatz dazu hat eine als privat deklarierte Funktion ihren G\u00fcltigkeitsbereich nur innerhalb der Prozedur. Variablen mit zu gro\u00dfer Reichweite erschweren das Finden von Fehlern.<\/p>\n<h3>6. Konvertiere Daten Typen explizit<\/h3>\n<p>Wenn wir die Daten aus einer Variable in eine andere packen, so wird bei unterschiedlicher Variablenart eine automatische Konvertierung vorgenommen. Das kann zu unerw\u00fcnschten Ergebnissen f\u00fchren. Wenn also aus einer Double Zahl eine Integer Zahl werden soll, so verwenden die Konvertierungsfunktion CInt() und packe die Flie\u00dfkommazahl Zahl nicht einfach in eine entsprechende Int Variable.<\/p>\n<h3>7. Deklariere den R\u00fcckgabewert einer Funktion<\/h3>\n<p>Genau wie bei den Variablen sollte auch der R\u00fcckgabewert einer Funktion deklariert werden, andernfalls gibt die Funktion einen Varianttyp zur\u00fcck. Es bestehen die gleichen Probleme wie bei der mangelden Deklaration von Variablen<\/p>\n<h3>8. Verwende eine robuste Fehlerabfangroutine<\/h3>\n<p>Jede Funktion und sei sie noch so klein, sollte eine Fehlerroutine haben. Dabei empfielt es sich, den Original Fehler zu protokollieren und den Anwender mit einer &#8222;sch\u00f6nen&#8220; Fehlermeldung zu verw\u00f6hnen.<\/p>\n<h3>9. Lege Wert auf die Kontrolle Deines Programms<\/h3>\n<p>Sprungm\u00f6glicheiten wie GoTo oder GoSub kommen aus der guten alten Zeit des BASIC. Dies hat nichts mehr mit der modularen Programmierung unter VBA zu tun.<br \/>\nW\u00e4hle das GoTo nur f\u00fcr die Fehlerroutine und schaffe nicht mehrere M\u00f6glichkeiten den Code zu verlassen (Exit Sub oder Exit Function). Unbehandelte Fehler und nicht geschlossene Objekte k\u00f6nnten sonst die Folge sein.<\/p>\n<h3>10. Nutze Variablen anstelle von Konstanten<\/h3>\n<p>Versuche es zu vermeiden, feste Konstanten in dem Code zu verwenden, sonst verstehst Du Deinen eigenen Code nach kurzer Zeit nicht mehr<br \/>\nKindergeld = vKinderzahl * 150<br \/>\nWas soll die 150 darstellen ??<br \/>\nBenutze Variablen<br \/>\nvKindergeldsatz = 150<br \/>\nKindergeld = vKinderzahl * vKindergeldsatz<br \/>\nEin weiteres Problem dieser Konstanten ist, da\u00df bei einer \u00c4nderung die Konstante mehrfach im Code auftauchen kann und es damit sehr schwer ist, sie zu \u00e4ndern. Im Fall einer Variablen ist es nur an einer Stelle zu \u00e4ndern.<\/p>\n<h3>11. Benutze Namenskonventionen<\/h3>\n<p>Bei der Benennung von Variablen solltest Du sinnvolle Namen nutzen. \u00c4hnlich wie bei den Access Objekten, kannst Du zum Beispiel alle String Variablen mit einem str am Anfang setzen um den Typ der Variablen zu definieren. Schaffe die Unterscheidungsmerkmale f\u00fcr die Verwendung von \u00dcbergabevariablen und &#8222;normalen&#8220; Variablen.<\/p>\n<h3>12. Verwende sprechende Variablennamen<\/h3>\n<p>Versuche eine Balance zu finden zwischen Variablennamen wie x und Das_Ist_Die_Stra\u00dfe_Des_Kunden. Die Namen einer Variablen sollen selbsterkl\u00e4rend sein, aber nicht die Dokumentation ersetzen.<\/p>\n<h3>13. Dokumentiere Deine Programme<\/h3>\n<p>Unabh\u00e4ngig, ob Du alleine an einem Projekt arbeitest oder im Team, Du wirst Probleme beim Verstehen des Codes einer anderen Person oder eines alten, eigenen Codes haben.<br \/>\nErkl\u00e4re in den Kommentaren die Funktion der Proceduren, die \u00dcbergabevariablen und die R\u00fcckgabe. Nimm Stellung dazu wann die letzte \u00c4nderung war und von wo aus die Procedur aus genutzt wird.<\/p>\n<h3>14. Benutze Standard Programierelemente<\/h3>\n<p>Verwende die Grundkomponenten des VBA wie If..End If, Do..Loop, For..Next, With..End With, While..Wend, Select Case .. End Select, Type..End Type, etc und verzichte auf exotische Strukturen, die m\u00f6glicherweise in der n\u00e4chsten Version nicht mehr enthalten sind.<br \/>\nNutze die Anfangs und Endstrukturen um Deinen Code \u00fcbersichtlich zu strukturieren. R\u00fccke mittels Tab Taste den dazwischen liegenden Code ein, um eine klare Zuordnung zwischen den Strukturen und den darin enthaltenen Code zu schaffen.Die Sprungweite von 4 Zeichen je Tab kannst Du in den Optionen einstellen.<\/p>\n<h3>15. Vermeide Ein-Zeilen Programme<\/h3>\n<p>Schreibe keine einzeiligen Strukturen, sie sind schwer zu verstehen und schlecht zu debuggen.<br \/>\nIf vAnzahl&gt;0 then DoCmd.OpenForm &#8222;frmOpen&#8220;<\/p>\n<p>Nutze besser<br \/>\nIf vAnzahl&gt;0 then<br \/>\nDoCmd.OpenForm &#8222;frmOpen&#8220;<br \/>\nEnd If<\/p>\n<h3>16. Benutze das Select Case korrekt<\/h3>\n<p>Die Select Case Struktur ist bestens daf\u00fcr geeignet eine Variable in den unterschiedlichsten Auspr\u00e4gungen zu \u00fcberpr\u00fcfen<br \/>\nTrenne die Entscheidung von der Folge<br \/>\nSchlecht :<br \/>\nSelect Case vLand<br \/>\nCase Is = &#8222;Deutschland&#8220; : Rechtsstatus = &#8222;Legal&#8220;<br \/>\nCase Is = &#8222;Polen&#8220; : Rechtsstatus = &#8222;Duldungl&#8220;<br \/>\nEnd If<\/p>\n<p>Gut :<br \/>\nSelect Case vLand<\/p>\n<p>Case Is = &#8222;Deutschland&#8220;<br \/>\nRechtsstatus = &#8222;Legal&#8220;<\/p>\n<p>Case Is = &#8222;Polen&#8220;<br \/>\nRechtsstatus = &#8222;Duldung&#8220;<\/p>\n<p>End If<\/p>\n<p>Und was ist mit all den anderen L\u00e4ndern ! Verwende immer eine Case Else Anweisung, um auch die seltenen F\u00e4lle abzufangen<br \/>\nCase Else<br \/>\nRechtsstatus = &#8222;Kein Status vorhanden f\u00fcr das aktuelle Land&#8220;<\/p>\n<h3>17. Verwende keine Stopmarke zum Debuggen<\/h3>\n<p>Das \u00fcble an Stopmarken ist, das mann sie leider leicht vergessen kann, wie peinlich, wenn der Anwenden sie &#8222;findet&#8220;. Verwende an Stelle dessen lieber Haltemarken, sie verschwinden sp\u00e4testens beim Schlie\u00dfen des Access und k\u00f6nnen den Anwender nicht &#8222;\u00fcberraschen&#8220;<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Access VBA &#8211; Guter VBA Code Problem VBA Code zu schreiben ist einfach, aber guten VBA Code zu schreiben ist schwierig. Was zeichnet nun einen &#8230; <a title=\"FAQ Access &#8211; Guter VBA Code\" class=\"read-more\" href=\"https:\/\/www.ramses.de\/?p=2070\" aria-label=\"Mehr Informationen \u00fcber FAQ Access &#8211; Guter VBA Code\">Weiterlesen &#8230;<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[47,43],"tags":[58,82],"class_list":["post-2070","post","type-post","status-publish","format-standard","hentry","category-access","category-faq","tag-access-2010","tag-beziehungen"],"_links":{"self":[{"href":"https:\/\/www.ramses.de\/index.php?rest_route=\/wp\/v2\/posts\/2070","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ramses.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ramses.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ramses.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ramses.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2070"}],"version-history":[{"count":1,"href":"https:\/\/www.ramses.de\/index.php?rest_route=\/wp\/v2\/posts\/2070\/revisions"}],"predecessor-version":[{"id":2071,"href":"https:\/\/www.ramses.de\/index.php?rest_route=\/wp\/v2\/posts\/2070\/revisions\/2071"}],"wp:attachment":[{"href":"https:\/\/www.ramses.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2070"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ramses.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2070"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ramses.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2070"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}