FAQ Excel
FAQ ExcelConsultez toutes les FAQ
Nombre d'auteurs : 46, nombre de questions : 845, dernière mise à jour : 30 mars 2022
- Comment créer une page html en VBA ?
- Comment télécharger un fichier stocké sur le web ?
- Comment piloter Google Map depuis Excel ?
- Comment s'authentifier sur un site web via VBA ?
- Comment déclencher un lien hypertexte contenu dans une page html ?
- Comment lister les fenêtres Internet Explorer ouvertes ?
- Comment extraire les données d'une table html ?
- Comment extraire le nom de domaine d'une URL ?
- Comment manipuler des boutons radio dans une page html ?
Cet exemple crée une page html dynamiquement. Cette page contient un champ de saisie et un bouton. La procédure permet ensuite d'intercepter l'évènement Click sur le bouton html (renvoie le contenu du champ de saisie).
Nécessite d'activer les références :
Microsoft HTML Objects Library
et
Microsoft Internet Controls
' --- Dans un module standard: ---
Option
Explicit
Public
Collect As
Collection
Public
MaVariable As
String
Sub
Test
(
)
Dim
xFile As
Integer
Dim
Cl As
Classe1
Dim
LaPage As
Object
xFile =
FreeFile
Open "C:\CreationPage.html"
For
Output As
xFile
Print #xFile, "<HTML>"
Print #xFile, "<HEAD>"
Print #xFile, "<TITLE>Ma page de saisie</TITLE>"
Print #xFile, "</HEAD>"
Print #xFile, "<FORM>"
&
_
"<input type='text' size='10' name='autre'><br>"
&
_
"<INPUT type=button name='Bouton1' value='Validez'>"
&
_
"</FORM>"
&
_
"</BODY></HTML>"
Print #xFile, "</BODY>"
Print #xFile, "</HTML>"
Close xFile
Set
Collect =
New
Collection
Set
LaPage =
CreateObject
(
"InternetExplorer.Application"
)
Set
Cl =
New
Classe1
Set
Cl.IE
=
LaPage
Collect.Add
Cl
With
LaPage
.AddressBar
=
False
.MenuBar
=
False
.StatusBar
=
False
.Toolbar
=
False
.Visible
=
True
.Width
=
400
.Height
=
300
.navigate
"C:\CreationPage.html"
Do
Until
.readyState
=
4
DoEvents
Loop
'attend la fin du chargement
End
With
End
Sub
' --- Dans un module de classe nommé Classe1 ---
Option
Explicit
Public
WithEvents IE As
InternetExplorer
Dim
WithEvents Bouton As
HTMLInputElement
Dim
MaPageHtml As
HTMLDocument
Private
Sub
IE_DocumentComplete
(
ByVal
pDisp As
Object, URL As
Variant
)
Set
MaPageHtml =
IE.document
'pour cet exemple le bouton est le 2eme objet "input" de la page... Item(1)
Set
Bouton =
MaPageHtml.getElementsByTagName
(
"input"
).Item
(
1
)
End
Sub
Private
Function
Bouton_onclick
(
) As
Boolean
'Récupère le contenu de la zone de saisie dans la page html
MaVariable =
MaPageHtml.getElementsByTagName
(
"input"
).Item
(
0
).Value
MsgBox
MaVariable
IE.Quit
End
Function
Ce deuxième exemple utilise le résultat d'une requête ADO pour créer une page html.
La procédure effectue une requête dans une table Access, puis construit une page HTML dynamiquement
pour afficher le résultat.
'---------------
'necessite d 'activer la reference Microsoft ActiveX Data Objects x.x Library
'
'Source :
'http://www.vb-helper.com/howto_db_to_html.html
'
'adapté par SilkyRoad le 18.06.2006 pour une utilisation dans Excel
'
'-------------
Sub
transfertTable_Vers_PageHTML
(
)
Dim
xFile As
Integer
, i As
Integer
Dim
Cn As
ADODB.Connection
Dim
Rs As
ADODB.Recordset
On
Error
GoTo
errHandler
xFile =
FreeFile
Open "C:\transfertTableHTML.html"
For
Output As
xFile
Print #xFile, "<HTML>"
Print #xFile, "<HEAD>"
Print #xFile, "<TITLE>Affichage du résultat</TITLE>"
Print #xFile, "</HEAD>"
Print #xFile, ""
Print #xFile, "<BODY TEXT=""#000000"" >"
Print #xFile, "<H2>Les résultats de la requête : </H2>"
Print #xFile, "<TABLE WIDTH=""100%"" CELLPADDING=""1"" "
&
_
"CELLSPACING=""1"" BGCOLOR=""#CCFFFF"" BORDER=""1"">"
Set
Cn =
New
ADODB.Connection
Cn.ConnectionString
=
_
"Provider=Microsoft.Jet.OLEDB.4.0;"
&
_
"Data Source=C:\Documents and Settings\michel\dossier\dataBase.mdb;"
Cn.Open
Set
Rs =
Cn.Execute
(
"SELECT * FROM Table1"
, , adCmdText
)
Print #xFile, "<TR>"
For
i =
0
To
Rs.Fields.Count
-
1
Print #xFile, "<TD BGCOLOR=""CCCCCC"">"
&
Rs.Fields
(
i).Name
&
"</TD>"
Next
i
Print #xFile, "</TR>"
Do
While
Not
Rs.EOF
Print #xFile, "<TR>"
For
i =
0
To
Rs.Fields.Count
-
1
Print #xFile, "<TD>"
&
Rs.Fields
(
i).Value
&
"</TD>"
Next
i
Print #xFile, "</TR>"
Rs.MoveNext
Loop
Print #xFile, "</TABLE>"
Print #xFile, "<BR><BR>Page mise à jour le "
&
Date
Print #xFile, "</BODY>"
Print #xFile, "</HTML>"
Fermeture
:
On
Error
Resume
Next
Rs.Close
Set
Rs =
Nothing
Cn.Close
Set
Cn =
Nothing
Close xFile
If
Err
.Number
=
0
Then
MsgBox
"Opération terminée"
ThisWorkbook.FollowHyperlink
"C:\transfertTableHTML.html"
End
If
Exit
Sub
errHandler
:
MsgBox
"Erreur "
&
Err
.Number
&
vbCrLf
&
Err
.Description
Resume
Fermeture
End
Sub
Ce code importe un fichier (nomfichier.pdf) d'une URL vers le disque dur, puis le renomme (rapport.pdf).
Option
Explicit
Private
Declare
Function
URLDownloadToFile _
Lib
"urlmon"
Alias "URLDownloadToFileA"
_
(
ByVal
pCaller As
Long
, ByVal
szURL As
String
, _
ByVal
szFileName As
String
, ByVal
dwReserved As
Long
, _
ByVal
lpfnCB As
Long
) As
Long
Private
Const
ERROR_SUCCESS As
Long
=
0
Sub
LancementProcedure
(
)
DownloadFile _
"ftp://ftp-nomsite.com/dossier/nomfichier.pdf"
, "C:\rapport.pdf"
End
Sub
Public
Function
DownloadFile
(
ByVal
sURL As
String
, _
ByVal
sLocalFile As
String
) As
Boolean
Dim
lngRetVal As
Long
DownloadFile =
URLDownloadToFile
(
0
&
, sURL, _
sLocalFile, 0
&
, 0
&
) =
ERROR_SUCCESS
End
Function
Il est possible d'ouvrir une page GoogleMap par VBA en précisant les paramètres de l'URL :
http://maps.google.fr/maps?f=q&hl=fr&q=" & [Var_adresse] & ",+" & [Var_code_postale] & "+" & [Var_ville]
Sub
Test
(
)
'RechercheGoogleMap "Condrieu"
RechercheGoogleMap "Condrieu"
, "Rue du marché aux fruits"
'RechercheGoogleMap "Condrieu", "Rue du marché aux fruits", "69420"
End
Sub
Sub
RechercheGoogleMap
(
NomVille As
String
, _
Optional
Adresse As
String
, Optional
CodePostal As
String
)
Dim
strURL As
String
strURL =
"http://maps.google.fr/maps?f=q&hl=fr&q="
strURL =
strURL &
Adresse &
" ,+ "
&
CodePostal &
"+"
&
NomVille
ThisWorkbook.FollowHyperlink
strURL
End
Sub
Consultez le tutoriel de Johann Sorel : Géolocalisation avec GoogleMaps
Voici un code VBA pour s'authentifier sur un site.
Il requiert l'ajout de la référence à "Microsoft Internet Controls".
Sub
connexion
(
)
Dim
ie As
InternetExplorer
Dim
IEdoc As
Object
Dim
DOCelement As
Object
Set
ie =
New
InternetExplorer
ie.Visible
=
True
ie.Navigate
(
"https://www.developpez.net/forums"
)
' attente de fin de chargement
Do
Until
ie.ReadyState
=
4
DoEvents
Loop
Set
IEdoc =
ie.Document
'login
Set
DOCelement =
IEdoc.getElementsByName
(
"vb_login_username"
).Item
DOCelement.Value
=
"cafeine"
'password
Set
DOCelement =
IEdoc.getElementsByName
(
"vb_login_password"
).Item
DOCelement.Value
=
"etpuisquoiencore?turêves?"
DOCelement.Select
'connexion
Set
DOCelement =
IEdoc.Forms
(
0
)
DOCelement.submit
End
Sub
Un exemple pour déclencher le 1er lien hypertexte contenu dans une page html :
Sub
DeclencherLienPageWeb
(
)
'nécessite d'activer les références
'Microsoft HTML Objects Library
'et
'Microsoft Internet Controls
Dim
IE As
InternetExplorer
Dim
Cible As
HTMLAnchorElement
Dim
Doc As
HTMLDocument
Set
IE =
New
InternetExplorer
IE.Navigate
"https://office.developpez.com/"
IE.Visible
=
True
Do
Until
IE.readyState
=
READYSTATE_COMPLETE
DoEvents
Loop
Set
Doc =
IE.Document
'Doc.Links(0) = 1er lien contenu dansla page html
Set
Cible =
Doc.Links
(
0
)
'
Cible.Click
End
Sub
Remarque : les fenêtres de l'explorater Windows sont prises en compte.
Sub
listerFenetres_IE_Ouvertes
(
)
'Nécessite d'activer la référence "Microsoft Internet Controls"
Dim
IE As
InternetExplorer
Dim
winShell As
New
ShellWindows
On
Error
Resume
Next
For
Each
IE In
winShell
If
IE.LocationURL
<>
""
Then
MsgBox
IE.LocationURL
'IE.Quit 'option pour les fermer
End
If
Next
IE
End
Sub
Une autre solution sans déclarer la bibliothèque "Microsoft Internet Controls".
Sub
listerFenetres_IE_Ouvertes_V02
(
)
Dim
IE As
Object, Sh As
Object, Wn As
Object
Set
Sh =
CreateObject
(
"Shell.Application"
)
Set
Wn =
Sh.Windows
For
Each
IE In
Wn
If
IE.LocationURL
<>
""
Then
MsgBox
IE.LocationURL
'IE.Quit 'option pour les fermer
End
If
Next
IE
Set
Wn =
Nothing
Set
Sh =
Nothing
End
Sub
Source :
Méthodes diverses d'utilisation des requêtes Web dans Microsoft Office Excel 2003
La requête Web suivante vous permet de récupérer des données à partir d'une table unique. En outre,
cette requête Web offre une option permettant d'actualiser les données chaque fois qu'un utilisateur ouvre le classeur
ou l'actualise à intervalles réguliers.
La procédure récupère un tableau des taux de change grâce à l'exécution une requête Web :
Sub
RatesWebQuery
(
)
Dim
objBK As
Workbook
Dim
objQT As
QueryTable
Dim
strDecimal As
String
Dim
strThousand As
String
Dim
boolUseSystem As
Boolean
'Création d'un nouveau classeur.
Set
objBK =
Workbooks.Add
'Création de la requète pour récupérer les données.
With
objBK.Worksheets
(
1
)
Set
objQT =
.QueryTables.Add
(
_
Connection:=
"URL;http://www.x-rates.com/tables/USD.HTML"
, _
Destination:=
.Range
(
"A1"
))
End
With
'Propriétés de la requète.
With
objQT
.Name
=
"USD"
'Pour ne pas reconnaitre les formats Date.
.WebDisableDateRecognition
=
True
'Empèche le raffraichissement automatique lors de l'ouverture du classeur.
.RefreshOnFileOpen
=
False
'Ignore le format de la page.
.WebFormatting
=
xlWebFormattingNone
'Attend la fin de la requète avant de poursuivre la procédure.
.BackgroundQuery
=
True
'Définit une table particulière dans la page.
.WebSelectionType
=
xlSpecifiedTables
.WebTables
=
"15"
'Sauvegarde la requète dans le classeur.
.SaveData
=
True
'Ajuste la largeur de la colonne à la taille des données.
.AdjustColumnWidth
=
True
End
With
With
Application
'stocke les paramètres du format nombre.
strDecimal =
.DecimalSeparator
strThousand =
.ThousandsSeparator
boolUseSystem =
.UseSystemSeparators
'Modifie temporairement les paramètres du format nombre.
.DecimalSeparator
=
"."
.ThousandsSeparator
=
","
.UseSystemSeparators
=
True
On
Error
Resume
Next
'Execute la requète et attend la fin du calcul.
objQT.Refresh
BackgroundQuery:=
False
'Réinitialise le format nombre.
.DecimalSeparator
=
strDecimal
.ThousandsSeparator
=
strThousand
.UseSystemSeparators
=
boolUserSystem
End
With
End
Sub
Notez l'utilisation des propriétés Application.DecimalSeparator, Application.ThousandsSeparator et Application.UseSystemSeparators dans la procédure. Dans les versions antérieures à Excel 2002, la méthode d'identification des nombres d'une page par Excel posait des problèmes. En effet, dans un grand nombre de pays européens, le point est utilisé comme séparateur des milliers, ce qui donnait des taux de change bien trop élevés lorsque Excel interprétait les données. Excel utilisait les Paramètres régionaux de Microsoft Windows® lorsqu'il essayait de reconnaître des nombres sur une page.
Dans Excel 2002 et les versions ultérieures, trois propriétés ont été ajoutées à l'objet Application afin de contourner temporairement les paramètres utilisés pour la reconnaissance des nombres :
Application.DecimalSeparator : caractère utilisé pour le séparateur décimal.
Application.ThousandsSeparator : caractère utilisé pour le séparateur des milliers.
Application.UseSystemSeparators : caractère spécifiant l'utilisation du séparateur de Windows ou d'Excel.
Une autre solution consiste à manipuler la bibliothèque InternetExplorer afin d'y ouvrir la page et la bibliothèque "Microsoft HTML Objects Library" pour extraire les données.
Sub
Importer_tableauPageWeb
(
)
'Nécessite d 'activer les references
'Microsoft HTML Objects Library
'et
'Microsoft Internet Controls
Dim
IE As
InternetExplorer
Dim
maPageHtml As
HTMLDocument
Dim
Htable As
IHTMLElementCollection
Dim
maTable As
IHTMLTable
Dim
j As
Integer
, i As
Integer
Set
IE =
CreateObject
(
"InternetExplorer.Application"
)
IE.Visible
=
True
IE.navigate
"http://www.adressesite.html"
Do
Until
IE.readyState
=
READYSTATE_COMPLETE
DoEvents
Loop
Set
maPageHtml =
IE.document
'objet type table
Set
Htable =
maPageHtml.getElementsByTagName
(
"table"
)
'premier tableau dans la page Web
Set
maTable =
Htable
(
0
)
'boucle sur toutes les lignes du tableau
For
i =
1
To
maTable.Rows.Length
'boucle sur les cellules dans chaque ligne
For
j =
1
To
maTable.Rows
(
i -
1
).Cells.Length
Cells
(
i, j) =
maTable.Rows
(
i -
1
).Cells
(
j -
1
).innerText
Next
j
Next
i
End
Sub
Un autre exemple qui extrait la 3eme cellule dans la 1ere ligne de 6eme table :
'Nécessite d 'activer les references
'Microsoft HTML Objects Library
'et
'Microsoft Internet Controls
Dim
IE As
InternetExplorer
Dim
maPageHtml As
HTMLDocument
Dim
Htable As
IHTMLElementCollection
Dim
maTable As
IHTMLTable
Set
IE =
CreateObject
(
"InternetExplorer.Application"
)
IE.Visible
=
True
IE.navigate
"http://www.adressesite.html"
Do
Until
IE.readyState
=
READYSTATE_COMPLETE
DoEvents
Loop
Set
maPageHtml =
IE.document
'objet type table
Set
Htable =
maPageHtml.getElementsByTagName
(
"table"
)
'6eme tableau dans la page Web
Set
maTable =
Htable
(
5
)
'3eme cellule dans la 1ere ligne
MsgBox
maTable.Rows
(
0
).Cells
(
2
).innerText
Vous pouvez utiliser la fonction suivante :
(L'exemple ne vérifie pas préalablement si l'url existe).
Sub
Test
(
)
MsgBox
NomDomaineURL
(
"https://excel.developpez.com/faq/?page=WebHtml"
)
End
Sub
Function
NomDomaineURL
(
strURL As
String
) As
String
Dim
IE As
Object
Dim
maPageHtml As
Object
Set
IE =
CreateObject
(
"InternetExplorer.Application"
)
IE.Visible
=
False
IE.navigate
strURL
Do
Until
IE.readyState
=
4
DoEvents
Loop
Set
maPageHtml =
IE.Document
NomDomaineURL =
maPageHtml.domain
IE.Quit
End
Function
Cet exemple pilote un bouton radio qui est placé dans une balise 'table', avec comme caractéristiques :
<input type
=
'radio'
name
=
'N1'
value
=
'1'
/>
Oui<input type
=
'radio'
name
=
'N1'
value
=
'2'
/>
Non
La macro va sélectionner la deuxième option (non).
Notez que l'index 0 représente la première option, l'index 1 représente la deuxième option ...
Sub
piloterRadioBouton
(
)
'nécessite d'activer la référence Microsoft HTML Objects Library
'nécessite d'activer la référence Microsoft Internet Controls
Dim
IE As
internetExplorer
Dim
maPageHtml As
HTMLDocument
Dim
Helem As
HTMLElementCollection
Set
IE =
CreateObject
(
"internetExplorer.Application"
)
IE.Visible
=
True
IE.navigate
"C:\Documents and Settings\laPage.html"
Do
Until
IE.readyState
=
READYSTATE_COMPLETE
DoEvents
Loop
'attend la fin du chargement
Set
maPageHtml =
IE.document
' getElementsByName("N1") est le nom du bouton Radio
'Item(1) correspond à la 2eme option dans la liste des boutons
Set
Helem =
maPageHtml.getElementsByName
(
"N1"
).Item
(
1
)
Helem.setAttribute
"checked"
, "true"
End
Sub