Zur Hauptseite ... Zum Onlinearchiv ... Zum Abonnement ... Zum Newsletter ... Zu den Tools ... Zum Impressum ... Zum Login ...

Achtung: Dies ist nicht der vollständige Artikel, sondern nur ein paar Seiten davon. Wenn Sie hier nicht erfahren, was Sie wissen möchten, finden Sie am Ende Informationen darüber, wie Sie den ganzen Artikel lesen können.

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

Gedrucktes Heft

Diesen Beitrag finden Sie in Ausgabe 3/2007.

Unser Angebot für Sie!

Lesen Sie diesen Beitrag und 500 andere sofort im Onlinearchiv, und erhalten Sie alle zwei Monate brandheißes Access-Know-how auf 72 gedruckten Seiten! Plus attraktive Präsente, zum Beispiel das bald erscheinende Buch 'Access 2010 - Das Grundlagenbuch für Entwickler'!

Diesen Beitrag twittern

Zusammenfassung

Steuern Sie Webseiten fern und füllen Sie enthaltene Formulare mit Daten aus einer Datenbank.

Techniken

VBA, DHTML

Voraussetzungen

Access 2000 oder höher, Internet Explorer 6.0 oder höher

Beispieldatei

WebseitenFernsteuern.mdb, WebseitenFernsteuern.accdb

Shortlink

467

Webseiten fernsteuern

André Minhorst, Duisburg

Ist Ihnen das auch schon mal passiert, dass Sie ein Internetangebot mehr als einmal in Anspruch genommen haben und immer wieder gleiche oder ähnliche Daten in ein Formular eintragen mussten? Dann können Sie aufatmen: Dank datenbankgesteuertem Formularausfüllen ist damit jetzt Schluss! In diesem Beitrag erfahren Sie, wie Sie Webformulare vollautomatisch ausfüllen, und das auch noch mit wechselnden Inhalten.

Der Autor war unruhig. Er programmiert und er schreibt gerne, aber Arbeiten wie das stupide Eingeben der Adressdaten von Kunden in die Webschnittstelle des Paketdienstes sind ihm zuwider. Warum bietet dieser auch keinen WebService an, den man bequem von der Datenbank aus füttern kann – denn dort sind ja alle notwendigen Daten gespeichert? Ach ja, er bietet tatsächlich so etwas an – aber erst ab einem bestimmten Mindestaufkommen von Paketen, das in diesem Fall nicht erreicht wird.

Auch für dieses Problem wird es sicher eine Lösung geben: Warum denn nicht einfach die Internetseite "kapern" und die Adressdaten automatisch dort eintragen lassen? Immerhin bietet Microsoft eine passende, per VBA einsetzbare DHTML-Bibliothek an! Gedacht, getan: Wenige Stunden später steht der erste Entwurf einer Routine, die Absender- und Empfängerdaten in das Webformular des Paketdienstes einträgt, zwei weitere Optionen abhakt und die Senden-Schaltfläche anklickt, um im nächsten Schritt den fertigen Paketaufkleber angezeigt zu bekommen. Kurze Sichtkontrolle, ein Klick auf die Drucken-Schaltfläche und schon sind fünf Minuten eingespart, die in neue Lösungen und Artikel investiert werden können.

Im Grunde gibt es eine ganze Reihe Möglichkeiten, Internetdienste auf diese Weise fernzusteuern: So lassen sich Artikel bei eBay einstellen, Überweisungen per Online-Banking tätigen oder jene Paketaufkleber erzeugen.

Beispielanwendung

Dieser Beitrag zeigt, wie Sie die Weboberfläche eines nicht namentlich genannten Paketdienstes per VBA steuern und den passenden Paketschein geliefert bekommen. Das Ganze wird schön in Form einer einzigen Schaltfläche in ein Formular integriert, das die Bestelldaten des Kunden enthält.

Ein Klick auf diese Schaltfläche soll einen Webbrowser öffnen (hier den Internet Explorer), die Seiten mit dem Formular zum Eingeben der Absender- und Empfängerdaten aufrufen, dieses mit den immer gleichen Absenderdaten und den Daten des aktuellen Kunden füllen und das Formular absenden.

Nun haben Sie Glück, wenn Sie mit genau dem hier betroffenen Paketdienst zusammenarbeiten – Sie können die Anwendung dann direkt einsetzen. In der Regel hat aber jeder Anbieter andere Formulare mit anderen Steuerelementnamen, und auch der generelle Ablauf unterscheidet sich möglicherweise. Deshalb finden Sie nachfolgend im Detail, wie Sie selbst eine solche Fernsteuerung nachbauen können: Dazu untersuchen Sie zunächst die Zielwebseite hinsichtlich der enthaltenen Steuerelemente, bereiten die Daten so auf, dass diese in die Zielfelder passen, und stellen dann die Routine zusammen, die die Informationen aus der Datenbank ausliest und in das Webformular schreibt.

Zielformular

Ohne überhaupt einen Blick auf die möglicherweise verwendeten Techniken brauchen Sie auf jeden Fall die Namen der Formularfelder, die Sie mit den Daten aus der Datenbank füllen möchten. Um diese zu ermitteln, gibt es zwei Möglichkeiten:

  • Die Sichtmethode. Dabei öffnen Sie den Quellcode der Internetseite über den Menübefehl Ansicht/Quelltext und suchen die passenden Bezeichnungen heraus.
  • Die automatische Methode. Wenn schon automatisieren, dann auch richtig: Der Internet Explorer lässt sich per VBA referenzieren, also können Sie auch den angezeigten Inhalt auslesen. Das Ganze funktioniert per DHTML, einer Bibliothek, die den Zugriff auf das Objektmodell einer HTML-Seite zulässt: Damit können Sie beliebige Elemente einer Internetseite auslesen, anpassen oder auf andere Weise steuern.

Keine Frage, welche Methode hier zum Einsatz kommt. Zwar ist mit dem automatisierten Auslesen ein wenig Programmierarbeit verbunden, aber schließlich werden die meisten von Ihnen (und ich auch) für innovativen Quellcode und nicht für das manuelle Durchsuchen ellenlanger HTML-Codes bezahlt.

Das Zielformular der Beispielanwendung sieht übrigens wie in Abb. 1 aus. Wie nun kommt man aber mit geringstmöglichem Aufwand an die Namen der Steuerelemente? Zunächst einmal brauchen Sie eine Referenz auf den Webbrowser und müssen die gewünschte Seite aufrufen, dann können Sie per DHTML auf deren Elemente zugreifen.

pic001.tif

Abb. 1: Dieses Webformular soll automatisch gefüllt und abgeschickt werden.

Klasse Schnittstelle

Um alles, was mit dem Zugriff auf den Internet Explorer zu tun hat, sauber zu kapseln, legen Sie eine eigene Klasse namens clsIEController an. Damit diese beim Instanzieren direkt eine Internet Explorer-Instanz erzeugt, nutzen Sie das Initialize-Ereignis.

Dieses instanziert ein Objekt des Typs InternetExplorer mit der Bezeichnung objIE. Dessen Deklaration impliziert übrigens das Schlüsselwort WithEvents, was bedeutet, dass Sie die Ereignisse dieses Objekts abfangen können - mehr dazu weiter unten. Ohne einen Verweis auf die passende Bibliothek bringt das allerdings alles nichts – also binden Sie die Bibliothek Microsoft Internet Controls in das aktuelle VBA-Projekt ein. Und wenn Sie schon einmal dabei sind, wiederholen Sie das Gleiche mit der Bibliothek Microsoft HTML Object Library.

Das Terminate-Ereignis tritt ein, wenn Sie eine Objektvariable mit Bezug auf diese Klasse löschen. Wichtig ist außerdem noch die Eigenschaft Visible, mit der man die Internet Explorer-Instanz ein- und ausblenden kann.

Dim WithEvents objIE As InternetExplorer

Private Sub Class_Initialize()

Set objIE = New InternetExplorer

objIE.Silent = True

End Sub

Private Sub Class_Terminate()

Set objIE = Nothing

End Sub

Public Property Let Visible(bolVisible _
As Boolean)

mVisible = bolVisible

objIE.Visible = bolVisible

End Property

Fehlt also noch Code, der endlich den Internet Explorer anzeigt. Dieser sieht so aus und kann in einem beliebigen Standardmodul untergebracht werden:

Public objIEController As clsIEController

Public Sub IEStarten()

Set objIEController = New clsIEController

objIEController.Visible = True

End Sub

Nach dem Aufrufen dieser Routine erscheint ein Internet Explorer, zeigt allerdings keine Seite an. Die passende Methode für die Klasse clsIEController sieht so aus:

Public Sub LoadDocument(strDocumentname As _
String)

mDocumentComplete = False

objIE.Navigate2 strDocumentname

End Sub

Den Aufruf können Sie der kleinen Routine IEStarten hinzufügen (in einer Zeile):

objIEController.LoadDocument
"http://www.access-im-unternehmen.de"

Warteschleife

Damit können Sie nun schon eine Seite in der neuen IE-Instanz anzeigen. Bevor Sie per Code auf die in der Seite enthaltenen Elemente zugreifen, müssen Sie zunächst noch sicherstellen, dass diese auch fertig geladen ist.

Und hier kommt das soeben erwähnte Schlüsselwort WithEvents ins Spiel: Der Internet Explorer stellt wie viele andere Anwendungen oder auch Objekte wie Formulare und Steuerelemente Ereignisse bereit.

So löst er beispielsweise ein Ereignis aus, wenn das Laden einer neuen Seite begonnen hat oder wenn diese fertig geladen ist. Die verfügbaren Ereignisse können Sie betrachten, wenn Sie im Codefenster der Klasse clsIEController im linken Kombinationsfeld den Eintrag objIE auswählen und dann das rechte Kombinationsfeld aufklappen (s. Abb. 2).

pic002.tif

Abb. 2: Einfaches Zusammenstellen der Ereignisprozeduren für den Internet Explorer

Per Auswahl eines dieser Einträge legen Sie automatisch den Prozedurrumpf einer passenden Ereignisprozedur an.

In diesem Fall brauchen Sie erst einmal zwei davon:

  • BevoreNavigate2 wird vor dem Navigieren zu einer neuen Seite ausgelöst und
  • DocumentComplete nach Beendigung des
    Ladevorgangs.

Die beiden hier verwendeten Prozeduren stellen lediglich die interne Variable mDocumentComplete auf den Wert False beziehungsweise True ein:

Private Sub objIE_BeforeNavigate2(ByVal pDisp _
As Object, URL As Variant, Flags As _
Variant, TargetFrameName As Variant, _
PostData As Variant, _
Headers As Variant, Cancel As Boolean)

mDocumentComplete = False

End Sub

Private Sub objIE_DocumentComplete(ByVal _
pDisp As Object, URL As Variant)

mDocumentComplete = True

End Sub

Was hat es damit auf sich? Nun, diese Eigenschaft wird von der Klasse über die folgende Property Get-Prozedur nach außen hin verfügbar gemacht:

Public Property Get DocumentComplete() _
As Boolean

DocumentComplete = mDocumentComplete

End Property

Darüber lässt sich leicht prüfen, ob die gewünschte Seite bereits fertig geladen ist – und zwar in einer kleinen Schleife:

Do While Not .DocumentComplete

DoEvents

Loop

Diese läuft erst weiter, wenn die Eigenschaft DocumentComplete des objIEController-Objekts den Wert True annimmt.

Dies ist auch der Fall, wenn es die Seite nicht gibt. Um auch dies zu kontrollieren, können Sie die folgende Ereignisprozedur nutzen, um im Fehlerfall eine Statusvariable mit einem passenden Wert zu füllen:

Sie haben das Ende des frei verfügbaren Teils des Artikels erreicht. Lesen Sie weiter, um zu erfahren, wie Sie den vollständigen Artikel lesen und auf viele hundert weitere Artikel zugreifen können.

Sind Sie Abonnent?Jetzt einloggen ...
 

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

© 2003-2015 André Minhorst Alle Rechte vorbehalten.