Developpez.com

Plus de 2 000 forums
et jusqu'à 5 000 nouveaux messages par jour

FAQ ExcelConsultez toutes les FAQ

Nombre d'auteurs : 46, nombre de questions : 845, dernière mise à jour : 30 mars 2017 

 
OuvrirSommaireLes macros VBApiloter d'autres applications depuis ExcelLes pages html et Internet

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

Vba
Sélectionnez

' --- 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
Vba
Sélectionnez

' --- 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.

Vba
Sélectionnez

'---------------
'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
Mis à jour le 21 mars 2009  par SilkyRoad

Ce code importe un fichier (nomfichier.pdf) d'une URL vers le disque dur, puis le renomme (rapport.pdf).

Vba
Sélectionnez

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
Créé le 19 février 2008  par SilkyRoad

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]

Vba
Sélectionnez

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

Créé le 19 février 2008  par SilkyRoad, Bbil

Voici un code VBA pour s'authentifier sur un site.
Il requiert l'ajout de la référence à "Microsoft Internet Controls".

Vba
Sélectionnez

Sub connexion()
 
    Dim ie As InternetExplorer
    Dim IEdoc As Object
    Dim DOCelement As Object
 
    Set ie = New InternetExplorer
    ie.Visible = True
    ie.Navigate ("http://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
Créé le 26 mai 2008  par Cafeine

Un exemple pour déclencher le 1er lien hypertexte contenu dans une page html:

Vba
Sélectionnez

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 "http://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
Créé le 26 mai 2008  par SilkyRoad

Remarque : les fenêtres de l'explorater Windows sont prises en compte.

Vba
Sélectionnez

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".

Vba
Sélectionnez

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
Créé le 26 mai 2008  par SilkyRoad

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 :

Vba
Sélectionnez

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.

Vba
Sélectionnez

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 :

Vba
Sélectionnez

'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
Créé le 20 septembre 2008  par Microsoft, SilkyRoad

Vous pouvez utiliser la fonction suivante :
(L'exemple ne vérifie pas préalablement si l'url existe).

Vba
Sélectionnez

Sub Test()
MsgBox NomDomaineURL("http://excel.developpez.com/faq/?page=WebHtml")
End Sub
Vba
Sélectionnez
 
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
Créé le 18 novembre 2008  par SilkyRoad

Cet exemple pilote un bouton radio qui est placé dans une balise 'table', avec comme caractéristiques :

Html
Sélectionnez

<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 ...

Vba
Sélectionnez

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
Créé le 22 mars 2009  par SilkyRoad
  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2009 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.