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érer des infos avec une requête et boucler sur plusieurs tables d'une page Internet


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Avril 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2015
    Messages : 6
    Points : 8
    Points
    8
    Par défaut Récupérer des infos avec une requête et boucler sur plusieurs tables d'une page Internet
    Bonjour,

    Tout d'abord merci d'avance à ceux qui passeront par là et qui pourront aider à démêler mon code. J'espère que le titre est clair (mais j'en doute...). Je vais essayer d'exposer au mieux mon problème (j'ai passé toute la journée dessus, en cherchant un peu partout mais je bloque):

    Suite à une première récupération de données qui a été traitée (grâce à l'aide précieuse de patricktoulon) dans la discussion suivante: ici , j'essaie maintenant de récupérer plusieurs tables sur une même page, et toujours via une requête car les infos ne sont pas "visibles" dans les tables.

    Pour que ça soit plus clair, voila la page test qui sert d'Url dans les codes ci-dessous: lien
    Je souhaite récupérer les 9 "grilles" de la page en bouclant donc sur chaque table dans le code que j'essaie de récupérer avec la requête.

    Pour récupérér la première table, on peut utiliser l'id "game_1910" dans le code suivant (merci patricktoulon ):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Set ReQ = CreateObject("microsoft.xmlhttp")
    ReQ.Open "POST", UrL, False
    ReQ.send
     
    Set fauxdoc = CreateObject("htmlfile")
    With fauxdoc
    .body.innerHTML = ReQ.responseText
    .write .getElementById("game_1910").outerHTML
     
    Set tablespan = .getElementsByTagName("SPAN")
     
    For Each element In tablespan
     
    etc. (les éléments que je récupère sont après les tag Span de la table: "score score ..."
    L'idée serait de récupérer toutes les tables, sans faire référence aux Id des tables. J'ai donc essayé de me "raccrocher" à un autre Id mais je n'arrive pas à descendre au niveau des tables. J'ai essayé avec l'Id "ajax_pagination" qui chapeaute l'ensemble des tables mais je n'arrive pas à descendre dans l'arborescence (j'ai cherché et j'ai lu cet article d'arkham46 mais je suis paumé):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Set ReQ = CreateObject("microsoft.xmlhttp")
    ReQ.Open "POST", UrL, False
    ReQ.send
     
    Set fauxdoc = CreateObject("htmlfile")
    With fauxdoc
    .body.innerHTML = ReQ.responseText
    .write .getElementById("ajax_pagination").outerHTML
     
    Set tablespan = .getElementsByTagName("SPAN")
     
    For Each element In tablespan
    J'ai aussi essayé avec la fonction getElementbyClassName (sans "s") sur "pronos_inside" qui est plus près de ma table:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Set ReQ = CreateObject("microsoft.xmlhttp")
    ReQ.Open "POST", UrL, False
    ReQ.send
     
    Set fauxdoc = CreateObject("htmlfile")
    With fauxdoc
    .body.innerHTML = ReQ.responseText
    .write .getElementByClassName("pronos_inside").outerHTML
     
    Set tablespan = .getElementsByTagName("SPAN")
     
    For Each element In tablespan
    Mais j'ai une erreur d'exécution 438 ("Propriété ou méthode non gérée par cet objet").

    D'ailleurs à la base j'avais pensé à récupérer tous les elements "prono_lf_inside" avec .getElementsByClassName("prono_lf_inside") et ensuite faire tourner une boucle "For Each element" mais comme en dessous j'ai déja une boucle "For Each element in tablespan" j'ai eu une erreur (car les 2 boucles "for each" imbriquées se référaient toutes les 2 à "element").

    Désolé pour le mon piètre niveau, j'essaie d'avancer pas à pas mais c'est comme si je marchais dans du sable mouvant

    Dans les infos à récupérer, il faudrait aussi que je puisse avoir le nom de chaque joueur (au dessus de chaque table) pour pouvoir identifier les résultats obtenus. Le nom se trouve dans les balise <a ref> au dessus de chaque table. J'ai essayé de trouver comment récupérer la donnée mais je bloque aussi là-dessus...

    Merci d'avance

  2. #2
    Membre éclairé
    Avatar de tamtam64
    Homme Profil pro
    stagiaire developpement vba
    Inscrit en
    Mai 2012
    Messages
    456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : stagiaire developpement vba
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2012
    Messages : 456
    Points : 658
    Points
    658
    Billets dans le blog
    17
    Par défaut courage
    Un conseil racourcis et generalise ton probleme car c'est long a lire , ce qui explique le peu de reponse , je pense, et je pense pas que tu sois si mauvais pour coder ca , car c'est pas mal du tt . Donc essaye juste de generaliser ton probleme en le ramenant a un cas simple et presente ca dans une question , je pense que tu aura plus de réponses . Par manque de temps je ne m'y penche pas ce soir mais , c'est quelque chose que j'ai fait en fevrier dernier , ou un probleme similaire , donc au pire contacte moi en mp, si je peux eventuellement te passer mon code entier , mais je ne maitrise pas trop , c'est un peu de la récuperation .

    bonne chance

  3. #3
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    bonjour neou

    tu ne fait que recopier le code que je t'ai fait
    tu n'a même pas analyser le code sinon tu aurais trouvé comment faire pour les autres tables ,c'est d'une simplicité
    on va pas tout faire a ta place quand même

  4. #4
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    Regarde cette capture d'ecran

    il est facile de faire un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for each element in .all'dans mon fauxdoc
    if element.tagname="table"
    if element.parentnode.classname="prono_lf_inside" then
    'et la tu décante de la même manière que je l'ai fait pour le 1 er 
    end if 
    end if 
    next
    Nom : Capture.JPG
Affichages : 694
Taille : 395,7 Ko

  5. #5
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut une autre version pour toute les tables
    re
    tiens regarde j'ai ajouté 4 lignes dans le 1 er code que je t'avais fait je dis bien 4 lignes c'est pour te dire la simplicité !!!!!
    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    'http://www.pronosoft.com/fr/concours/fiche-joueur/rocketman/loto-foot-15/pronos/date-jeu/page-2/
    'id=game_866
    Sub test()
        Columns("A:E").Clear
        Dim ReQ As Object, UrL As String
        UrL = "http://www.pronosoft.com/fr/concours/fiche-joueur/rocketman/loto-foot-15/pronos/date-jeu/page-2/"
        Set ReQ = CreateObject("microsoft.xmlhttp")
        ReQ.Open "POST", UrL, False
        ReQ.send
        'MsgBox ReQ.responsetext
        Set fauxdoc = CreateObject("htmlfile")
        With fauxdoc
            .body.innerhtml = ReQ.responsetext
            'voici les 4 lignes que j'a ajouté au code initial et c'est tout !!!!!!
            For Each elem In .all
                If elem.tagname = "TABLE" And Left(elem.ID, 4) = "game" Then texte = texte & elem.outerhtml & "<br>" & vbCrLf
            Next
            .write texte
                          '.write elem.getelementbyid("game_870").outerhtml    'ligne du code initial 
                    Set tablespan = .getelementsbytagname("SPAN")
                    For Each element In tablespan
                        element.Style.FontSize = 26
                        If element.classname Like "*score1" = True Then
                            'Debug.Print element.ParentNode.innerhtml
                            Set cel = element.ParentNode
                            cel.innerhtml = 1
                            cel.Style.FontSize = 26
                            cel.Style.Color = "red"
                            cel.Style.backgroundcolor = white
                            cel.Style.Border = 2 & " solid " & "red"
                            cel.Style.TextAlign = "center"
                        End If
                        If element.classname Like "*score2" = True Then
                            'Debug.Print element.ParentNode.innerhtml
                            Set cel = element.ParentNode
                            cel.innerhtml = 2
                            cel.Style.FontSize = 26
                            cel.Style.Color = "red"
                            cel.Style.backgroundcolor = white
                            cel.Style.Border = 2 & " solid " & "red"
                            cel.Style.TextAlign = "center"
                        End If
    
                        If element.classname Like "*_check_ok" = True Then
                            Set cel = element.ParentNode
                            cel.innerhtml = "X"
                            cel.Style.Color = "white"
                            cel.Style.backgroundcolor = "green"
                            cel.Style.Border = 1 & " solid " & "white"
                            cel.Style.TextAlign = "center"
                            cel.Style.FontSize = 26
                        End If
                        If element.classname Like "*scoreN" = True Then
                            Set cel = element.ParentNode
                            cel.innerhtml = "N"
                            cel.Style.Color = "red"
                            cel.Style.backgroundcolor = "white"
                            cel.Style.Border = 1 & " solid " & "red"
                            cel.Style.TextAlign = "center"
                            cel.Style.FontSize = 26
                        End If
                        If element.classname Like "*scoreN_ok" = True Then
                            Set cel = element.ParentNode
                            cel.innerhtml = "N"
                            cel.Style.Color = "white"
                            cel.Style.backgroundcolor = "red"
                            cel.Style.Border = 1 & " solid " & "white"
                            cel.Style.TextAlign = "center"
                            cel.Style.FontSize = 26
                        End If
                        If element.classname Like "*score2_ok" = True Then
                            Set cel = element.ParentNode
                            cel.innerhtml = "2"
                            cel.Style.Color = "white"
                            cel.Style.backgroundcolor = "red"
                            cel.Style.Border = 1 & " solid " & "white"
                            cel.Style.TextAlign = "center"
                            cel.Style.FontSize = 26
                        End If
                        If element.classname Like "*score2_check" = True Or element.classname Like "*scoreN_check" = True Or element.classname Like "*score1_check" = True Then
                            Set cel = element.ParentNode
                            cel.innerhtml = "X"
                            cel.Style.Color = "black"
                            cel.Style.backgroundcolor = "white"
                            cel.Style.Border = 1 & " solid " & "red"
                            cel.Style.TextAlign = "center"
                            cel.Style.FontSize = 26
                        End If
    
                    Next
                    faire = .ParentWindow.clipboardData.SetData("text", .body.innerhtml)
                    With Sheets(1)
                        Set cel = .Cells(Rows.Count, 1).End(xlUp).Offset(2, 0)
                        cel.Select
                        .Paste:
                    End With
                    faire = .ParentWindow.clipboardData.ClearData("text")
                    Debug.Print .body.innerhtml
                
            
        End With
    End Sub

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Avril 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2015
    Messages : 6
    Points : 8
    Points
    8
    Par défaut
    Merci beaucoup...

    Effectivement, ça parait limpide maintenant, je sais pas pourquoi je m’emmêlais dans des idées compliquées alors qu'il fallait faire simple (c'est ma première manip sur des pages web, je ne faisais que du traitement VBA dans des classeurs excel seuls jusqu'à maintenant, l'environnement html a dû me perturber par rapport à la simplicité d'une feuille excel...)

    Du coup, j'ai rajouté une ligne en plus pour récupérer le nom du joueur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    With fauxdoc
    .body.innerHTML = ReQ.responseText
     
        For Each elem In .all
            If elem.className = "infos_avatar" Then texte = texte & elem.Children(1).innerHTML
            If elem.tagName = "TABLE" And Left(elem.ID, 4) = "game" Then texte = texte & elem.outerHTML
        Next
            .write texte
    et ça tourne nickel, j'ai bien les 9 tables qui s'enchainent (avec le nom du joueur au dessus de chaque).
    (merci encore...)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/03/2014, 11h18
  2. [AC-2003] Requête sur plusieurs tables dans une seule liste
    Par tarnx dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 04/12/2009, 11h36
  3. [AC-2003] Traduction en VBA d'une requête Sélection SQL sur plusieurs tables
    Par Pucho Faritas dans le forum VBA Access
    Réponses: 9
    Dernier message: 29/10/2009, 10h32
  4. [A-00] recherche d'une critere sur 2 tables via une requête
    Par metallicavid dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 12/02/2009, 10h21
  5. Réponses: 1
    Dernier message: 06/12/2006, 18h25

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