FAQ Excel

FAQ ExcelConsultez toutes les FAQ
Nombre d'auteurs : 46, nombre de questions : 845, dernière mise à jour : 30 mars 2022
Sommaire→Les macros VBA→piloter d'autres applications depuis Excel→Les pages html et Internet- 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 FunctionCe 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 SubCe 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 SubConsultez 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 SubUn 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 SubRemarque : 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 SubUne 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 SubNotez 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 SubUn 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 SubFunction 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 FunctionCet 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


