IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Récupération de données HTML


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Mai 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Mai 2016
    Messages : 4
    Par défaut Récupération de données HTML
    Bonjour à tous,

    J'aimerais vous exposé un problème que je rencontre depuis ce matin et malgré tous mes efforts pour trouver une solution sur les différents forum et tuto que j'ai pu voir le problème reste entier.

    Mon souci est pourtant simple.
    Je souhaite récupérer une valeur d'une page HTML dont voici l'extrait :

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <form name="select_marche" method="get" action="/cours.phtml">
    	<table class="info-valeur list">
    		<tr>
    			<td class="label">
    				<b>Cours</b>
    				Euronext Paris			</td>
    			<td>
    				<small   class="tooltip icon icon-real-time" title="Donn&eacute;es temps r&eacute;el" id="b24bb9126" ></small>				
    <b><span id="brs-sl5727478e7c7d0"><span class="cotation">54.35  EUR</span></span></b>
    			</td>
    		</tr>

    La valeur que je souhaite récupérer est "54.35".

    Voici pour l'instant le code que j'ai testé pour parvenir à la récupérer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    Sub macro4()
     
    Dim IEDoc As HTMLDocument
    Dim InputboursoramaZoneTexte As HTMLInputElement
    Dim FormboursoramaCherche  As DispHTMLElementCollection
    Dim htmlProfil As HTMLGenericElement
    Dim Cotation As HTMLSpanElement
    Dim Generic As HTMLGenericElement
    Dim IE As New InternetExplorer
    Dim Valeur_Cours As Double
    Dim T As Double
    Dim htmlTagCol As IHTMLElementCollection
    Dim theElementCollection As HTMLElementCollection
    Dim curElement As IHTMLElement
    Dim HtmlElement As HTMLGenericElement
     
    Derniere_ligne_Config_Entreprise = Worksheets("Configuration").Range("A" & Rows.Count).End(xlUp).Row
    Ligne_en_cours_config = 3
    Colonne_en_cours = 4
    Ligne_en_cours_DATA = 3
    Colonne_en_cours_DATA = 2
    Colonne_en_cours_TIME = 1
     
            Nom_Entreprise_En_Cours = Sheets("Configuration").Cells(Ligne_en_cours_config, 2)
            Adresse_Site_En_Cours = Sheets("Configuration").Cells(Ligne_en_cours_config, 3)
     
            Set IE = CreateObject("internetexplorer.application")
     
            'Chargement d'une page Web
     
            IE.Navigate Adresse_Site_En_Cours
     
            'On attend le chargement complet de la page
     
            Do
            DoEvents
            Loop Until IE.readyState = READYSTATE_COMPLETE And Not IE.Busy
     
            'Création du document
     
            Set IEDoc = IE.document
     
            T = Timer
     
            Set element = IEDoc.getElementsByTagName("cotation")
     
            'Manque de code...
     
     
     
     
        Sheets("Configuration").Range("B6") = Application.Round((Timer - T), 1)
     
    End Sub
    Le but était d'identifié la valeur grâce au nom de la span class : "cotation"
    Mais malheureusement il ne le trouve jamais.

    De plus, les identifiants de ce chiffre change à chaque rafraîchissement de page, je parle de b24bb9126 et brs-sl5727478e7c7d0.
    Peux-être ce n'est donc pas possible ?

    Merci d'avance au(x) personne(s) qui prendront la peine de m'aider.

    Bonne journée.

  2. #2
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 432
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 432
    Par défaut
    getElementsByTagName ou getElementsByClassName ?

    Voir aussi http://qwazerty.developpez.com/tutor...-et-vba-excel/

    Cdt

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Mai 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Mai 2016
    Messages : 4
    Par défaut
    J'ai testé ces deux fonctions mais lorsque que je les utilise elles finissent "vide"
    Pour le tutoriel je l'ai suivi mais ca ne m'a pas vraiment aidé pour ce problème.

  4. #4
    Membre Expert
    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 718
    Par défaut
    Bonjour,

    Une solution alternative consiste à parcourir le fichier en mode texte:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    Public Function ReadFileToBuffer(ByVal szFileName As String) As String 'tmp
        Dim f As Integer
        Dim Buffer As String
     
        ' Ouverture du fichier en 'Binary'
        f = FreeFile
     
        On Error GoTo errorHandler
        Open szFileName For Binary As #f
        On Error GoTo 0
     
        ' préallocation d'un buffer à la taille du fichier
        Buffer = VBA.Space$(LOF(f))
        ' lecture complète du fichier
        Get #f, , Buffer
        Close #f
        ReadFileToBuffer = Buffer
        Debug.Print szFileName
        Exit Function
     
    errorHandler:
        On Error GoTo 0
        'err.Clear
        Debug.Print szFileName
        Err.Raise 10001, , "Fichier '" & szFileName & "' introuvable."
    End Function
     
     
    Sub ExtraireCotation()
        Dim txt As String
        Dim reg
        Dim maCotation As Double
     
        txt = ReadFileToBuffer("D:\exemple.html")
     
        Set reg = CreateObject("VBSrript.RegExp")
     
        reg.Pattern = "\<span class=\""cotation\""\> *(\d+\.\d+)"
     
        If Not reg.test(txt) Then Err.Raise 10001, , "Aucun résultat"
     
        maCotation = VBA.Val(reg.Execute(txt)(0).submatches(0))
     
        Debug.Print maCotation
    End Sub
    S'il y avait plusieurs cotations à récupérer, il suffirait de passer reg.Global à True avant l'Execute et de boucler sur les éléments de reg.Execute(txt) en récupérant à chaque fois leur élément SubMatches(0).

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Mai 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Mai 2016
    Messages : 4
    Par défaut
    Merci beaucoup pour votre réponse je n'avais pas du tout penser à ce genre d'option.
    Au préalable il me faut donc télécharger ma page en .html et j'ai trouver plusieurs code sur internet (plutôt vieux) mais ceux-ci ne fonctionnent pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    Private Declare PtrSafe 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
     
    Sub EnregFichierWebII()
    Dim Chemin$, URL$, retVal&
     ' Ne pas oublier d'adapter URL
    URL = "http://www.google.fr"
     
    Chemin = "C:\TestSVGWebFile.html" 'nom du fichier saisi en dur
     
    retVal = URLDownloadToFile(0, URL, Chemin, 0, 0)
     
    MsgBox IIf(retVal = 0, _
        "Le fichier téléchargé se nomme: " & _
        Chemin & " et se trouve dans C:\", _
        "Erreur")
    End Sub
    la variable retVal me retourne une valeur -2XXXXXXXXXXXX.
    J'ai regardé sur internet mais tous les exemples de l'utilisation de URLDownloadToFile que j'ai trouvé utilise les attributs comme dans mon exemple.

    Je suis encore une fois un peu perdu du coup :S

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Mai 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Mai 2016
    Messages : 4
    Par défaut
    Désolé du double post.
    Après quelques recherches supplémentaire j'ai réussi avec une macro relativement différente et en passant par IE.

    Je continu donc pour parser cette fois le fichier .html

    Merci beaucoup !

    EDIT :

    J'ai continuer et je bloque bêtement sur l'erreur suivante :
    "Erreur d'exécution '429':
    Un composant ActiveX ne peut pas créer d'objet"

    j'ai regardé sur plusieurs site mais les librairies qu'il faut activer n'ont pas résolu mon problème et j'ai activer également dans les sécurités des macros toutes les ActiveX.

    Quelqu'un saurait-il d'où ca pourrait venir ?

    Bonne aprèm

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo