Menu Content/Inhalt
DIN1055.de arrow Software arrow Excel als Webbrowser
Excel als Webbrowser

Das Control "WebBrowser" als Möglichkeit, mit Excel im Internet zu Browsen

Das Tabellenkalkulationsprogramm MS-Excel ist in den meisten Ingenieurbüros etabliert, und es gibt immer häufiger die Möglichkeit, für die Berechnung oder für sonstige Tätigkeiten benötigte Daten aus dem Internet zu beziehen. Greift man dabei regelmäßig auf die selben Datenbanken oder Internetseiten zu, kann es sich als sinnvoll erweisen, diesen Zugriff zu automatisieren. Dafür bietet die Software MS-Excel standardmäßig einige Möglichkeiten. Für die Fälle, die damit nicht abgedeckt werden, kann man sich mit VBA selbst helfen. Hier wird eine Möglichkeit vorgestellt, die das Control Microsoft-WebBrowser benutzt, um auf Internetseiten zuzugreifen und ihren Inhalt auszulesen.

Ziel des Beispieles: Automatisches Finden des FAQ-Links der Seite DIN1055.de

Im Folgenden wird von der Codeumgebung einer Userform ausgegangen. Um von der Userform auf eine Webseite zuzugreifen und diese auch anzuzeigen, kann man das Control WebBrowser benutzen. Findet man es (innerhalb des VBE) nicht in der Symbolleiste "Werkzeugsammlung", so wird es dort durch Rechtsklick → "Zusätzliche Steuerelemente" → "Microsoft WebBrowser" hinzugefügt - siehe Abbildung:
 
Hinzufügen des Microsoft Web Browser
 
Ist das Control auf der Userform (möglichst groß) platziert, gestaltet sich das Anzeigen von Internetseiten äußerst einfach durch das Verwenden des Befehls "Navigate". Hierzu ein kleines Beispiel:

Voraussetzung für alle Beispiele: Userform Userform1 mit WebBrowser (WebBrowser1) und CommandButton (Cmd_Aufruf)
Option Explicit

Private
Sub Cmd_Aufruf_Click()
Dim strUrl As String 'Dimensionierung der Variablen
strUrl = "http://www.din1055.de" 'festlegen der URL
Me.WebBrowser1.Navigate strUrl 'Webbrowser zeigt die Adresse an
End Sub
Selbstverständlich muss die Internetadresse (URL) nicht fest im Code verankert werden, sondern kann zum Beispiel aus einer auf der Userform platzierten Textbox ausgelesen werden. So hat der Benutzer die Möglichkeit, die Adresse selbst einzugeben (und man hat schon fast den Internetexplorer nachgebaut ;-) ).

Etwas schwieriger wird es, wenn man nicht nur die Seite anzeigen will, sondern einzelne (bestimmte) Daten aus der Webseite automatisiert auslesen möchte. Das Problem lässt sich grundsätzlich in zwei Teile aufteilen:
  1. Aufruf der Internetseite
  2. Auslesen der Informationen

1. Wenden wir uns der ersten Hürde zu:

Wir haben ja bereits eine Seite angezeigt, doch das Laden von Internetseiten benötigt Zeit. Bei der automatisierten Verarbeitung der Seite stellt sich daher die Frage, wann denn die Seite komplett geladen ist und damit auch die alle Informationen der Seite zur Verfügung stehen.
 
Das Control WebBrowser bringt das Ereignis "DocumentComplete" mit sich. Es wird ausgelöst, wenn der WebBrowser mit dem Laden der Seite fertig ist. Eine mögliche Strategie besteht darin, so lange mit der Weiterführung des Codes zu warten, bis das Ereignis "DocumentComplete" ausgeführt wird. Programmiertechnisch kann man das umsetzen, indem man mit einer Variable arbeitet, die "protokolliert", ob der WebBrowser gerade am Laden oder bereits fertig ist.
 
Dazu wird die öffentlich deklarierte Variable blnLoad verwendet.

Ablauf ist nun folgender:
  • vor dem Seitenaufruf blnLoad = False setzen,
  • Seite aufrufen
  • nun wird eine Schleife aufgerufen.
  • Im Ereignis "DocumentComplete" bekommt die Variable blnLoad den Wert "True" (die Seite ist also geladen)
  • Da blnLoad = True ist, wird die Schleife abgebrochen, der Code wird weiter ausgeführt.
Schauen wir uns das an unserem Beispiel an:

Option Explicit
'API-Funktion zum "Warten":
'Diese Funktion unterbricht die Codeausführung für die angegebene
'Anzahl an Millisekunden

Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)

Dim blnLoad As Boolean '=true: Seite geladen | =false: Seite nicht geladen

Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
'Seite komplett geladen:
blnLoad = True
End Sub


Private Sub Cmd_Aufruf_Click()
Dim strUrl As String

'URL in String speichern:
strUrl = "http://www.din1055.de"

'in Variable speichern, dass Seite nicht geladen ist:
blnLoad = False

'Webseite aufrufen:
Me.WebBrowser1.Navigate strUrl

'Warten auf Seitenaufbau:
Do While blnLoad = False 'Schleifenaufruf
DoEvents 'bewirkt, dass die Ereignisse ausgeführt werden
Call Sleep(100) '100 ms warten
Loop

'Jetzt ist die Seite vollständig aufgebaut
MsgBox "Webseite ist vollständig geladen!"
End Sub

2. Das Auslesen der gesuchten Information:

Hier gibt es mannigfaltige Möglichkeiten. Wer mit RegularExpressions umgehen kann, wird sich die Information schnell aus dem html-Quelltext holen. Wer auf html-Tabellen zugreift wird bemerken, dass man auf diese fast so wie auf Excel-Tabellenblätter zugreifen kann (siehe u.a. VBA-Code des Schneelastrechners). Da diese Frage so allgemein ist, möchten wir hier als Beispiel eine Möglichkeit zeigen, wie man an den angezeigten Text der Seite heran kommt, ihn in einer Datei speichert und wie man auf den html-Quelltext der Seite zugreifen kann:

Option Explicit
'API-Funktion zum "Warten":
'Diese Funktion unterbricht die Codeausführung für die angegebene Anzahl
'an Millisekunden

Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)

Dim blnLoad As Boolean '=true: Seite geladen | =false: Seite nicht geladen


Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
'Seite komplett geladen:
blnLoad = True
End Sub


Private Sub Cmd_Aufruf_Click()
Dim strUrl As String
Dim Doc As Object
'Variblen für Textdatei:
Dim strPfad As String, strText As String, FF As Long
'Variablen für Linkadresse mit Hilfe eines Regulären Ausdruckes
Dim obReg As Object, strLink As String

Set obReg = CreateObject("vbscript.regexp")
obReg.Pattern = "href=""(.*?)"".*FAQ"


'URL in String speichern:
strUrl = "http://www.din1055.de"

'in Variable speichern, dass Seite nicht geladen ist:
blnLoad = False

'Webseite aufrufen:
Me.WebBrowser1.Navigate strUrl

'Warten auf Seitenaufbau:
Do While blnLoad = False
DoEvents
Call Sleep(100)
Loop

Set Doc = WebBrowser1.Document

'Auslesen des angezeigten Textes:
strText = Doc.body.innertext

'Speichern des angezeigten Textes in einer Textdatei:
strPfad = ThisWorkbook.Path & "\Beispiel.txt" 'Speicherpfad
FF = FreeFile() 'Handle
Open strPfad For Append As #FF 'Öffnen (+Erstellen) der Textdatei
Print #FF, strText 'Schreiben in Textdatei
Close #FF 'Speichern und Schließen

'Auslesen der E-Mailkontaktadresse aus dem html-Quelltext:
strText = Doc.body.innerhtml
strLink = obReg.Execute(strText).Item(0).submatches(0)
MsgBox "Der ausgelesene Link lautet:" & vbLf & strLink

'Speicherplatz freigeben
Set Doc = Nothing
Set obReg = Nothing
End Sub

Das Aufrufen und Anzeigen von Internetseiten ist also sehr einfach. Will man bestimmte Informationen auslesen, wird es etwas schwieriger. Hat man jedoch eine persönliche Strategie gefunden, wie man aus dem Text/Quelltext der Seiten die Informationen extrahiert, ist eine automatisierte Webabfrage schnell gemacht.


Anmerkungen / Einschränkungen:
MS-Excel muss für alle Codes auf das Internet zugreifen, evtl. müssen entsprechende Einstellungen in den Firewalls und ähnlichem getroffen werden. Das Control "Webbrowser" verhält sich sehr ähnlich wie der MS-Internet-Explorer. Daher lassen sich bestehende Codes für den MS-InternetExplorer meist leicht auf das WebBrowser-Control adaptieren.

Autor: Florian Schmidt

» Keine Kommentare
Es gibt bisher noch keine Kommentare.
» Kommentar schreiben
Nur registrierte Benutzer können Kommentare schreiben. Bitte melden Sie sich an oder registrieren Sie sich ('Anmelden' im Hauptmenü).
 
< zurück   weiter >
designed by www.madeyourweb.com