Internet Explorer automatiseren

Internet Explorer benaderen

De procedure genaamd Helpmij zal het aantal posts op het Helpmij forum nemen en dat plaatsen in cel A1 van het actieve werkblad.

Private Sub Helpmij()
Const sURL As String = "http://www.helpmij.nl/forum/member.php/56678-Wigi" NavigateTo sURL [A1] = CDbl(.Document.getElementsByTagName("dd")(7).innerText)
End Sub

Je ziet het goed: dit is niet echt uitgebreide code. De procedure NavigateTo gaat 2 dingen doen:

  • navigeren naar de gewenste URL. Gebruik de .Navigate methode.
  • het uitvoeren van de verdere VBA code uitstellen tot als de webpagina klaar is.

Private Sub NavigateTo(URL As String)
Call oIE.Navigate(URL) Call LoadPage
End Sub
Private Sub LoadPage()
With oIE Do While .Busy Or .ReadyState <> READYSTATE_COMPLETE 'Application.Wait DateAdd("s", 1, Now) DoEvents Loop End With
End Sub

LoadPage is geen ingebouwd commando dat je kan gebruiken, het is een procedure die voor mij handig bleek te zijn om als aparte generieke procedure te beschouwen binnen deze module. Application.Wait in die procedure zal de code telkens 1 seconde uitstellen, zolang de webpagina niet geladen is. Haal die lijn code uit commentaar als je wil.

Nu de pagina geladen is, kunnen we ermee aan de slag gaan. De bewuste pagina bevat mijn gegevens op het forum: nickname (Wigi), woonplaats, leeftijd, aantal posts, … Die laatste moeten we hebben. Dus moeten we eigenlijk te weten komen hoe de webpagina door de makers van de forumsoftware werd opgebouwd. Dit zien we met de Web Developer Toolbar:

Het gaat hier m.a.w. om een <dd> tag binnen een definition list in HTML. Klik hier voor meer achtergrondinformatie omtrent de <dd> tag.

In het algemeen hebben we meerdere mogelijkheden ter beschikking om de informatie op te halen uit HTML-tags:

  1. heeft de tag een bepaalde class, ID of naam, kies dan gewoonlijk deze weg om tot het element te komen;
  2. maak een lus doorheen alle elementen op de pagina van het gewenste type (<dd> hier), en stop indien het juiste werd gevonden. We loopen door een collectie aan gelijksoortige elementen;
  3. haal uit bovenstaande collectie direct het juiste item.

Optie 1 is in dit specifieke geval (van webpagina, class en tag) niet mogelijk, dus gebruiken we optie 2 om het item nummer van de <dd> tag te weten komen:

Private Sub LoopVoorDDtags()
Dim coldd As MSHTML.IHTMLElementCollection Dim dd As MSHTML.HTMLDDElement Set coldd = oIE.Document.getElementsByTagName("dd") For i = 0 To coldd.Length - 1 Set dd = coldd(i) j = j + 1 Range("A" & j).Resize(, 2).Value = Array(j, dd.innerText) Next 'of: For Each dd In coldd j = j + 1 Range("A" & j).Resize(, 2).Value = Array(j, dd.innerText) Next
End Sub

Library

We stellen in de code vast dat er een aantal niet-standaard VBA objecten en eigenschappen gehanteerd worden. Inderdaad, die maken deel uit van een andere library: Microsoft HTML Object Library. Het is nuttig om ook naar die library een referentie te leggen in jouw bestand. Zo is er ook Intellisense bij bijvoorbeeld MSHTML. en kan je in de Object Browser veel informatie vinden over wat er zoal kan gedaan worden. Voor de volledigheid:

Sub SetReference()
On Error Resume Next ' Adds a reference to MS HTML Object Library ThisWorkbook.VBProject.References.AddFromGuid "{3050F1C5-98B5-11CF-BB82-00AA00BDCE0B}", 4, 0
End Sub

De code toont op 2 manieren een lus doorheen de collectie van dd tags. Het item nummer en de tekst van de tag worden in het werkblad weggeschreven ter info. Zoek dan naar het juiste item nummer. Dat nummer 7 gebruikte ik dan in de procedure Helpmij bovenaan de pagina.

In het voorbeeld toon ik dat je ook met een <dl> tag kan werken: <dl> tags omvatten 1 of meerdere <dd> tags.

Wordt vervolgd…

De procedure voor Worksheet is quasi gelijk aan die voor Helpmij dus die ga ik niet bespreken. Merk op dat we nog geen code schreven voor het in- en uitloggen op een webpagina. Dat gaan we bij wijze van voorbeeld doen voor de forums van Ozgrid en MrExcel. Kijk daarvoor vlug op pagina 3.

Over Wim

Wim Gielis is Business Intelligence consultant en Excel expert

Andere links