Home > Artikel > Ausgabe 7/2015 > Das Web im Formular

Das Web im Formular

Achtung: Sie sind nicht angemeldet. Wenn Sie Abonnent sind und sich anmelden, lesen Sie den kompletten Artikel, laden das PDF herunter oder probieren die Beispieldatenbank aus (sofern vorhanden).

Links zu Web-Seiten findet man häufig in Anwendungen. Ein Klick auf sie öffnet in der Regel den Webbrowser des Systems, der zur gewünschten Seite navigiert und sie anzeigt. Wenn Sie derlei unter Access benötigen, so sind Sie nicht auf den externen Browser angewiesen, sondern können diesen direkt in Ihre Datenbankanwendung einbauen. Denn Access wartet mit einem eingebauten Steuerelement für diesen Zweck auf. Nehmen wir dieses hier genauer unter die Lupe.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1507_WebControl.accdb

Webdaten

Es gibt immer wieder Gründe, um Webdaten in Datenbanken zur Ansicht zu bringen. Ob das nun Informationen zu Produkten sind, Hilfeseiten, oder gar ein Web-Support, Anwendungsfälle gibt es viele. Den Trend, Hilfesysteme etwa nicht statisch im System zu speichern, gibt Microsoft selbst vor: Die Hilfe zu Office kommt mindestens zu einem Teil direkt aus dem Web, was die Möglichkeit offenlässt, den Inhalt kontinuierlich dynamisch zu verbessern. Auch Sie könnten Ihrer Anwendung solche Hilfeseiten spendieren und schlügen damit zwei Fliegen mit einer Klappe, denn einerseits kann die Hilfe dann innerhalb der Anwendung und andererseits abseits der Anwendung im Browser begutachtet werden. Die Quelle bliebe jedoch dieselbe.

Aber auch für die Anzeige von HTML-Inhalten, die lokal gespeichert sind, gibt es gute Gründe, denn die Gestaltungsmöglichkeiten für Webseiten sind nun mal weitaus vielseitiger, als das, was uns etwa Textboxen anbieten. Sobald Sie den Benutzer zum Lesen umfangreicheren Texts nötigen, ist die Strukturierung über HTML eine Überlegung wert, auch wenn Access mit dem Richtext-Format für Textboxen hier etwas nachgelegt hat.

Webbrowsersteuerelement

Seit Access 2007 bietet Microsoft dieses Steuerelement an, welches HTML-Daten rendern kann. Dabei handelt es sich lediglich um eine Kapselung des Internet Explorers in einem Steuerelement. In ein Formular eingebaut zeigt es eine schlichte weiße Fläche, wie in Bild 1 für das Formular frmWeb der Beispieldatenbank. Wie die meisten anderen Steuerelemente auch weist es eine Datenbindung auf, die hier in der Bezeichnung URL zum Ausdruck kommt, denn das ist das gleichnamige Feld der Tabelle tblHTML, die als Datenquelle für das Formular herangezogen wurde. Im Eigenschaftenblatt zum Webbrowsersteuerelement geben Sie also unter Steuerelementinhalt jenes Feld einer Tabelle an, die den Link zur HTML-Seite enthält. Das Feld muss vom Datentyp Text oder Memo sein. Es ist wichtig festzuhalten, dass hier wirklich nur die URL zur Seite gespeichert sein darf, und nicht etwa der HTML-Inhalt selbst.

Das Formular frmWeb der Beispieldatenbank im Entwurf

Bild 1: Das Formular frmWeb der Beispieldatenbank im Entwurf

Das Webbrowsersteuerelement fügen Sie über den Ribbon in ein Formular oder einen Bericht ein, indem Sie im Tab Entwurf das entsprechende Symbol anklicken (siehe Bild 2). Gegebenenfalls versehen Sie es dann noch mit der Verankern-Einstellung Quer und nach unten dehnen, damit es sich der Größe des Formular anpasst.

Das Webbrowsersteuerelement fügen Sie über den Ribbon-Reiter Entwurf in ein Formular ein

Bild 2: Das Webbrowsersteuerelement fügen Sie über den Ribbon-Reiter Entwurf in ein Formular ein

Rufen Sie das Formular zur Laufzeit auf, so zeigt sich zunächst eine leere Fläche. Denn als URL steht im ersten Datensatz der Tabelle tblHTML der Eintrag about:blank. Was passiert, wenn Sie das Feld stattdessen einfach leer lassen, können Sie mit dem Sprung zum letzten Datensatz über die Navigationsschaltflächen des Formulars ermitteln. Dann nämlich zeigt der Browser die Meldung Adresse ungültig an, wie Sie das auch von Links zu nicht existierenden Webseiten her kennen. Aus diesem Grund ist für das Tabellenfeld URL auch der Vorgabewert about:blank eingetragen.

Klicken Sie sich im Formular zum zweiten Datensatz, so rendert das Steuerelement augenblicklich die Home-Seite von Access im Unternehmen (siehe Bild 3), der dritte führt zu Access [basics] und der fünfte zu einem Youtube-Video. Dies alles geschieht völlig ohne jegliche Programmierung! Sie brauchen sich lediglich darum zu kümmern, dass die zugrundeliegende Tabelle die korrekten URLs enthält, wobei es sich um Webadressen handeln kann, aber auch um URLs zu lokalen Dateien, wobei Sie dann den kompletten Pfad zur HTML-Datei angeben. Auf die Datenbindung an ein Feld können Sie sogar komplett verzichten, wenn Sie die URL als Steuerelementinhalt eintragen, wie in Bild 4. Hier ist die URL als String hinterlegt und der Webbrowser rendert diese Datei dann unabhängig von der Tabelle des Formulars, egal, auf welchem Datensatz Sie sich gerade befinden.

Die URL für das Webbrowsersteuerelement kann auch direkt ins Eigenschaftenblatt eingetragen werden

Bild 3: Die URL für das Webbrowsersteuerelement kann auch direkt ins Eigenschaftenblatt eingetragen werden

Der zweite Datensatz navigiert zur Webseite von Access im Unternehmen

Bild 4: Der zweite Datensatz navigiert zur Webseite von Access im Unternehmen

Innerhalb der Seite können Sie selbstverständlich auf Links klicken, um zu weiteren Seiten zu gelangen. Dass das nicht immer klappt, wie gewünscht, werden wir noch sehen.

Webbrowser-ActiveX-Steuerelement

Bisher wurde unterschlagen, dass es auch vor Access 2007 bereits die Möglichkeit gab, einen Webbrowser in einem Formular unterzubringen. Der Internet Explorer bringt von Haus aus grundsätzlich dieses ActiveX-Control mit, das Sie über den Ribbon Entwurf und den Button ActiveX-Steuerelemente... einfügen (siehe Bild 2 unten). Wählen Sie dazu aus der Liste der ActiveX-Steuerelemente den Microsoft Web Browser aus.

Das Formular frmWebAX ist eine Kopie des vorigen frmWeb, nur dass statt des Access-Steuerelements das ActiveX-Steuerelement zum Einsatz kommt und zwei zusätzliche Schaltflächen zum Vor- und Zurücknavigieren eingefügt wurden. Bild 5 zeigt das Formular in der Entwurfsansicht. Im Unterschied zum Access-Control zeigt das ActiveX-Control das Windows-Logo. Ansonsten sind Funktionalität und Ergebnis zur Laufzeit gleich. Allerdings gibt es eine Unannehmlichkeit: Das ActiveX-Control weist keine Datenbindung auf. Die Eigenschaft Steuerelementinhalt fehlt ihm also. Dieses Manko kann aber mit nur einer Zeile Programm-Code ausgeglichen werden. In die Ereignisprozedur Form_Current (Beim Anzeigen) des Formulars schreiben Sie einfach diese Zeile:

Das Formular frmWebAX mit dem Webbrowser ActiveX-Control im Entwurf

Bild 5: Das Formular frmWebAX mit dem Webbrowser ActiveX-Control im Entwurf

Me!ctlWebAX.Navigate2 Me!URL.Value

Das ActiveX-Control hat im Formular den Namen ctlWebAX. Seiner Methode Navigate2 übergeben Sie als Parameter die URL, welche gerendert werden soll. Und die entnehmen Sie dem Tabellenfeld URL der zugrundeliegenden Tabelle tblHTML.

Das Access-eigene Webbrowsersteuerelement hat gegenüber dem ActiveX-Control des Internet Explorer also nur den einen Vorteil, dass diese kleine Programmierung entfallen kann. Dass man um eine Programmierung dann doch nicht herumkommt, zeigen die weiteren Ausführungen.

Scripting-Fehler

Sobald eine Webseite fehlerhafte Skripte enthält, wird dies in beiden Webbrowser-Controls über einen Dialog gemeldet (siehe Bild 6). In Ihrem externen Webbrowser wird die Anzeige dieser Fehler glücklicherweise unterbunden. Denn fehlerhafte JavaScripts sind auf den heutigen komplexen Websites eher schon die Regel, denn die Ausnahme, aber meist unbedeutend. Und da nervt die Fehleranzeige der Webbrowser-Controls ungemein.

Popup-Dialog bei fehlerhaftem Javascript auf einer  Seite im Webbrowser

Bild 6: Popup-Dialog bei fehlerhaftem Javascript auf einer Seite im Webbrowser

Dieses Verhalten lässt sich jedoch unterbinden, indem die Eigenschaft Silent der Controls auf True gestellt wird. Markieren Sie das Webbrowser-ActiveX-Control im Formular frmWebAX und schauen Sie sich das Eigenschaftenblatt unter Andere an. Dort gibt es diese Eigenschaft Silent, die Sie nun auf Ja einstellen (Bild 7). Leider merkt sich das Steuerelement unter Access diese Einstellung nicht dauerhaft, weshalb es eine gute Idee ist, dies über Programmierung zu lösen. In die Ereignisprozedur Beim Laden (Form_Load) des Formular schreiben Sie dazu diese Zeile:

Eigenschaftenblatt zum Microsoft Web Browser-ActiveX-Control

Bild 7: Eigenschaftenblatt zum Microsoft Web Browser-ActiveX-Control

Me!ctlWebAX.Silent = 1

Und schon werden Sie, wie im stationären Browser, nicht mehr mit den Fehlermeldungen behelligt.

Inspizieren Sie hingegen das Webbrowsersteuerelement im Formular frmWeb, so suchen Sie die Eigenschaft Silent vergeblich. Microsoft hat im Steuerelement nämlich sämtliche Eigenschaften des Internet Explorers ausgeblendet. Sie kommen deshalb nicht umhin, auch hier programmatisch tätig zu werden:

Me!ctlWebAX.Object.Silent = 1

Der Unterschied zur vorigen Zeile besteht nur darin, dass hier der Ausdruck Object eingeschoben ist. Denn Object ist jene Eigenschaft, welche direkt das Webbrowser-Objekt zurückgibt, und dieses ist absolut identisch mit dem ActiveX-Control.

Navigation über Seiten-Links

JavaScript-Fehler sind leider nicht das einzige Erfordernis, um das Webbrowsersteuerelement per Code zu manipulieren. Das nächste Problem tritt auf, wenn Sie auf einer Seite einen Link anklicken, der normalerweise ein neues Fenster oder einen neuen Tab im Browser öffnen würde. Das die Webbrowser-Controls solche Tabs nicht kennen, wird dann nämlich einfach ein echtes Internet Explorer-Fenster geöffnet und mit der Anzeige des Links beauftragt. Sie haben nun die Wahl, wie Sie es per Code lösen: Entweder Sie unterbinden die Navigation zu diesen Links ganz, oder Sie leiten die URL auf das aufrufende Fenster weiter, in unserem Fall also an das Webbrowser-Control. In beiden Fällen ist es aber notwendig, die Navigation zunächst per Code abzufangen.

Hier ist ein Ausflug in das Objektmodell des Internet Explorers angesagt. Wenn Sie das ActiveX-Control in ein Formular einfügen, so wird der Verweis auf die entsprechende Bibliothek automatisch in das VBA-Projekt aufgenommen. Beim Access-Webbrowsersteuerelement dagegen muss der Verweis manuell ausgewählt werden. Über das Menü Extras | Verweise öffnen Sie die Liste der COM-Bibliotheken und aktivieren die Microsoft Internet Controls.

Öffnen Sie sodann den VBA-Objektkatalog und stellen ihn auf die zugehörige Bibliothek SHDocWw ein, wie in Bild 8. Dort finden Sie unter den Klassen WebBrowser und WebBrowser_V1 die Eigenschaften, Methoden und Ereignisse des Controls. Vergleichen Sie diese mit den Eigenschaften des Webbrowsersteuerelements, wenn Sie den Objektkatalog auf Access | WebBrowserControl einstellen. Ein Teil der Methoden ist identisch, aber dennoch fehlen dem Access-Control etliche, die das ActiveX-Control aufweist. Das ist aber nicht tragisch, gibt doch das Access-eigene Control unter seiner Eigenschaft Object genau die Klasse zurück, die hier mit WebBrowser bezeichnet ist.

Objektmodell des Internet Explorers im Objektkatalog

Bild 8: Objektmodell des Internet Explorers im Objektkatalog

Im Objektmodell finden Sie denn auch unter den Ereignissen, die das Webbrowser_V1-Control auslöst, das NewWindow-Ereignis, welches beim Access-eigenen Control nicht eingebaut ist. Dieses Ereignis tritt immer dann auf, wenn der Browser ein neues Fenster oder einen neuen Tab öffnen sollte. Es kann im Formularcode abgefangen werden. Doch wie bekommt man das Access-Control dazu, auf die Methoden des SHDocVw-Webbrowsers aufzusetzen?

Schreiben Sie in den Kopf des Formularmoduls dazu etwa dies:

Private WithEvents objWeb _ As SHDocVw.WebBrowser_V1

Hier wird eine Objektvariable objWeb deklariert, die vom Typ WebBrowser_V1 ist und außerdem über das WithEvents-Statement Ereignisse auslösen kann. Setzen Sie diese Objektvariable schließlich im Beim Laden-Ereignis des Formulars auf das Webbrowsersteuerelement:

Set objWeb = _

Me!ctlWeb.Object

Das funktioniert anstandslos! Nun können die Ereignisse des Controls im Code angesprochen werden. Wählen Sie etwa in der Combobox links oben im Formularmodul den Eintrag objWeb aus, so werden in der rechten Combobox alle möglichen Ereignisse aufgeführt. Wahlen Sie hier das Ereignis NewWindow an, so fügt VBA nun den passenden Prozedurrumpf in das Modul ein, wie in Listing 1. Das Ereignis übergibt dabei diverse Parameter, die vom angeklickten Link herrühren. Für uns ist dabei nur der Parameter URL von Belang, der die Adresse enthält, zu welcher ein neuer Tab geöffnet werden sollte. Über Debug.Print wird rein informativ die Link-URL im VBA-Direktfenster ausgegeben. Der Trick der Angelegenheit ist nun der, dass diese Adresse weiterverwendet wird und das Webbrowsersteuerelement per Navigate2 angewiesen wird, diese Seite selbst zu öffnen. Damit trotzdem kein neues Fenster erscheint, muss allerdings noch die Parametervariable Processed auf den Wert True gesetzt werden. Das sagt dem Webbrowser, dass er sich nicht weiter um die Sache kümmern muss und den Vorgang quasi abbricht.

Private Sub objWeb_NewWindow(ByVal URL As String, ByVal Flags As Long, _

     ByVal TargetFrameName As String, PostData As Variant, _

     ByVal Headers As String, Processed As Boolean)

     Debug.Print "NEWWINDOW", URL

     Processed = True

     objWeb.Navigate2 URL

End Sub

Listing 1: Ereignisprozedur NewWindow des Webbrowsers bei externem Link

Steuern per Code

Da wir schon bei den Ereignissen des Webbrowsers sind, folgt hier noch ein Beispiel, wie Sie andere Manipulationen vornehmen können. Das Ereignis BeforeNavigate2 wird ausgelöst, wenn der Webbrowser eine andere Seite rendern soll, jedoch noch bevor er dies auch tatsächlich tut. Das entspricht in etwa dem Ereignis BeforeUpdate eines Access-Formulars, bevor ein Datensatz in ihm aktualisiert wird. Auch hier wird der Parameter URL übertragen, der die Adresse der Seite enthält, zu der navigiert werden soll. In Listing 2 wird über die Instr-Funktion ermittelt, ob die URL den Ausdruck moss enthält. Trifft dies zu, so wird die Navigation abgebrochen, indem der Parameter Cancel mit True bestückt wird. Öffnen Sie frmWeb in der Formularansicht und springen Sie zum dritten Datensatz, der die URL mosstools.de aufweist. Das Webbrowsersteuerelement zeigt nun gar nichts an, weil die URL moss enthält und Cancel im Code den Browser damit zum Nichtstun anweist.

Sie haben das Ende des frei verfügbaren Teil dieses Artikels erreicht!

Wenn Sie mehr lesen und auf viele weitere Artikel zugreifen möchten, melden Sie sich als Abonnent unter Login an. Falls nicht, bestellen Sie doch einfach ein Jahresabonnement!