VBA : L’objet WebBrowser



En réponse à l’article du 2 avril 2009 sur
l’importation de tableau HTML, un lecteur me demande comment on pourrait récupérer des images se trouvant dans le dit tableau ? Evidement la méthode des données externes ne peut convenir ici, mais plusieurs méthodes permettent de réaliser ce travail…Aujourd’hui laissez moi vous présenter l’objet WebBrowser !

- 1 – Avant tous vous allez charger dans votre éditeur VBA, les bibliothèques Microsoft HTML Object Library et Microsoft Internet Controls. (Si vous n’êtes pas sur de la démarche, lisez l’article du 9 Mai 2009)

- 2 – Placez dans votre feuille de calcul, deux objets WebBrower. Pour cela utiliser la commande Développeur / Insérer / Autres contrôles…Dans la liste sélectionnez le contrôle Microsoft Web Brower, cliquez sur le bouton OK et glisser pour tracer votre contrôle. La taille et la position de l’objet n’ont pas d’importance pour l’instant.

- 3 –Comme son nom l’indique un Web Brower est simplement un navigateur Internet que l’on a ici incorporé dans notre feuille de calcul. Donc il va nous permettre d’afficher des pages web et d’en étudier le contenu…

- 4 – La première partie du programme a pour objet d’afficher une page web dans le premier web browser et de trouver des informations sur cette page, notamment le nombre et la liste des images qu’elle contient.

- 5 – La seconde partie ramène dans la feuille une image précise en adaptant la taille du webbrowser à la taille de l’image.

- 6 – Voici le code, puisse t’il vous inspirer des améliorations…

Option Explicit

Private Sub Worksheet_Activate()
'ici je lance ma procédure à l'ouverture du classeur
'à vous de choisir éventuellement un autre événements et (ou) un autre objet
Dim maPageHtml As HTMLDocument
Dim imgHtml As HTMLImg
Dim resultat As String
Dim I As Integer
Dim haut As Integer
Dim larg As Integer
'position et taille du premier webbrowser
Feuil2.WebBrowser1.Left = 1
Feuil2.WebBrowser1.Top = 1
Feuil2.WebBrowser1.Width = 400
Feuil2.WebBrowser1.Height = 200
'position du seond webbrowser
Feuil2.WebBrowser2.Left = 500
Feuil2.WebBrowser2.Top = 1
'affichons une page dans le premier webbrower
Feuil2.WebBrowser1.Navigate "http://www.olivier-picot.fr/pagetest.html"
'analysons le contenu de cette page et retournons
'son url + date de modification + taille + nombre d'images
Set maPageHtml = WebBrowser1.Document
resultat = "adresse de la source : " & maPageHtml.URL & vbLf & _
"derniere modification de la page : " & maPageHtml.LastModified & vbLf & _
"taille de la page : " & maPageHtml.fileSize & " octets " & vbLf & _
"nombre d'images dans la page : " & maPageHtml.images.Length & "."
'affichons cette information
MsgBox resultat, , "Information"
'boucle sur les images pour récupérer leurs noms et écriture dans ma feuille de cacul
For I = 0 To maPageHtml.images.Length - 1
Set imgHtml = maPageHtml.images.Item(I)
Feuil2.Cells(I + 15, 1) = imgHtml.src
Next I
'**************************************
'je recupere la taille de la seconde image de ma page
Set imgHtml = maPageHtml.images.Item(1)
haut = imgHtml.Height
larg = imgHtml.Width
'pour adapter la taille de mon webbrowser à celle de mon image
Feuil2.WebBrowser2.Width = larg
Feuil2.WebBrowser2.Height = haut
'un peu de html et l'image est récupérée
.WebBrowser2.Navigate "about:<img src="http://www.olivier-picot.fr/album2.png" />"
'il est impossible de passer des variables VBA au code HTML aussi cette méthode ne ‘permet de récupérer toutes les images d'une page sans les nommer une à une et les ‘afficher dans des webbrowser différents
End Sub





VBA : Les modules d’un projet



Modules de code, de feuilles, de classeur…les débutants sont un peu perdu dans les différents modules d’un VBAProject. Ou faut’ il écrire le code ? A quelles conditions les procédures peuvent-elles être appelées ? Ce petit schéma devrait vous aider à y voir plus clair !







VBA : Déclarations implicites des types de données



Lorsque vous déclarez vos variables vous avez l’habitude de préciser explicitement le type de données grâce au mot clé
As (Exemple Dim prenom as String). Mais savez vous que vous avez à votre disposition deux autres méthodes permettant la précision de manière implicite.

- 1 – La première méthode consiste à utiliser un suffixe correspondant au type de données :
Dim prenom$
Déclare la variable prenom de type chaîne (String).
% Integer
&
Long
!
Single
#
Double
@
Currency
$
String
- 2 – La seconde méthode utilise l’instruction DefType : Une instruction de type DefStr E-G, X signifie que toutes les variables de toutes les procédures d’un module dont les noms commencent par e, f, g ou x sont de type String. Pour cela la déclaration doit figurer dans le module général de code.
Exemple :
Option Explicit
DefStr E-G, X
Sub test()
‘il devient inutile de préciser le type de ‘ces variables
Dim ea
Dim fa
Dim ga
Dim xa
ea = "A"
fa = "B"
xa = "A"
ga = ea & fa & xa
MsgBox ga
End Sub

Liste des DefType :
DefBool Boolean
DefDbl Double
DefInt Integer
DefDate Date
DefLng Long
DefStr String
DefCur Currency
DefObj Object
DefSng Single
DefVar Variant
DefByte Byte

VBA : Les fichiers XML



Excel 2007 vous permet de travailler facilement sur vos fichiers XML, après importation du fichier dans la feuille de calcul ; il crée alors une zone de travail nommée « mappage XML ». Votre tableur devient alors un véritable éditeur de fichier XML…


- 1 – Commençons par une procédure permettant l’importation d’un fichier XML dans la feuille de calcul
Sub ImporterXML()
Dim MonFichier As XmlMap
'XmlImport est une méthode de l'objet workbook
'On choisi le fichier à importer et on définie son chemin d'accès
'On crée un Mappage
'On précise la cellule de destination
ActiveWorkbook.XmlImport _
URL:=ActiveWorkbook.Path & "\albuminfo.xml", _
Importmap:=MonFichier, _
Overwrite:=False, _
Destination:=Range("$A$3")
'Il faut attribuer un nom au mappage
MonFichier.Name = "Mes Amis 3"
End Sub


- 2 –Après modification des valeurs (Suppression ou ajout de lignes, correction d’erreurs…) dans le mappage, exportons le résultat dans un nouveau fichier XML
Sub ExportXML()
'SaveAsXMLData est une méthode de l'objet workbook
'On nomme le fichier cible à exporter et on définie son chemin d'accès
'On précise le mappage à utiliser
ActiveWorkbook.SaveAsXMLData _
Filename:=ActiveWorkbook.Path & "\albuminfo3.xml", _
Map:=ActiveWorkbook.XmlMaps("Mes Amis 3")
End Sub
Dans cet exemple j’ai supprimé toutes les lignes du mappage sauf la première.

- 3 – Le fichier XML à été modifié à l’extérieur de mon mappage Excel il nous faut donc réactualiser le mappage
Sub ActualiserXML()
'XmlMaps est une méthode de l'objet workbook permettant la gestion des mappages
'XML, actualiser, supprimer, exporter
ActiveWorkbook.XmlMaps("Mes Amis 3").Import _
"C:\Documents and Settings\User\Mes documents\albuminfo.xml"
End Sub





De nouveau une question au sujet de l’article du 6 Juin 2009 sur la suppression de lignes en fonction d’une valeur contenue dans un champ. C’est Décidément un sujet incontournable ! Cette fois un de nos lecteurs souhaiterait non pas supprimer les lignes mais plutôt les masquer ; et de plus il souhaite que la recherche de la valeur se passe dans toute la feuille et non pas dans une colonne unique. J’ai donc relevé le défi…


- 1 – Considérons la liste (A1 :E20), je souhaite (par exemple) masquer toute les lignes qui contiennent le mot France, quelque soit la colonne dans laquelle il se trouve.


- 2 – Voici le code, charge à vous de l’adapter…
Option Explicit
Option Base 1
Sub recherche2()
Dim i As Integer
Dim j As Integer
Dim lignefin As Integer
Dim recherche As String
Dim contenu As String
Dim tab_compare(5)
Dim compare As Long
recherche = InputBox("Veuillez entrer la valeur cherchée ?", "Welcome", "")
'La valeur saisie est transmise à la variable recherche
With ThisWorkbook.Sheets(1)
'détermination du nombre de lignes dans la base
'le nombre de colonnes est en général connu
Range("A2").Select
Range(Selection, Selection.End(xlDown)).Select
lignefin = Selection.Rows.Count
'pour chaque cellule de la base
For i = 2 To lignefin + 1
For j = 1 To 5
'on parcourt, on stocke le contenu de la cellule et on compare avec la valeur saisie
Cells(i, j).Select
contenu = Cells(i, j).Value
'la fonction InStr(chaîne1, chaîne2) permet de vérifier la présence de chaîne2 dans chaîne1
'et retourne l'occurrence de la première position de la comparaison donc 0 si chaîne2 est ‘pas présente dans chaîne1

compare = InStr(1, contenu, recherche)
'pour chaque comparaison on stocke le résultat dans un tableau
If compare = 0 Then
tab_compare(j) = "Y"
Else
tab_compare(j) = "N"
End If
'il faut cinq résultats positifs pour décider de masquer la ligne
If tab_compare(1) = "Y" And tab_compare(2) = "Y" And tab_compare(3) = "Y" _
And tab_compare(4) = "Y" And tab_compare(5) = "Y" Then
Rows(i).Select
Selection.EntireRow.Hidden = True
End If
Next j
Next i
End With
End Sub
‘************************************************************
Sub Remettre()
'prévoir une macro pour réafficher les lignes
Rows("1:21").Select
Selection.EntireRow.Hidden = False
End Sub

 
- 3 – Voici le résultat après exécution de la procédure recherche2 () que j’ai attaché au bouton Recherche, la procédure Remettre() que j’ai attacher au bouton Réafficher permet de faire réapparaitre les lignes masquées.




top