{"id":55001530,"date":"2025-02-01T00:00:00","date_gmt":"2025-01-08T11:21:21","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1530"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Early_Binding_und_Late_Binding_gleichzeitig_nutzen","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Early_Binding_und_Late_Binding_gleichzeitig_nutzen\/","title":{"rendered":"Early Binding und Late Binding gleichzeitig nutzen"},"content":{"rendered":"<p><b>Early Binding und Late Binding sind zwei Konzepte f&uuml;r das gleiche Ziel: Die Eigenschaften und Methoden von Elementen einer Bibliothek unter VBA verf&uuml;gbar zu machen. Beide unterscheiden sich in verschiedenen Punkten und haben Vor- und Nachteile. Diese ein wenig auszugleichen ist das Ziel dieses Beitrags: Wir wollen zeigen, wie man die Vorteile von Early Binding, wie z.B. den Einsatz von IntelliSense, nutzen und gleichzeitig schnell zu Late Binding &uuml;bergehen kann, um die Vorteile von Late Binding zu nutzen.  Dazu schauen wir uns zun&auml;chst noch einmal die wesentlichen Unterschiede an und kommen dann zu unserer Idee, beide Versionen parallel zu nutzen &#8211; mit einer Technik namens &#8222;bedingte Kompilierung&#8220;.<\/b><\/p>\n<h2>Early Binding vs. Late Binding<\/h2>\n<p>Beide Methoden dienen dazu, die Klassen, Eigenschaften, Methoden und gegebenenfalls auch Ereignisse einer COM-Bibliothek in einem VBA-Projekt verf&uuml;gbar zu machen. Solche COM-Bibliotheken k&ouml;nnen fertige Bibliotheken sein, aber wir k&ouml;nnen diese auch selbst erstellen &#8211; beispielsweise mit Visual Studio .NET oder twinBASIC.<\/p>\n<p>Beispiele f&uuml;r fertige Bibliotheken sind etwa die f&uuml;r den Zugriff auf die verschiedenen Office-Anwendungen. Wenn wir auf Outlook, Word oder Excel zugreifen wollen, um diese Anwendungen fernzusteuern oder auf die enthaltenen Daten zuzugreifen, ben&ouml;tigen wir die entsprechenden Klassen, die wiederum in Bibliotheken enthalten sind.<\/p>\n<p>Um auf diese Elemente zuzugreifen, referenzieren wir in der Regel eine Klasse mit einer Objektvariablen.<\/p>\n<p>Beim Early Binding f&uuml;gen wir unserem VBA-Projekt einen festen Verweis auf die Bibliothek hinzu und k&ouml;nnen dann per VBA &uuml;ber IntelliSense auf die enthaltenen Klassen, Eigenschaften, Methoden und Ereignisse zugreifen.<\/p>\n<p>Beim Late Binding f&uuml;gen wir keinen festen Verweis hinzu und k&ouml;nnen nicht &uuml;ber IntelliSense auf die Elemente zugreifen, da das VBA-Projekt die zu verwendenden Klassen nicht kennt.<\/p>\n<h2>Early Binding verwenden<\/h2>\n<p>Wenn wir Early Binding nutzen wollen, ben&ouml;tigen wir als Erstes einen Verweis auf die jeweilige Bibliothek. Um diesen hinzuzuf&uuml;gen, wechseln wir von Access aus zum VBA-Editor (zum Beispiel mit der Tastenkombination <b>Alt + F11<\/b>). Hier k&ouml;nnen wir nun beispielsweise die Objektbibliothek f&uuml;r den Zugriff auf <b>Microsoft Outlook <\/b>&uuml;ber den Eintrag <b>Microsoft Outlook 16.0 Object Library <\/b>hinzuf&uuml;gen (siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_01\/pic_1530_001.png\" alt=\"Verweis auf Outlook hinzuf&uuml;gen\" width=\"499,5589\" height=\"393,8207\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Verweis auf Outlook hinzuf&uuml;gen<\/span><\/b><\/p>\n<p>F&uuml;gen wir nun ein neues, leeres VBA-Modul hinzu, k&ouml;nnen wir wie in Bild 2 eine Variable des Typs <b>Outlook.Application <\/b>deklarieren, diese mit einer neuen Instanz von <b>Outlook.Application <\/b>f&uuml;llen und dann auf die Eigenschaften und Methoden dieser Klasse zugreifen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_01\/pic_1530_002.png\" alt=\"Outlook-Klassen referenzieren und verwenden\" width=\"424,5589\" height=\"296,0872\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Outlook-Klassen referenzieren und verwenden<\/span><\/b><\/p>\n<h2>Late Binding verwenden<\/h2>\n<p>Wenn wir Late Binding nutzen, k&ouml;nnen wir f&uuml;r die Variable <b>objOutlook <\/b>nicht explizit den Typ festlegen, sondern verwenden den Datentyp <b>Object<\/b>.<\/p>\n<p>Au&szlig;erdem k&ouml;nnen wir nicht das <b>New<\/b>-Schl&uuml;sselwort verwenden, sondern m&uuml;ssen mit <b>CreateObject <\/b>arbeiten. Die notwendigen Zeilen sehen wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>OutlookReferenzierenLateBinding()\r\n     <span style=\"color:blue;\">Dim <\/span>objOutlook<span style=\"color:blue;\"> As Object<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objOutlook = CreateObject(\"Outlook.Application\")\r\n     <span style=\"color:blue;\">Debug.Print<\/span> objOutlook.Name\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Damit k&ouml;nnen wir beinahe alles erledigen, was wir auch mit Early Binding tun k&ouml;nnen. Die Unterschiede schauen wir uns nun im Detail an.<\/p>\n<h2>Vor- und Nachteile von Early Binding<\/h2>\n<p>Beim Early Binding haben wir den Vorteil, dass wir IntelliSense nutzen k&ouml;nnen.<\/p>\n<p>Wenn wir kein IntelliSense nutzen k&ouml;nnen, m&uuml;ssen wir entweder alle relevanten Elemente, Eigenschaften und Methoden auswendig kennen oder die Dokumentation verwenden.<\/p>\n<p>Mit Early Binding bekommen wir alle Elemente zu sehen, wenn wir nach dem Variablennamen den Punkt eingeben.<\/p>\n<p>Ein weiterer Vorteil beim Early Binding ist die Performance. Dadurch, dass wir bereits definiert haben, mit welchen Objekttypen wir arbeiten, sparen wir Zeit bei der Ausf&uuml;hrung.<\/p>\n<p>Der Code ist unter Umst&auml;nden besser lesbar, weil wir in der Deklarationszeile angeben, welchen Typ die verschiedenen Objektvariablen aufweisen.<\/p>\n<p>Schlie&szlig;lich k&ouml;nnen wir f&uuml;r verschiedene Parameter mit vorgegebenen Werten aussagekr&auml;ftige Konstanten statt der tats&auml;chlichen Zahlenwerte verwenden. Ein Beispiel sehen Sie in Bild 3. Hier geben wir statt des Zahlenwertes <b>0 <\/b>f&uuml;r die zu erstellende E-Mail die Konstante <b>olMailItem <\/b>an.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_01\/pic_1530_003.png\" alt=\"Verwenden von Konstanten\" width=\"499,5589\" height=\"286,1646\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Verwenden von Konstanten<\/span><\/b><\/p>\n<h2>Vor- und Nachteile von Late Binding<\/h2>\n<p>Bei Verwendung von Late Binding gestalten sich die Vor- und Nachteile wie folgt.<\/p>\n<p>Der wichtigste Vorteil beim Late Binding ist, dass wir keinen Verweis ben&ouml;tigen. Dadurch k&ouml;nnen auch keine Fehler beim Ausf&uuml;hren des Codes durch fehlerhafte Verweise auftreten.<\/p>\n<p>Ein fehlerhafter Verweis liegt vor, wenn wir beispielsweise die Bibliothek <b>Microsoft Office 16.0 Object Library <\/b>in unserem VBA-Projekt hinzugef&uuml;gt haben, aber die Anwendung auf einem Rechner ausf&uuml;hren, auf dem sich eine andere Version dieser Bibliothek befindet.<\/p>\n<p>Oder wir nutzen einen Verweis auf eine selbst erstellte DLL, die wir bei der Entwicklung verwenden, die aber auf dem System des Kunden nicht vorhanden ist. Dann treten schnell Fehler wegen des fehlerhaften Verweises auf &#8211; interessanterweise an Stellen, die wir gar nicht damit in Verbindung bringen, zum Beispiel beim Aufruf von einfachen VBA-Funktionen wie <b>Left <\/b>oder <b>Mid<\/b>.<\/p>\n<p>Da unter Verwendung von Late Binding kein solcher Verweis vorhanden ist, erhalten wir auch nicht automatisch die beschriebenen Fehlermeldungen. Und im Gegensatz zu Early Binding k&ouml;nnen wir bei Late Binding auch recht einfach pr&uuml;fen, ob die jeweilige Bibliothek vorhanden ist, bevor es Fehlermeldungen hagelt. Dazu sp&auml;ter mehr.<\/p>\n<p>Ein Nachteil von Late Binding ist, dass wir Objektvariablen nur mit dem Typ <b>Object <\/b>und nicht mit dem spezifischen Typ deklarieren k&ouml;nnen. Somit k&ouml;nnen wir auch kein IntelliSense nutzen.<\/p>\n<p>Ein weiterer Nachteil ist, dass wir die von den Bibliotheken bereitgestellten Konstanten nicht nutzen k&ouml;nnen, sondern die dahinter stehenden Zahlenwerte verwenden m&uuml;ssen.<\/p>\n<h2>Beide Methoden parallel verwenden<\/h2>\n<p>Wie kommen wir nun an das Beste aus beiden Welten?<\/p>\n<p>Genau genommen meinen wir damit, dass wir mit IntelliSense programmieren und das Projekt aber ohne feste Verweise weitergeben.<\/p>\n<p>Hierbei m&uuml;ssen wir nat&uuml;rlich abw&auml;gen, welche Bibliotheken wir dieser Spezialbehandlung unterziehen wollen.<\/p>\n<p>Solche Bibliotheken, die mit sehr hoher Wahrscheinlichkeit auf dem Rechner des Benutzers enthalten sind, k&ouml;nnen wir durchaus per Early Binding nutzen.<\/p>\n<p>Interessanter ist der Einsatz von Late Binding in solchen F&auml;llen, in denen das Vorhandensein einer anderen Version als der bei der Entwicklung verwendeten Version wahrscheinlich ist oder in denen eine Bibliothek gar nicht verf&uuml;gbar ist.<\/p>\n<p>Hier k&ouml;nnten wir zun&auml;chst mit Early Binding entwickeln und dann vor der Weitergabe der Anwendung auf Late Binding umstellen. Dazu sind die folgenden Schritte n&ouml;tig:<\/p>\n<ul>\n<li>Ersetzen der expliziten Datentypen durch den Datentyp <b>Object<\/b><\/li>\n<li>Ersetzen des <b>New<\/b>-Schl&uuml;sselwortes durch die <b>Create-Object<\/b>-Methode<\/li>\n<li>Ersetzen der Konstanten durch die dahinter stehenden Zahlenwerte oder explizite Deklaration der Konstanten<\/li>\n<\/ul>\n<p>Beim obigen Beispiel k&ouml;nnten wir unter Early Binding diesen Code verwenden:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>OutlookReferenzierenEarlyBinding()\r\n     <span style=\"color:blue;\">Dim <\/span>objOutlook<span style=\"color:blue;\"> As <\/span>Outlook.Application\r\n     <span style=\"color:blue;\">Dim <\/span>objMailItem<span style=\"color:blue;\"> As <\/span>Outlook.MailItem\r\n     <span style=\"color:blue;\">Set<\/span> objOutlook = <span style=\"color:blue;\">New<\/span> Outlook.Application\r\n     <span style=\"color:blue;\">Set<\/span> objMailItem = objOutlook.CreateItem(olMailItem)\r\n     ...\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Um zu testen, wo Anpassungen notwendig sind, damit dieser Code ohne den Verweis auf die Outlook-Bibliothek l&auml;uft, brauchen wir einfach nur den Verweis zu entfernen und den Code zu starten.<\/p>\n<p>Wir werden schon beim Debuggen auf den ersten Fehler sto&szlig;en (siehe Bild 4).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_01\/pic_1530_004.png\" alt=\"Fehler beim Kompilieren\" width=\"499,5589\" height=\"345,5595\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Fehler beim Kompilieren<\/span><\/b><\/p>\n<p>Also ersetzen wir zun&auml;chst die Deklarationen durch solche mit dem Datentyp <b>Object<\/b> &#8211; all dies in einer neuen Prozedur namens <b>OutlookReferenzierenLateBinding<\/b>:<\/p>\n<pre>     <span style=\"color:blue;\">Dim <\/span>objOutlook<span style=\"color:blue;\"> As Object<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>objMailItem<span style=\"color:blue;\"> As Object<\/span><\/pre>\n<p>Den gleichen Fehler erhalten wir f&uuml;r die Zuweisung von <b>Outlook.Application <\/b>zur Variablen <b>objOutlook<\/b>. Hier ersetzen wir das <b>New<\/b>-Schl&uuml;sselwort durch <b>CreateObject<\/b>. Dabei k&ouml;nnen wir als Parameter den Namen der zu erstellenden Klasse in Anf&uuml;hrungszeichen angeben:<\/p>\n<pre>     <span style=\"color:blue;\">Set<\/span> objOutlook = _\r\n         CreateObject(\"Outlook.Application\")<\/pre>\n<p>Beim n&auml;chsten Versuch des Kompilierens erhalten wir noch einen Fehler f&uuml;r eine nicht definierte Variable (siehe Bild 5). Genau genommen handelt es sich um die Konstante <b>olMailItem<\/b>, die &uuml;blicherweise in der Bibliothek <b>Microsoft Outlook 16.0 Object Library <\/b>definiert ist.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_01\/pic_1530_005.png\" alt=\"Nicht deklarierte Variable\" width=\"499,5589\" height=\"320,3693\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Nicht deklarierte Variable<\/span><\/b><\/p>\n<p>Diese finden wir im Objektkatalog, wenn die Bibliothek per Verweis referenziert wird (siehe Bild 6).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_01\/pic_1530_006.png\" alt=\"Die Konstanten werden in der Objektbibliothek definiert.\" width=\"499,5589\" height=\"357,4015\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Die Konstanten werden in der Objektbibliothek definiert.<\/span><\/b><\/p>\n<h2>Konstanten definieren oder durch Zahlenwerte ersetzen<\/h2>\n<p>Hier haben wir zwei M&ouml;glichkeiten:<\/p>\n<ul>\n<li>Wir geben statt der Konstanten, wie hier <b>olMailItem<\/b>, einfach den entsprechenden Zahlenwert an, in diesem Fall <b>0<\/b>. Den Zahlenwert k&ouml;nnen wir auf zwei Arten ermitteln: Entweder durch Ablesen im Objektkatalog oder durch die Ausgabe des Wertes der Konstanten im Direktbereich mit <b>Debug.Print olMailItem <\/b>(siehe Bild 7). Hier m&uuml;ssen wir darauf achten, dass die Bibliothek zu diesem Zeitpunkt referenziert wird. Anderenfalls w&uuml;rde diese Anweisung eine leere Zeichenkette ausgeben.<\/li>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_01\/pic_1530_007.png\" alt=\"Ausgabe des Zahlenwertes einer Konstanten\" width=\"424,5589\" height=\"122,3666\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Ausgabe des Zahlenwertes einer Konstanten<\/span><\/b><\/p>\n<li>Wir definieren die Konstante explizit. Das k&ouml;nnen wir im gleichen Modul erledigen, in dem wir die Prozeduren unterbringen, die auf diese Konstante zugreifen oder auch in einem eigenen Klassenmodul nur f&uuml;r Konstantendeklarationen. Die entsprechende Zeile finden wir in Bild 8.<\/li>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_01\/pic_1530_008.png\" alt=\"Definition einer Konstanten\" width=\"499,5589\" height=\"261,5338\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Definition einer Konstanten<\/span><\/b><\/p>\n<\/ul>\n<p>Damit k&ouml;nnen wir die Prozedur nun ohne Fehler kompilieren und auch ausf&uuml;hren.<\/p>\n<p>Auf die gleiche Weise wie mit der Konstanten <b>olMailItem <\/b>w&uuml;rden wir auch mit weiteren Konstanten umgehen.<\/p>\n<h2>Beides in einem Modul<\/h2>\n<p>Nehmen wir nun an, Sie m&ouml;chten einerseits mit Early Binding arbeiten, um IntelliSense nutzen zu k&ouml;nnen, und andererseits auch schnell eine Version der Anwendung ver&ouml;ffentlichen k&ouml;nnen, die Late Binding nutzt und keinen Verweis mehr auf die fragliche Bibliothek verwendet.<\/p>\n<p>Dann k&ouml;nnen wir die sogenannte &#8222;bedingte Kompilierung&#8220; nutzen und einfach beide Varianten parallel bedienen.<\/p>\n<p>Bedingte Kompilierung bedeutet, dass wir spezielle <b>If&#8230;Then&#8230;Else<\/b>-Bedingungen verwenden, die wir mit einem f&uuml;hrenden Raute-Zeichen versehen. F&uuml;r die Bedingung verwenden wir eine Konstante namens <b>EarlyBinding<\/b>, die wir entweder auf den Wert <b>True <\/b>oder <b>False <\/b>einstellen. Wichtig f&uuml;r den Einsatz der Konstanten bei der bedingten Kompilierung ist, dass der Anweisung das Raute-Zeichen vorangestellt wird (<b>#<\/b>):<\/p>\n<pre>#Const EarlyBinding = <span style=\"color:blue;\">False<\/span><\/pre>\n<p>Danach folgt eine <b>If&#8230;Then&#8230;Else<\/b>-Bedingung, bei der alle drei Elemente wiederum ein f&uuml;hrendes Raute-Zeichen aufweisen:<\/p>\n<pre>#If EarlyBinding = <span style=\"color:blue;\">True<\/span> Then\r\n     ...\r\n#Else\r\n     ...\r\n#End If<\/pre>\n<p>Wie funktioniert das nun? Wir legen mit der Konstanten <b>EarlyBinding <\/b>fest, ob wir mit Early Binding arbeiten, also mit einem Verweis auf die betroffene Bibliothek (<b>#Const EarlyBinding = True<\/b>), oder mit Late Binding (<b>#Const EarlyBinding = False<\/b>).<\/p>\n<p>In der <b>If&#8230;Then&#8230;Else<\/b>-Bedingung pr&uuml;fen wir diesen Wert. Und nun kommt der Clou: Die Anweisungen, die sich in dem Zweig der Bedingung befinden, die nicht erf&uuml;llt ist, werden nicht nur nicht ausgef&uuml;hrt &#8211; sie werden noch nicht einmal kompiliert (siehe Bild 9).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_01\/pic_1530_009.png\" alt=\"Definition einer der Bedingung der bedingten Kompilierung\" width=\"549,559\" height=\"371,9336\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Definition einer der Bedingung der bedingten Kompilierung<\/span><\/b><\/p>\n<p>Dadurch werden beispielsweise bei <b>#Const EarlyBinding = False <\/b>die Anweisungen, die sich auf die Klasse <b>Outlook.Application <\/b>beziehen, nicht kompiliert und infolgedessen kann hier auch kein Kompilierfehler entstehen. Wir k&ouml;nnen also nun beide Versionen gleichzeitig weiterentwickeln. Dabei werden wir vermutlich zun&auml;chst die Version bearbeiten, bei der wir IntelliSense nutzen k&ouml;nnen und die &Auml;nderungen dann auf die Version f&uuml;r Late Binding &uuml;bertragen.<\/p>\n<p>Wenn wir uns den Code genau ansehen, sind es aber ohnehin nur wenige Anweisungen, die Unterschiede bez&uuml;glich Early Binding und Late Binding aufweisen &#8211; n&auml;mlich die Deklarationen und das Erstellen der jeweiligen Objekte.<\/p>\n<p>Dazu m&uuml;ssen wir allerdings zwei Dinge erledigen:<\/p>\n<ul>\n<li>Wir m&uuml;ssen den Verweis jeweils wieder hinzuf&uuml;gen.<\/li>\n<li>Und wir m&uuml;ssen <b>#Const EarlyBinding = True <\/b>setzen.<\/li>\n<\/ul>\n<p>Wenn wir nur den Verweis hinzuf&uuml;gen, aber durch Setzen von <b>#Const EarlyBinding = False <\/b>die Anweisungen von der Kompilierung ausnehmen, in denen die Variablen wie <b>objOutlook <\/b>mit den expliziten Klassen deklariert werden, k&ouml;nnen wir auch kein IntelliSense nutzen &#8211; VBA geht dann davon aus, dass die Variablen als <b>Object <\/b>deklariert sind.<\/p>\n<h2>G&uuml;ltigkeit der Konstanten f&uuml;r die bedingte Kompilierung<\/h2>\n<p>Die hier verwendete Konstante <b>EarlyBinding <\/b>ist nur in dem Modul g&uuml;ltig, in dem sie deklariert wurde. Wenn wir also mit der gleichen Konstanten die bedingte Kompilierung in mehr als einem Modul steuern wollen, m&uuml;ssen wir dazu in jedem betroffenen Modul jeweils eine eigene Konstante definieren. Das l&auml;sst die Vorgehensweise etwas aufwendiger aussehen als geplant. Es w&auml;re praktischer, wenn wir nur an einer einzigen Stelle festlegen k&ouml;nnten, ob wir Early Binding oder Late Binding nutzen wollen. Dies an mehreren Stellen anpassen zu m&uuml;ssen scheint uns doch fehleranf&auml;llig zu sein.<\/p>\n<h2>Globale bedingte Konstante definieren<\/h2>\n<p>Doch es gibt auch hier einen Workaround. Dazu &ouml;ffnen wir mit dem Men&uuml;befehl <b>Extras|Eigenschaften von [Datenbankname]&#8230;<\/b> den Dialog <b>[Datenbankname] &#8211; Projekteigenschaften<\/b>. Hier finden wir unten die Eigenschaft <b>Argumente f&uuml;r bedingte Kompilierung<\/b>. F&uuml;r diese k&ouml;nnen wir die Bedingung eintragen, die f&uuml;r die bedingte Kompilierung dienen soll (siehe Bild 10).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_01\/pic_1530_010.png\" alt=\"Argumente f&uuml;r die bedingte Kompilierung\" width=\"499,5589\" height=\"457,3257\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Argumente f&uuml;r die bedingte Kompilierung<\/span><\/b><\/p>\n<p>Hier k&ouml;nnen wir allerdings nicht den gleichlautenden Ausdruck eintragen, sondern m&uuml;ssen auf den Einsatz der Konstanten <b>True <\/b>oder <b>False <\/b>verzichten. Stattdessen nutzen wir die unter VBA gleichbedeutenden Zahlenwerte <b>-1 <\/b>und <b>0<\/b>. Haben wir nun Bedingungen mit bedingter Kompilierung in mehr als einem Modul in unserem VBA-Projekt, dann wird das Argument wie folgt benutzt:<\/p>\n<ul>\n<li>Wenn das Modul selbst einen Ausdruck wie <b>#Const EarlyBinding = True <\/b>enth&auml;lt, dann gilt diese Bedingung.<\/li>\n<li>Enth&auml;lt das Modul keinen solchen Ausdruck, wird der Wert aus den Eigenschaften verwendet.<\/li>\n<\/ul>\n<p>Wir sollten also, damit die bedingte Kompilierung &uuml;berall einheitlich funktioniert, alle entsprechenden Konstanten aus dem Code entfernen. Nun gilt also der Wert, den wir in den Datenbankeigenschaften eingetragen haben.<\/p>\n<h2>Dynamische Anpassung der bedingten Kompilierung<\/h2>\n<p>Bisher reden wir davon, die Bedingung f&uuml;r die bedingte Kompilierung auf unserem Rechner einzustellen, bevor wir die Anwendung an den Nutzer weitergeben. In der Regel werden wir also bei uns die Bedingung so einstellen, dass wir mit Early Binding programmieren k&ouml;nnen und wenn wir die Anwendung an den Benutzer &uuml;bergeben, legen wir <b>EarlyBinding = 0 <\/b>fest (<b>0 <\/b>f&uuml;r <b>False<\/b>).<\/p>\n<p>So erhalten wir, wenn die entsprechende Bibliothek auf dem Rechner des Nutzers nicht referenziert werden kann, nicht schon beim Start der Anwendung Fehler durch den fehlerhaften Verweis und es kann zumindest der Teil der Anwendung durchgef&uuml;hrt werden, der nicht auf die nicht vorhandene Objektbibliothek zugreift. In manchen F&auml;llen reicht dies sogar schon aus, um ein Fehlverhalten zu verhindern. Wenn wir die hier verwendete Anwendung, die mit einem Verweis auf die Bibliothek <b>Microsoft Outlook 16.0 Object Library <\/b>versehen ist, auf einem Rechner &ouml;ffnen, auf dem eine &auml;ltere Version dieser Bibliothek vorliegt, f&uuml;hrt dies zu einem fehlerhaften Verweis.<\/p>\n<p>Wir k&ouml;nnten beim Starten der Anwendung pr&uuml;fen, ob dieser Verweis fehlerhaft ist, und nur in diesem Fall &uuml;ber die bedingte Kompilierung die Late Binding-Version ausf&uuml;hren. Den Verweis w&uuml;rden wir im gleichen Zuge entfernen, damit keine Folgefehler entstehen.<\/p>\n<h2>Folgen eines fehlerhaften Verweises<\/h2>\n<p>Wenn wir die Beispieldatenbank mit dem Verweis auf die Bibliothek <b>Microsoft Outlook 16.0 Object Library<\/b> auf einem Rechner &ouml;ffnen, der beispielsweise Office 2010 enth&auml;lt, und direkt beim Starten VBA-Code ausf&uuml;hren, erhalten wir als Erstes die Meldung aus Bild 11.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_01\/pic_1530_011.png\" alt=\"Fehler bei Verwendung einer neueren Bibliothek auf einem System mit einer &auml;lteren Version der Bibliothek\" width=\"700\" height=\"135,0588\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 11: Fehler bei Verwendung einer neueren Bibliothek auf einem System mit einer &auml;lteren Version der Bibliothek<\/span><\/b><\/p>\n<p>Schauen wir dann in den <b>Verweise<\/b>-Dialog, sehen wir einen Teil der Ursache f&uuml;r diesen Fehler (siehe Bild 12).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_01\/pic_1530_012.png\" alt=\"Nicht vorhandener Verweis auf die Outlook-Bibliothek\" width=\"499,5589\" height=\"388,4259\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 12: Nicht vorhandener Verweis auf die Outlook-Bibliothek<\/span><\/b><\/p>\n<p>Wir m&uuml;ssten nun eigentlich diesen Verweis entfernen und diesen durch den Verweis ersetzen, der auf diesem Rechner vorhanden ist. Leider gelingt das nur &uuml;ber die Benutzeroberfl&auml;che.<\/p>\n<p>Das hei&szlig;t, wir m&uuml;ssten den VBA-Editor &ouml;ffnen und von dort aus den <b>Verweise<\/b>-Dialog und dort den Verweis auf <b>Microsoft Outlook 16.0 Object Library <\/b>entfernen und durch <b>Microsoft Outlook 14.0 Object Library <\/b>ersetzen. Das wollen wir aber dem Benutzer nicht zumuten, sondern wollen dies eigentlich gern per VBA erledigen.<\/p>\n<p>Es gibt sogar entsprechenden VBA-Code, der wie in Bild 13 aussieht. Allerdings f&uuml;hrt der Aufruf zum Fehler <b>Objektbibliothek nicht registriert<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_01\/pic_1530_013.png\" alt=\"Fehler beim Entfernen eines fehlerhaften Verweises per VBA\" width=\"599,559\" height=\"384,309\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 13: Fehler beim Entfernen eines fehlerhaften Verweises per VBA<\/span><\/b><\/p>\n<p>Nach unserer Erinnerung funktionierte das fr&uuml;her mal, aber derzeit kennen wir keine M&ouml;glichkeit, um einen fehlerhaften Verweis per VBA aus der aktuellen Datenbank zu entfernen.<\/p>\n<p>Was aber l&ouml;st eigentlich den oben angezeigten Fehler aus? Und warum taucht dieser in manchen Datenbanken direkt beim &Ouml;ffnen der Anwendung auf und in manchen nicht? Wenn der Fehler auftritt, wird meist in einer direkt beim Start aufgerufenen VBA-Prozedur eine der Standard-VBA-Funktionen wie <b>Left<\/b>, <b>Right<\/b>, <b>Trim <\/b>et cetera aufgerufen.<\/p>\n<p>Das k&ouml;nnen wir reproduzieren, indem wir beispielsweise die Beispieldatei zu diesem Beitrag in einer Umgebung aufrufen, in welcher die Bibliothek <b>Microsoft Outlook 16.0 Object Library <\/b>nicht oder in einer &auml;lteren Version vorhanden ist.<\/p>\n<p>Dann gibt es den oben beschriebenen, als <b>NICHT VORHANDEN <\/b>markierten Eintrag im <b>Verweise<\/b>-Dialog.<\/p>\n<p>VBA sucht, wenn ein Befehl aufgerufen wird, die Bibliothek, in der sich dieser befindet. Dabei durchl&auml;uft es die Bibliotheken in der Reihenfolge, in der diese im Verweise-Dialog aufgef&uuml;hrt werden. Deshalb ist es auch wichtig, wenn man sowohl die DAO- als auch die ADODB-Bibliothek verwendet, immer die jeweiligen Klassennamen voranzustellen (zum Beispiel <b>DAO.Recordset<\/b>).<\/p>\n<p>Anderenfalls h&auml;tte VBA bei Klassen, die in beiden Bibliotheken vorkommen, diejenige verwendet, die in der weiter oben aufgef&uuml;hrten Bibliothek enthalten ist.<\/p>\n<p>Dies f&uuml;hrte gerade w&auml;hrend der Einf&uuml;hrung von ADODB mit Access 2000 oft zu Problemen &#8211; und dann wieder, als Microsoft DAO wieder als prim&auml;re Datenzugriffstechnik deklarierte.<\/p>\n<p>Wenn ein Verweis fehlerhaft ist, ger&auml;t dies jedoch durcheinander. VBA sucht dann beispielsweise erst einmal in dem kaputten Verweis nach dem Aufruf eines Befehls wie <b>Left <\/b>und findet diesen dort nicht. Deshalb entstehen die Fehlermeldungen wie in Bild 14.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_01\/pic_1530_014.png\" alt=\"Fehler durch einen fehlerhaften Verweis\" width=\"499,5589\" height=\"303,451\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 14: Fehler durch einen fehlerhaften Verweis<\/span><\/b><\/p>\n<p>Diesem Problem k&ouml;nnen wir &uuml;brigens vorbeugen, indem wir die VBA-Befehle mit dem Klassennamen versehen, also beispielsweise <b>VBA.Left<\/b>.<\/p>\n<h2>Wie mit dem &auml;lteren oder fehlerhaften Verweis umgehen?<\/h2>\n<p>Ohne die Fehler, die durch Aufrufe von VBA-Funktionen ohne Angabe von VBA entstehen, haben wir nun aber immer noch einen fehlenden Verweis, der daf&uuml;r sorgt, dass wir nicht per Early Binding auf die Elemente der entsprechenden Bibliothek zugreifen k&ouml;nnen &#8211; hier also der Bibliothek <b>Microsoft Outlook 16.0 Object Library<\/b>.<\/p>\n<p>Wenn wir also wie oben beschrieben den Wert der Eigenschaft <b>Argumente f&uuml;r bedingte Kompilierung <\/b>auf <b>EarlyBinding = -1 <\/b>eingestellt haben und kompilieren oder den Code ausf&uuml;hren wollen, erhalten wir einen Fehler, wenn wir auf Elemente wie <b>Outlook.Application <\/b>zugreifen wollen.<\/p>\n<p>Deshalb m&uuml;ssten wir beim Start der Anwendung irgendwie pr&uuml;fen, ob der Zugriff funktioniert, also ob der Verweis vorhanden und fehlerfrei ist, und abh&auml;ngig davon die bedingte Kompilierung entweder auf die Early Binding-Version oder die Late Binding-Version einstellen.<\/p>\n<p>Erfreulicherweise k&ouml;nnen wir den Inhalt der Eigenschaft <b>Argumente f&uuml;r bedingte Kompilierung <\/b>sowohl per VBA auslesen als auch schreiben.<\/p>\n<p>Dies gelingt &uuml;ber die beiden Methoden <b>GetOption <\/b>und <b>SetOption <\/b>des <b>Application<\/b>-Objekts. In Bild 15 zeigen wir, wie wir den aktuellen Wert &uuml;ber das Direktfenster auslesen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_01\/pic_1530_016.png\" alt=\"Ausgabe des aktuellen Wertes der Eigenschaft Argumente f&uuml;r bedingte Kompilierung\" width=\"599,559\" height=\"171,6799\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 15: Ausgabe des aktuellen Wertes der Eigenschaft Argumente f&uuml;r bedingte Kompilierung<\/span><\/b><\/p>\n<p>Das Einstellen erledigen wir mit der Methode <b>SetOption<\/b>. Um die Option auf <b>EarlyBinding = 0 <\/b>einzustellen, verwenden wir die folgende Anweisung:<\/p>\n<pre>Application.SetOption \"Conditional Compilation Arguments\", _\r\n     \"EarlyBinding = 0\"<\/pre>\n<p>Hier geben wir als ersten Parameter den Namen der einzustellenden Option ein und als zweiten den gew&uuml;nschten Wert, hier <b>EarlyBinding = 0<\/b>.<\/p>\n<h2>Bedingung f&uuml;r bedingte Kompilierung beim Start setzen<\/h2>\n<p>Wenn wir verhindern wollen, dass der Early Binding-Code genutzt wird, m&uuml;ssen wir gleich bei Start der Anwendung pr&uuml;fen, ob die Bibliothek <b>Microsoft Outlook 16.0 Object Library <\/b>vorhanden ist und verwendet werden kann.<\/p>\n<p>Dazu brauchen wir erstens beispielsweise ein <b>AutoExec<\/b>-Makro, also ein Makro, das gleich beim Start ausgef&uuml;hrt wird (siehe Bild 16), sowie eine Prozedur, die dadurch aufgerufen wird und pr&uuml;ft, ob der Verweis funktioniert, und davon abh&auml;ngig die Einstellung des Arguments f&uuml;r die bedingte Kompilierung vornimmt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_01\/pic_1530_015.png\" alt=\"Das AutoExe-Makro zum Starten der Funktion BedingteKompilierungSetzen\" width=\"599,559\" height=\"175,6949\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 16: Das AutoExe-Makro zum Starten der Funktion BedingteKompilierungSetzen<\/span><\/b><\/p>\n<p>Die Prozedur sieht wie in Listing 1 aus. Sie versucht, bei deaktivierter Fehlerbehandlung auf die Referenz namens Outlook zuzugreifen. Wenn dies gelingt, ist die Objektvariable <b>ref <\/b>anschlie&szlig;end mit dem entsprechenden Verweis gef&uuml;llt. Anderenfalls ist <b>ref <\/b>leer.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>BedingteKompilierungSetzen()\r\n     <span style=\"color:blue;\">Dim <\/span>ref<span style=\"color:blue;\"> As <\/span>Reference\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> ref = References(\"Outlook\")\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     <span style=\"color:blue;\">If <\/span>ref Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n         Application.SetOption \"Conditional Compilation Arguments\", \"EarlyBinding = 0\"\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         Application.SetOption \"Conditional Compilation Arguments\", \"EarlyBinding = -1\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Einstellen des Arguments f&uuml;r die bedingte Kompilierung<\/span><\/b><\/p>\n<p>Im letzteren Fall stellen wir die Option <b>Conditional Compilation Arguments <\/b>auf <b>EarlyBinding = 0 <\/b>ein, anderenfalls auf <b>EarlyBinding = -1<\/b>.<\/p>\n<p>Damit erreichen wir, dass beim Start der Anwendung die richtige Einstellung f&uuml;r die bedingte Kompilierung vorgenommen wird. Durch die Implementierung der Bedingung f&uuml;r die bedingte Kompilierung, wie wir sie oben beschrieben haben, greifen wir nur dann per Early Binding auf die Outlook-Elemente zu, wenn der Verweis funktioniert.<\/p>\n<p>Anderenfalls nutzen wir Late Binding.<\/p>\n<h2>Andere Anwendungsf&auml;lle<\/h2>\n<p>Es kann auch sein, dass wir uns hier nicht auf eine Bibliothek wie eine der Office-Bibliotheken konzentrieren, die gegebenenfalls in der falschen Version vorliegt und deshalb per Late Binding genutzt werden soll.<\/p>\n<p>Vielleicht pr&uuml;fen wir auch, ob eine Bibliothek &uuml;berhaupt vorhanden ist. Ist das der Fall, wollen wir mit der bedingten Kompilierung daf&uuml;r sorgen, dass die entsprechenden Elemente wie geplant aufgerufen werden.<\/p>\n<p>Wenn die Bibliothek gar nicht vorhanden ist, wollen wir hingegen beispielsweise eine Meldung ausgeben, dass die gew&uuml;nschte Funktion nicht verf&uuml;gbar ist.<\/p>\n<p>Dies kann beispielsweise sinnvoll sein, wenn wir eine Bibliothek nutzen, die mit der Anwendung installiert werden soll beziehungsweise vom Benutzer vor dem ersten Start der Anwendung zu installieren ist.<\/p>\n<p>In diesem Fall m&uuml;ssen wir noch pr&uuml;fen, ob &uuml;berhaupt Elemente der Klasse referenziert werden k&ouml;nnen. Diesen Zusatz haben wir in Listing 2 hinzugef&uuml;gt.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>BedingteKompilierungSetzen2()\r\n     <span style=\"color:blue;\">Dim <\/span>ref<span style=\"color:blue;\"> As <\/span>Reference\r\n     <span style=\"color:blue;\">Dim <\/span>objOutlook<span style=\"color:blue;\"> As Object<\/span>\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> ref = References(\"Outlook\")\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     <span style=\"color:blue;\">If <\/span>ref Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n         On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> objOutlook = CreateObject(\"Outlook.Application\")\r\n         <span style=\"color:blue;\">If <\/span>Err.Number = 0<span style=\"color:blue;\"> Then<\/span>\r\n             Application.SetOption \"Conditional Compilation Arguments\", \"EarlyBinding = 0\"\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             Application.SetOption \"Conditional Compilation Arguments\", \"EarlyBinding = 1\"\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         Application.SetOption \"Conditional Compilation Arguments\", \"EarlyBinding = -1\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Einstellen der Bedingung f&uuml;r die bedingte Kompilierung mit Pr&uuml;fung, ob die zu referenzierende Anwendung vorhanden ist<\/span><\/b><\/p>\n<p>Wir pr&uuml;fen hier in der <b>If&#8230;Then<\/b>-Bedingung weiterhin zun&auml;chst, ob die <b>Reference<\/b>-Variable gef&uuml;llt werden kann, also ob wir einen g&uuml;ltigen Verweis auf die Bibliothek <b>Microsoft Outlook 16.0 Object Library <\/b>haben.<\/p>\n<p>Falls nicht, pr&uuml;fen wir im <b>If<\/b>-Zweig der Bedingung zus&auml;tzlich, ob wir <b>Outlook.Application <\/b>mit <b>CreateObject(&#8222;Outlook.Application&#8220;) <\/b>erstellen k&ouml;nnen. Auch das erledigen wir wieder bei deaktivierter Fehlerbehandlung.<\/p>\n<p>Tritt dabei kein Fehler auf, stellen wir die Bedingung f&uuml;r die bedingte Kompilierung auf <b>EarlyBinding = 0<\/b> ein. Damit legen wir also fest, dass wir Early Binding nicht nutzen k&ouml;nnen, aber immerhin Outlook vorhanden und instanziierbar ist.<\/p>\n<p>Tritt dabei ein Fehler auf, ist Outlook offenbar gar nicht oder nicht korrekt installiert &#8211; zumindest k&ouml;nnen wir nicht darauf zugreifen. In diesem Fall stellen wir die Bedingung f&uuml;r die bedingte Kompilierung auf <b>EarlyBinding = 1 <\/b>ein.<\/p>\n<p>Au&szlig;erdem haben wir nach wie vor den Fall im <b>Else<\/b>-Teil der <b>If&#8230;Then<\/b>-Bedingung, dass die Bibliothek <b>Microsoft Outlook 16.0 Object Library <\/b>ohne Probleme referenziert werden kann. Hier stellen wir das Argument f&uuml;r die bedingte Kompilierung auf <b>EarlyBinding = -1 <\/b>ein.<\/p>\n<p>Dies verarbeiten wir dann wie in Listing 3 in einer neuen Version unserer vorherigen Prozedur.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>OutlookReferenzierenEarlyUndLateBinding()\r\n     #If EarlyBinding = -1 Then\r\n         <span style=\"color:blue;\">Dim <\/span>objOutlook<span style=\"color:blue;\"> As <\/span>Outlook.Application\r\n         <span style=\"color:blue;\">Dim <\/span>objMailItem<span style=\"color:blue;\"> As <\/span>Outlook.MailItem\r\n         <span style=\"color:blue;\">Set<\/span> objOutlook = <span style=\"color:blue;\">New<\/span> Outlook.Application\r\n         <span style=\"color:blue;\">Set<\/span> objMailItem = objOutlook.CreateItem(olMailItem)\r\n     #ElseIf EarlyBinding = 0 Then\r\n         <span style=\"color:blue;\">Dim <\/span>objOutlook<span style=\"color:blue;\"> As Object<\/span>\r\n         <span style=\"color:blue;\">Dim <\/span>objMailItem<span style=\"color:blue;\"> As Object<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> objOutlook = CreateObject(\"Outlook.Application\")\r\n         <span style=\"color:blue;\">Set<\/span> objMailItem = objOutlook.CreateItem(olMailItem)\r\n     #ElseIf EarlyBinding = 1 Then\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Outlook-Bibliothek nicht vorhanden.\"\r\n         <span style=\"color:blue;\">Exit Sub<\/span>\r\n     #End If\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Neue Version unserer Prozedur f&uuml;r den Zugriff auf Outlook<\/span><\/b><\/p>\n<p>Hier nutzen wir nun nicht mehr die Vergleiche mit den bool&#8220;schen Werten <b>True <\/b>oder <b>False<\/b>, sondern verwenden zur besseren &Uuml;bersicht die Werte, die wir f&uuml;r das Argument f&uuml;r die bedingte Kompilierung eingestellt haben &#8211; also <b>-1<\/b>, <b>0 <\/b>und <b>1<\/b>.<\/p>\n<p>Im Fall <b>-1<\/b> f&uuml;llen wir <b>objOutlook <\/b>einfach mit <b>New Outlook.Application<\/b>.<\/p>\n<p>Bei <b>0 <\/b>f&uuml;llen wir <b>objOutlook <\/b>mit <b>CreateObject(&#8222;Outlook.Application&#8220;)<\/b>.<\/p>\n<p>Bei <b>1 <\/b>ist Outlook nicht vorhanden oder nicht funktionsf&auml;hig und wir geben eine Meldung aus, dass die Outlook-Bibliothek nicht vorhanden ist. Hier k&ouml;nnen wir gegebenenfalls noch Code unterbringen, der eine neue E-Mail &uuml;ber einen alternativen Weg erstellt.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Gerade wenn wir eine Anwendung an viele Nutzer ausliefern, ist nicht sicher, dass alle Voraussetzungen f&uuml;r den fehlerfreien Einsatz unserer Anwendung gegeben sind.<\/p>\n<p>Dabei kann es sein, dass wir wie in diesem Beispiel pr&uuml;fen m&uuml;ssen, ob und in welcher Version Outlook installiert ist.<\/p>\n<p>Ein anderes Beispiel ist der Fall, dass wir die Installation einer eigenen DLL oder einer DLL eines Drittanbieters voraussetzen. Auch hier m&uuml;ssen wir pr&uuml;fen, ob diese vorhanden ist.<\/p>\n<p>Um Fehler zu verhindern, die durch nicht verf&uuml;gbare Verweise entstehen k&ouml;nnen, empfehlen wir, die Anwendung mit Verweis zu entwickeln, um dabei IntelliSense nutzen zu k&ouml;nnen, und anschlie&szlig;end auf Late Binding zu wechseln.<\/p>\n<p>Dabei kann man, wie oben beschrieben, auch beide Varianten gleichzeitig entwickeln.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>EarlyUndLateBindingGleichzeitig.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/EDAEFF9D-FB8F-4E93-9FBD-236C16BFFD05\/aiu_1530.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Early Binding und Late Binding sind zwei Konzepte f&uuml;r das gleiche Ziel: Die Eigenschaften und Methoden von Elementen einer Bibliothek unter VBA verf&uuml;gbar zu machen. Beide unterscheiden sich in verschiedenen Punkten und haben Vor- und Nachteile. Diese ein wenig auszugleichen ist das Ziel dieses Beitrags: Wir wollen zeigen, wie Sie die Vorteile von Early Binding wie den Einsatz von IntelliSense nutzen k&ouml;nnen, und gleichzeitig schnell zu Late Binding zu wechseln, um die dortigen Vorteile zu nutzen. Dazu schauen wir uns zun&auml;chst noch einmal die wesentlichen Unterschiede an und kommen dann zu unserer Idee, beide Versionen parallel zu nutzen &#8211; mit einer Technik namens &#8222;bedingte Kompilierung&#8220;.<\/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":[66012025,662024,662025,66062024,44000025],"tags":[],"class_list":["post-55001530","post","type-post","status-publish","format-standard","hentry","category-66012025","category-662024","category-662025","category-66062024","category-VBA_und_Programmiertechniken"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Early Binding und Late Binding gleichzeitig nutzen - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/Early_Binding_und_Late_Binding_gleichzeitig\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Early Binding und Late Binding gleichzeitig nutzen\" \/>\n<meta property=\"og:description\" content=\"Early Binding und Late Binding sind zwei Konzepte f&uuml;r das gleiche Ziel: Die Eigenschaften und Methoden von Elementen einer Bibliothek unter VBA verf&uuml;gbar zu machen. Beide unterscheiden sich in verschiedenen Punkten und haben Vor- und Nachteile. Diese ein wenig auszugleichen ist das Ziel dieses Beitrags: Wir wollen zeigen, wie Sie die Vorteile von Early Binding wie den Einsatz von IntelliSense nutzen k&ouml;nnen, und gleichzeitig schnell zu Late Binding zu wechseln, um die dortigen Vorteile zu nutzen. Dazu schauen wir uns zun&auml;chst noch einmal die wesentlichen Unterschiede an und kommen dann zu unserer Idee, beide Versionen parallel zu nutzen - mit einer Technik namens &quot;bedingte Kompilierung&quot;.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Early_Binding_und_Late_Binding_gleichzeitig\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2025-01-08T11:21:21+00:00\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"21\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Early_Binding_und_Late_Binding_gleichzeitig\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Early_Binding_und_Late_Binding_gleichzeitig\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Early Binding und Late Binding gleichzeitig nutzen\",\"datePublished\":\"2025-01-08T11:21:21+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Early_Binding_und_Late_Binding_gleichzeitig\\\/\"},\"wordCount\":4053,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"articleSection\":[\"1\\\/2025\",\"2024\",\"2025\",\"6\\\/2024\",\"VBA und Programmiertechniken\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Early_Binding_und_Late_Binding_gleichzeitig\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Early_Binding_und_Late_Binding_gleichzeitig\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Early_Binding_und_Late_Binding_gleichzeitig\\\/\",\"name\":\"Early Binding und Late Binding gleichzeitig nutzen - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"datePublished\":\"2025-01-08T11:21:21+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Early_Binding_und_Late_Binding_gleichzeitig\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Early_Binding_und_Late_Binding_gleichzeitig\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Early_Binding_und_Late_Binding_gleichzeitig\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Early Binding und Late Binding gleichzeitig\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Early Binding und Late Binding gleichzeitig nutzen - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/Early_Binding_und_Late_Binding_gleichzeitig\/","og_locale":"de_DE","og_type":"article","og_title":"Early Binding und Late Binding gleichzeitig nutzen","og_description":"Early Binding und Late Binding sind zwei Konzepte f&uuml;r das gleiche Ziel: Die Eigenschaften und Methoden von Elementen einer Bibliothek unter VBA verf&uuml;gbar zu machen. Beide unterscheiden sich in verschiedenen Punkten und haben Vor- und Nachteile. Diese ein wenig auszugleichen ist das Ziel dieses Beitrags: Wir wollen zeigen, wie Sie die Vorteile von Early Binding wie den Einsatz von IntelliSense nutzen k&ouml;nnen, und gleichzeitig schnell zu Late Binding zu wechseln, um die dortigen Vorteile zu nutzen. Dazu schauen wir uns zun&auml;chst noch einmal die wesentlichen Unterschiede an und kommen dann zu unserer Idee, beide Versionen parallel zu nutzen - mit einer Technik namens \"bedingte Kompilierung\".","og_url":"https:\/\/access-im-unternehmen.de\/Early_Binding_und_Late_Binding_gleichzeitig\/","og_site_name":"Access im Unternehmen","article_published_time":"2025-01-08T11:21:21+00:00","author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"21\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Early_Binding_und_Late_Binding_gleichzeitig\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Early_Binding_und_Late_Binding_gleichzeitig\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Early Binding und Late Binding gleichzeitig nutzen","datePublished":"2025-01-08T11:21:21+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Early_Binding_und_Late_Binding_gleichzeitig\/"},"wordCount":4053,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"articleSection":["1\/2025","2024","2025","6\/2024","VBA und Programmiertechniken"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Early_Binding_und_Late_Binding_gleichzeitig\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Early_Binding_und_Late_Binding_gleichzeitig\/","url":"https:\/\/access-im-unternehmen.de\/Early_Binding_und_Late_Binding_gleichzeitig\/","name":"Early Binding und Late Binding gleichzeitig nutzen - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"datePublished":"2025-01-08T11:21:21+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Early_Binding_und_Late_Binding_gleichzeitig\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Early_Binding_und_Late_Binding_gleichzeitig\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Early_Binding_und_Late_Binding_gleichzeitig\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Early Binding und Late Binding gleichzeitig"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001530","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55001530"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001530\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001530"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001530"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001530"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}