Récupérer Tableau Page Web

Bonjour à tous,

Cela fait un moment que je cherche à récupérer les données de deux tableaux (le classement de la presse et les pronostics de la presse) présents sur une page web via power query. J'ai déjà réalisé la connexion dans le fichier joint.

N'y arrivant pas, je fais appel à la communauté pour obtenir une réponse.

Je souhaiterais vraiment y arriver avec power query dans la mesure du possible.

S'il s'avère que ce n'est pas possible, pourriez-vous m'indiquer une façon d'y arriver avec le VBA ?

Merci d'avance de votre aide,

Olivia

43stat-pq.xlsx (18.99 Ko)

Bonjour à tous,

N'y-a-t-il personne que cela inspire ?

Voici le lien de la page en question :

http[://www.]statoprono[point]com/F_classementpressepub[point]php?nocall=1&deltacall=-1

D'avance merci d'un petit coup de main.

Bonne journée,

Olivia

Bonjour Olivia,

je ne suis pas expert en PowerQuery ... je vais voir si je peux utiliser d'autres méthodes.

Par contre ceci

ne donne rien !! Il faut rentrer une date ?

capture d ecran 321

Voici

150statoprono.xlsm (27.49 Ko)

Un grand merci Steelson.

Effectivement il fallait bien saisir une date car l'adresse brute que j'avais indiquée n'affichait rien.

Ta réponse m'oblige à me pencher un peu plus en profondeur sur la récupération de données via du VBA.

Peux-tu m'indiquer où je pourrai trouver un peu plus d'informations sur l'objet DataObject et ses propriétés et méthodes ? J'aimerais pouvoir reproduire cette démarche sur d'autres sites.

Encore merci et bon dimanche,

NB : si quelqu'un a la démarche en power query, je reste preneuse.

Ta réponse m'oblige à me pencher un peu plus en profondeur sur la récupération de données via du VBA.

Peux-tu m'indiquer où je pourrai trouver un peu plus d'informations sur l'objet DataObject et ses propriétés et méthodes ?

Hum ... sur le net, et au travers d'exemples ici.

Mais il y a plusieurs façons de trouver les informations, et toutes ne sont pas interchangeables.

Je vais faire un topo en récupérant les différents cas que j'ai pu traiter !

Excellent

Steelson, vraiment merci d'avance pour le topo et pour le temps que tu consacres à cela.

C'est une super idée qui en aidera plus d'un je pense .

Début du tuto ... par épisodes. Une fois terminé et surtout compréhensible, je le mettrai dans une rubrique adaptée.

J'avais déjà tenté un rédaction ici https://forum.excel-pratique.com/viewtopic.php?p=702547#p702547 sans être satisfait à 100%.

COMMENT RÉCUPÉRER DES INFORMATIONS DU WEB ?

D'abord, attention aux copyrights !

Premier réflexe : utiliser PowerQuery qui se chargera de proposer les tableaux de la page web en question.

Autre solution ... elle se trouve ici : https://www.excel-pratique.com/fr/telechargements/macros/tables-html-site-excel-no432.php

Pour comprendre cette solution, il faut se rappeler qu'une page web, c'est du texte qu'un navigateur va interpréter et assembler avec d'autres ressources (images, scripts, styles).

On peut aller chercher la source par une simple interrogation

Sub Maj()
Dim URL$, obj As New DataObject
    DoEvents
    URL = Cells(1, 1).Value
    On Error Resume Next
    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", URL, False
        .Send
        If .Status = 200 Then
            txt = .responseText
            obj.SetText txt
            obj.PutInClipboard
            MsgBox "ouvrir traitement de texte (genre wordpad ou notepad++ sinon le bloc notes) et faire Ctrl+V"
        End If
    End With
End Sub
82page-complete.xlsm (19.60 Ko)

Ce texte assez libre a néanmoins a un format codifié à base de balises :

<table________>_____________</table> pour un tableau
<a href="_____________">cliquer ici</a> pour un lien vers une autre page
<form method="___post___ou___get___"><input type="_______">____</form>
etc.

On peut en extraire les parties qui nous intéressent, sachant qu'excel a la particularité de bien interpréter les tableaux copiés en respectant leur mise en forme. La commande split permettra de sélectionner la partie du texte intéressante :

txt = "<table" & Split(Split(.responseText, "<table")(i), "</table>")(0) & "</table>"

Pourquoi cela ne marche pas à tous les coups !

1- D'abord il faut que le site soit structuré en tableaux (balise <table>), ce qui n'est pas toujours le cas, certains sites privilégiant l'utilisant de balises "fourre-tout" ou génériques <div> !

Parce qu'ensuite, certains sites comme celui-ci objet de ce sujet imbrique les tableaux dans des tableaux. On y reviendra dans les chapitres suivants avec des méthodes textuelles ou utilisant le DirectObjectModeling.

Ou enfin les données sont fournies dans une structure particulière en JavaScriptObjectNotation json qui requiert des méthodes spécifiques.

2- Mais aussi parce qu'il faut parfois indiquer des paramètres. Ceux-ci sont passés au travers de <form> dont je parlais plus haut. Il y a 2 méthodes :

  • méthode get : les paramètres sont en clair dans l'URL séparés par le caractère esperluette &. Voici une fonction simple qui permet alors de récupérer le texte-code source de la page web.
Function HtmlGet(URL As String) As String
    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", URL, False
        .Send
        HtmlGet = .responseText
    End With
End Function
  • méthode post : les paramètres ne sont pas en clair dans l'URL, cela devient plus compliqué ! on mettra ces paramètres et leur valeurs dans une cellule en séparant les paramètres par & et en affectant leur valeur avec =. Voici une fonction simple qui permet alors de récupérer le texte-code source de la page web.
Function HtmlPost(URL As String, param As String) As String
    With CreateObject("MSXML2.XMLHTTP")
        .Open "POST", URL, False
        .setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
        .Send param
        HtmlPost = .responseText
    End With
End Function

3- autre écueil : les sites demandent une authentification explicite (utilisateur et mot de passe) ou implicite (session, token/jeton)... on verra cela aussi par la suite en simulant un navigateur !

4- enfin, la page peut se compléter après chargement (fonctionnement asynchrone ajax) ... cela peut aboutir à des impossibilités.

On reviendra sur les points 1, 2, 3 et 4 ci-après ...

Excellentissime !!!

Ton topo est vraiment très intéressant.

Je n'ai pas encore tout digéré mais j'ai déjà beaucoup appris.

Je suis très intéressée par la suite .

Merci beaucoup Steelson pour le temps passé à rédiger cela.

Juste une petite question par rapport à ma demande initiale.

J'ai constaté que dans les données récupérées dans les tableaux de la page web, les accents sont transformés en symboles.

Y-a-t-il moyen d'y remédier ?

Merci d'avance.

Olivia

J'ai constaté que dans les données récupérées dans les tableaux de la page web, les accents sont transformés en symboles.

Y-a-t-il moyen d'y remédier ?

Le site est mal codé, il ne précise pas utf-8 et n'emploie pas l codage des caractères diacritiques :
é
s'écrit
&eacute;

Cela concerne uniquement Tiercé-mag ... je vais regarder. C'est compliqué car c'est remplacé par un pseudo point d’interrogation, dont le code ascii est le même que ? pour excel ! et ? veut dire "tous les caractères" donc tout est alors remplacé par ?.

... suite ...

Comment récupérer des données quand PowerQuery ou la moulinette https://www.excel-pratique.com/fr/telechargements/macros/tables-html-site-excel-no432.php ne fonctionne pas !

Considérons que l'appel au site est réglé, que ce soit directement avec une URL, que ce soit avec des paramètres transmis en méthode get (nota : dans ce cas, ne pas oublier d'encoder les paramètres par WorksheetFunction.EncodeUrl) ou post expliquée au point 2 ici https://forum.excel-pratique.com/viewtopic.php?p=838402#p838402.

Il faut pouvoir a minima repérer les données dans le code source de la page (affichage par un clic droit + afficher la source ou Ctrl+u pour ce qui est de chrome par exemple).

2 grandes options :

Les 2 options sont quasi équivalentes. La première est plus "professionnelle". Dans le cas des tableaux objet du post initial, il a fallu passer par la manipulation du texte du code source pour arriver à "piéger" le tableau de valeurs.

1- manipuler les objets :

Il faut créer une page As New HTMLDocument et charger dans cette page la réponse

page.body.innerHTML = pageHTML(url)

Ensuite, on utilisera getElementsByTagName pour la balise (tag) dans laquelle se trouve ce qui est recherché. Pour affiner la recherche, on pourra aussi discriminer selon un attribut de la balise via getAttribute afin de récupérer le contenu innerHTML

Exemple avec balise a

    For Each lien In page.getElementsByTagName("a")
        If lien.getAttribute("title") Like "Consulter les valeurs du secteur*" Then Range("A1") = lien.innerHTML
        If lien.getAttribute("title") Like "*indice de référence*" Then Range("A2") = lien.innerHTML
    Next

Exemple avec balise p

    For Each paragraphe In page.getElementsByTagName("p")
        If paragraphe.innerHTML Like "*MEUR*" Then Range("A3") = paragraphe.innerHTML
    Next

Exemple avec balise table

    For Each tableau In page.getElementsByTagName("table")
        temp = "<table>" & tableau.innerHTML & "</table>"
    Next

Au-delà de getElementsByTagName, on pourrait aussi utiliser getElementsByClassName ou getElementById

Une application consiste à lister tous les liens contenus dans un site (merci Pierre56) :

Sub liste()
Dim page As New HTMLDocument, lien As Object, lig As Integer, url As String, invit As String

    [www].CurrentRegion.Offset(2, 0).ClearContents
    page.body.innerHTML = pageHTML([www])
    lig = 3
    For Each lien In page.getElementsByTagName("a")
        url = lien.getAttribute("HREF")
        invit = lien.innerHTML
        If url Like "*formation*" Then
            Cells(lig, 1) = url
            Cells(lig, 2) = invit
            lig = lig + 1
        End If
    Next lien

End Sub

2- manipuler le code source comme étant du texte :

Dans ce cas, on cherchera dans le code source par quoi est encadré ce qui est recherché.

La page sera chargée dans une zone string

    txt = pageHTML(url)

Et on utilisera la fonction split

txt = Split(Split(.responseText, avant)(i), apres)(0) 

ou si on veut inclure les bornes de recherche

txt = avant & Split(Split(.responseText, avant)(i), apres)(0)  & apres

parfois même répétée pour affiner comme dans l'exemple joint pour la valorisation.

Exemple comparé joint ...

Sub InterroViaTraitementDeTexte()
Dim url$, obj As New DataObject

    ActiveWorkbook.Sheets.Add After:=Worksheets(Worksheets.Count)
    url = [www]
    txt = pageHTML(url)

    ' valeur isolées
    Range("A1") = Split(Split(txt, "Consulter les valeurs du secteur ")(1), """")(0)
    Range("A2") = Split(Split(txt, "Consulter l&#039;indice de référence : ")(1), """")(0)
    temp = Split(Split(txt, "valorisation")(1), "</li>")(0)
    Range("A3") = Split(Split(temp, """>")(1), "<")(0)

    ' tables
    For i = 1 To UBound(Split(txt, "<table"))
        Range("A" & Rows.Count).End(xlUp).Offset(2, 0).Select
        temp = "<table" & Split(Split(txt, "<table")(i), "</table>")(0) & "</table>"
        obj.SetText temp
        obj.PutInClipboard
        Application.Wait Now + TimeValue("00:00:01")
        ActiveSheet.Paste
    Next

    Range("A1").Select

End Sub

Sub InterroViaObjet()
Dim url$, page As New HTMLDocument, lien As Object, paragraphe As Object, tableau As Object
Dim obj As New DataObject

    ActiveWorkbook.Sheets.Add After:=Worksheets(Worksheets.Count)
    url = [www]
    page.body.innerHTML = pageHTML(url)
    For Each lien In page.getElementsByTagName("a")
        If lien.getAttribute("title") Like "Consulter les valeurs du secteur*" Then Range("A1") = lien.innerHTML
        If lien.getAttribute("title") Like "*indice de référence*" Then Range("A2") = lien.innerHTML
    Next

    For Each paragraphe In page.getElementsByTagName("p")
        If paragraphe.innerHTML Like "*MEUR*" Then Range("A3") = paragraphe.innerHTML
    Next

    For Each tableau In page.getElementsByTagName("table")
        Range("A" & Rows.Count).End(xlUp).Offset(2, 0).Select
        temp = "<table>" & tableau.innerHTML & "</table>"
        obj.SetText temp
        obj.PutInClipboard
        Application.Wait Now + TimeValue("00:00:01")
        ActiveSheet.Paste
    Next

    Range("A1").Select

End Sub

NOTA : les sites évoluent en permanence, il faudra donc être capable de reprendre la macro pour l'adapter à l'évolution des sites.

Prochain chapitre : les données sont fournies dans une structure particulière en JavaScriptObjectNotation json

Dans le cas des tableaux objet du post initial, il a fallu passer par la manipulation du texte du code source pour arriver à "piéger" le tableau de valeurs.

J'ai réussi à piéger les tableaux souhaités en exploitant la propriété style.width

Sub viaObjet()
Dim page As New HTMLDocument, tableau As Object
Dim obj As New DataObject

    'interro
    Sheets("accueil").Select
    page.body.innerHTML = HtmlPost([B1], [B4])

    Sheets("via objet").Select
    Cells.Clear

    For Each tableau In page.getElementsByTagName("table")
        If tableau.Style.Width = "340px" Or tableau.Style.Width = "500px" Then
            Range("A" & Rows.Count).End(xlUp).Offset(3, 0).Select
            temp = "<table>" & tableau.innerHTML & "</table>"
            obj.SetText temp
            obj.PutInClipboard
            Application.Wait Now + TimeValue("00:00:01")
            ActiveSheet.Paste
        End If
    Next

End Sub

Voici à titre d'exercice ...

Merci Steelson.

Je continue la lecture avec un grand intérêt.

J'apprends encore et encore .

Bonne journée.

C'est pas fini !

Prochain chapitre : json ... exemple :

https://public.opendatasoft.com/api/records/1.0/search/?dataset=prix_des_carburants_j_7&q=52000

Rappel :

- les données sont sous forme de tableau : elles peuvent être accessibles via PowerQuery ou la moulinette https://www.excel-pratique.com/fr/telechargements/macros/tables-html-site-excel-no432.php

- les données sont "isolées" ou le tableau de données n'est pas accessible comme décrit ci-dessus : solution proposée avec getElementsByTagName, getElementsByClassName ou getElementById et sélection au moyen de leurs attributs par getAttribute . Il est toujours possible de traiter directement le texte-source au moyen de split.

Maintenant, voyons le cas où les données sont incluses dans le code source sous forme JSON. [quote="https://www.json.org/json-fr.html"]JSON (JavaScript Object Notation – Notation Objet issue de JavaScript) est un format léger d'échange de données.[/quote]

Exemples :

https://www.prevision-meteo.ch/services/json/geneve
https://public.opendatasoft.com/api/records/1.0/search/?dataset=prix_des_carburants_j_7&q=52000

On peut aussi lire la prose de maître Pierre56 https://forum.excel-pratique.com/viewtopic.php?p=838071#p838071

CAS SIMPLE : Prenons le cas de la météo de Genève ... quelle est la pression atmosphérique actuelle ?

- Lire le json au moyen d'un outil tel que firefox et repérer la donnée et son arborescence

capture d ecran 330

- Créer par itération les objets ou "instancier" par set depuis le premier niveau jusqu'à l'avant dernier, ici un seul niveau :

Set Lobjet = VBA.CallByName(JsonObject, "current_condition", VbGet)

- Copier la donnée, en utilisant l'objet instancié précédemment, ici :

LAdonnee = VBA.CallByName(Lobjet, "pressure", VbGet)

Le code complet est donc :

Sub pression_actuelle()

    Dim ScriptEngine As Object
    Set ScriptEngine = CreateObject("ScriptControl")
    ScriptEngine.Language = "JScript"

    Dim JsonObject As Object, Lobjet As Object, LAdonnee As String

    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", "https://www.prevision-meteo.ch/services/json/geneve", False
        .send
        Set JsonObject = ScriptEngine.Eval("(" & .responsetext & ")")
    End With

    Set Lobjet = VBA.CallByName(JsonObject, "current_condition", VbGet)
    LAdonnee = VBA.CallByName(Lobjet, "pressure", VbGet)
    MsgBox "pression : " & LAdonnee

End Sub

on peut aussi écrire plus simplement et dans certains cas (quand le terme ne fait pas partie des mots réservés VBA)

MsgBox "pression : " &  JsonObject.current_condition.pressure

CAS COMPLEXE : Prenons le cas des tarifs de carburants ... il y a ici 2 particularités, d'abord un nombre d’occurrences variables (différentes stations de service) et une des informations (horaires d'ouverture ou timetable) est elle-même sous forme json (que j'appellerai json gigogne) qu'il faudra traiter par itération.

- j'ajoute une fonction au ScriptControl :

Dim ScriptEngine As Object
    Set ScriptEngine = CreateObject("ScriptControl")
    ScriptEngine.Language = "JScript"
    ScriptEngine.AddCode "function getProperty(jsonObj, propertyName) { return jsonObj[propertyName]; } "
capture d ecran 331

qui permettra de lire les propriétés d'un objet, notamment sa longueur (length) qui sera le nombre d'occurrences dans le jargon javascript :

ScriptEngine.Run("getProperty", elem1, "length")

- j'instancie les objets pour atteindre les données souhaitées, objet1 puis objet2 qui est le sous-objet de objet1 et qui est ici l'indice du tableau, enfin objet3

    On Error Resume Next ' absence d'un élément
    Set objet1 = VBA.CallByName(JsonObject, "records", VbGet)
    For n = 0 To ScriptEngine.Run("getProperty", objet1, "length") - 1
        Set objet2 = VBA.CallByName(objet1, n, VbGet)
        Set objet3 = VBA.CallByName(objet2, "fields", VbGet)
        For i = 1 To 7
            Range("B" & i).Offset(0, n).Value = VBA.CallByName(objet3, Range("A" & i).Value, VbGet)
        Next

- pour la donnée-json timetable, captée -quand elle existe- par le biais de la même procédure, je la recompose en objet :

horaires = VBA.CallByName(objet3, "timetable", VbGet)
Set horairesObj = ScriptEngine.Eval("(" & horaires & ")")

Le code complet est donc :

Sub lire()

Dim ScriptEngine As Object
    Set ScriptEngine = CreateObject("ScriptControl")
    ScriptEngine.Language = "JScript"
    ScriptEngine.AddCode "function getProperty(jsonObj, propertyName) { return jsonObj[propertyName]; } "

Dim JsonObject As Object, objet1 As Object, objet2 As Object, objet3 As Object, objet4 As Object
Dim horairesObj As Object

    Sheets("lecture").Select
    Range("A1").CurrentRegion.Offset(0, 1).ClearContents

    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", [www], False
        .send
        Set JsonObject = ScriptEngine.Eval("(" & .responsetext & ")")
    End With

    On Error Resume Next ' absence d'un élément
    Set objet1 = VBA.CallByName(JsonObject, "records", VbGet)
    For n = 0 To ScriptEngine.Run("getProperty", objet1, "length") - 1
        Set objet2 = VBA.CallByName(objet1, CStr(n), VbGet)
        Set objet3 = VBA.CallByName(objet2, "fields", VbGet)
        For i = 1 To 7
            Range("B" & i).Offset(0, n).Value = VBA.CallByName(objet3, Range("A" & i).Value, VbGet)
        Next

        ' traitement du json contenu dans timetable
        horaires = ""
        horaires = VBA.CallByName(objet3, "timetable", VbGet)
        If horaires <> "" Then
            Set horairesObj = ScriptEngine.Eval("(" & horaires & ")")
            For i = 8 To 14
                Set objet4 = VBA.CallByName(horairesObj, Range("A" & i).Value, VbGet)
                Range("B" & i).Offset(0, n).Value = VBA.CallByName(objet4, "ouverture", VbGet) & " - " & VBA.CallByName(objet4, "fermeture", VbGet)
            Next
            Set horairesObj = Nothing
        End If

    Next

End Sub

CAS OU LE JSON EST CONTENU DANS UN SCRIPT DE LA PAGE :

Sa lecture via un outil comme firefox n'est pas possible. On peut utiliser cet outil et captant le json par le biais d'un traitement du texte-source de la page, exemple :

https://www.seloger.com/prix-de-l-immo/vente/provence-alpes-cote-d-azur/alpes-maritimes/nice/60088.htm
depuis = "data: "
jusque = "poisRue"":null}"
JsonString = Split(Split(.responsetext, depuis)(1), jusque)(0) & jusque
Set JsonObject = ScriptEngine.Eval("(" + CStr(JsonString) + ")")

Dans le cas présent, les données étaient aussi accessibles via des tables :

C'est toujours aussi passionnant.

C'est plus qu'un topo ! C'est un tuto très pédagogique .

Je suppose qu'il y a encore d'autres épisodes à venir.

Je les attends avec impatience même si tout n'est pas encore intégré.

Grand merci Steelson !

Je suppose qu'il y a encore d'autres épisodes à venir.

oui ... pour le moment je me suis mis à développer le chapitre json en aparté https://forum.excel-pratique.com/viewtopic.php?p=840029#p840029

Bonjour,

Pour clore le chapitre json ... une autre façon d'accéder à la donnée est d'écrire :

objet.sousobjet.soussousobjet.donnee

par exemple

data.records.0.fields

Toutefois,

  • certains mots sont réservés par excel et la casse en est modifiée comme fields, name, address condition etc.
  • cette syntaxe n'admet pas ds valeurs numériques ou des noms commençant par un chiffre
  • on ne peut pas non plus faire appel à des variables

Pour cela, on va faire appel à une fonction prototypée ou greffée à chaque élément du json :

        .AddCode "Object.prototype.element=function( i ) { return this[i] } ; "

et on pourra alors écrire :

data.records.element(0).element("fields")

exemple complet ci-dessous :

Sub lire()

    Dim ScriptEngine As Object
    Set ScriptEngine = CreateObject("ScriptControl")
    With ScriptEngine
        .Language = "JScript"
        ' nombre d'occurences
        .AddCode "function N(jsonObj){return jsonObj.length;} "
        ' pour les noms réservés par excel VBA, les valeurs numériques ou commençant par un chiffre
        .AddCode "Object.prototype.element=function( i ) { return this[i] } ; "
    End With

    Sheets("lecture").Select
    Range("A1").CurrentRegion.Offset(0, 1).ClearContents

    Dim data As Object
    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", [www], False
        .send
        Set data = ScriptEngine.Eval("(" + CStr(.responsetext) + ")")
    End With

    On Error Resume Next ' absence d'un élément
    For i = 0 To ScriptEngine.Run("N", data.records) - 1
        With data.records.element(i).element("fields")     ' fields étant un nom réservé
            Range("B1").Offset(0, i) = .city
            Range("B2").Offset(0, i) = .element("name")    ' name étant un nom réservé
            Range("B3").Offset(0, i) = .element("address") ' address étant un nom réservé
            Range("B4").Offset(0, i) = .price_gazole
            Range("B5").Offset(0, i) = .price_sp95
            Range("B6").Offset(0, i) = .price_sp98
            Range("B7").Offset(0, i) = .price_e10
            With ScriptEngine.Eval("(" + CStr(.timetable) + ")")
                Range("B8").Offset(0, i) = .Lundi.ouverture & " - " & .Lundi.fermeture
                Range("B9").Offset(0, i) = .Mardi.ouverture & " - " & .Mardi.fermeture
                Range("B10").Offset(0, i) = .Mercredi.ouverture & " - " & .Mercredi.fermeture
                Range("B11").Offset(0, i) = .Jeudi.ouverture & " - " & .Jeudi.fermeture
                Range("B12").Offset(0, i) = .Vendredi.ouverture & " - " & .Vendredi.fermeture
                Range("B13").Offset(0, i) = .Samedi.ouverture & " - " & .Samedi.fermeture
                Range("B14").Offset(0, i) = .Dimanche.ouverture & " - " & .Dimanche.fermeture
            End With
        End With
    Next

End Sub

3- autre écueil : les sites demandent une authentification explicite (utilisateur et mot de passe) ou implicite (session, token/jeton)... on verra cela aussi par la suite en simulant un navigateur !

Nouveau chapitre ... le site demande une authentification ou connexion explicite. Cette authentification est stockée dans un cookie.

Excel ne gérant pas les cookies, il faut passer par un navigateur, de préférence firefox ou chrome qui admettent la commande view-source"

#If VBA7 Then
    Private Declare PtrSafe Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
        (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
#Else
    Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
        (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
#End If

Sub telecharger()
Dim nav As Long, MyData As DataObject
Set MyData = New DataObject
Dim page As New HTMLDocument, lien As Object, lig As Integer, url As String

url = "https://forum.excel-pratique.com/ucp.php?i=pm&folder=inbox"

    ' premier lancement d'un site quelconque afin d'ouvrir automatiquement le navigateur
    nav = ShellExecute(0, "open", "https://www.qwant.com/", 0, 0, 1)
    Application.Wait (Now + TimeValue("00:00:02"))
    ' code pour se mettre dans la barre d'adresse et pouvoir renseigner l'url
    SendKeys "%d"
    Application.Wait (Now + TimeValue("00:00:01"))
    ' écriture de view-source: suivi de l'url
    SendKeys "view-source:" & url
    SendKeys "{ENTER}"
    ' temps d'attente du chargement complet, dépend de la qualité de la connexion et de l'état du PC
    Application.Wait (Now + TimeValue("00:00:10"))
    ' envoi de Ctrl+a (tout sélectionner)
    SendKeys "^a"
    Application.Wait (Now + TimeValue("00:00:01"))
    ' envoi de Ctrl+c (copier)
    SendKeys "^c"
    Application.Wait (Now + TimeValue("00:00:01"))
    ' récupération du contenu du presse-papier
    MyData.GetFromClipboard
    txt = MyData.GetText(1)
    SendKeys "%{F4}"
    'Application.CutCopyMode = False

    page.body.innerHTML = txt
    lig = 1
    Cells.Clear
    For Each lien In page.getElementsByTagName("a")
        Cells(lig, 1) = lien.getAttribute("HREF")
        Cells(lig, 2) = lien.innerHTML
        lig = lig + 1
    Next lien

    MsgBox "Terminé !"

End Sub

A tester sur la boite de messages privés de ce site ... la réponse sera différente qu 'on se soit enregistré -en permanence- ou pas.

Cela reste une solution très pointue et dépend de pas mal de conditions et un réglage approprié des temporisations.

Attention aussi aux droits d'accès étant donné que l'internaute a signé une charte d'accès lors de son enregistrement !

Rechercher des sujets similaires à "recuperer tableau page web"