Rapport de message :*
 

Re: procédure pour récupérer données web

Titre du sujet : Re: procédure pour récupérer données web
par myDearFriend! le 08/05/2010 15:21:47

Bonjour bassatine, le Forum,

Tu dis avoir des connaissances informatiques très limitées aussi je doute qu'en te donnant simplement quelques indications (aussi opérationnelles soient-elles), tu puisses te débrouiller... Ou alors, tu es un génie qui s'ignore

Je vais donc essayer de te mettre sur la voie et peut-être te donner envie d'approfondir le sujet car tu verras, Excel et VBA ça peut être passionnant aussi...

Dans la pièce jointe, tu trouveras donc peut-être une réponse à ta demande.
Après avoir ouvert le classeur en activant les macros, tu cliques sur le bouton "Mise à jour" et tu patientes quelques secondes...

Bien sûr, on peut faire plus court et on peut certainement faire plus rapide, mais j'ai préféré privilégier la solution la plus abordable pour toi il m'a semblé.

Tout d'abord, l'outil de base pour développer avec VBA dans Excel, s'appelle l'"enregistreur de macro" (pour plus d'infos et faire connaissance avec cet outil, je te conseille la consultation de CE LIEN).
En utilisant donc l'enregistreur de macro, je suis parti de ta procédure manuelle et l'ai suivie comme tu le fais. A terme, j'ai obtenu le code VBA suivant :
Sub Macro1()
'
' Macro1 Macro
' Macro enregistrée le 07/05/2010 par myDearFriend!
'

'
    With ActiveSheet.QueryTables.Add(Connection:= _
        "URL;http://www2.france-galop.com/fgweb/Do ... m=297&statut=DP" _
        , Destination:=Range("A1"))
        .Name = _
        "cheval_perf.aspx?navigationChevaux=true&idcheval=03153823&aaCrse=2010&cSp=P&numCrsePgm=297&statut=DP_2"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .WebSelectionType = xlEntirePage
        .WebFormatting = xlWebFormattingAll
        .WebPreFormattedTextToColumns = True
        .WebConsecutiveDelimitersAsOne = True
        .WebSingleBlockTextImport = False
        .WebDisableDateRecognition = False
        .WebDisableRedirections = False
        .Refresh BackgroundQuery:=False
    End With
End Sub
Evidemment, au premier abord et sans connaissance particulière, ce n'est pas très causant... Mais si l'anglais ne te rebute pas trop, tu obtiens ainsi déjà une bonne approche de ce qu'est une requête Web sur Excel et tu peux même t'amuser à en modifier quelques propriétés pour en analyser les effets. Pour rappel aussi : une fois le curseur de l'éditeur VBA positionné sur un mot, tu appuies sur la touche F1 et tu obtiens l'aide correspondante... C'est in-dis-pen-sa-ble !

Je suis donc parti de ce code extrait de l'enregistreur et j'ai ensuite "brodé" un peu avec mes connaissances VBA (je ne suis pas un spécialiste Requête Web cela dit !). Par ailleurs, pour ce type de procédure, il convient aussi d'avoir quelques notions HTML : en premier lieu, j'ai décortiqué un peu le code HTML de ta page web pour repérer les seules balises "Table" sur lesquelles m'intéresser. C'est de là par exemple que j'en tire les noms comme "ctl00$cphContenuCentral$navigation_cheval$ddlChevaux" qui peuvent paraitre un peu barbare à première vue... Mais c'est tout bonnement le nom qu'a choisi le concepteur de cette page Web.

Dans le classeur joint, j'ai utilisé le code complet ci-après :
Option Explicit
'myDearFriend!  -  www.mdf-xlpages.com

Sub Traitement()
Dim vURL As String
    'URL de départ (à adapter au besoin)
    vURL = "http://www2.france-galop.com/fgweb/Do ... m=297&statut=DP"
    RecupChevaux vURL
End Sub

Sub RecupChevaux(vURL As String)
Dim IE As InternetExplorer
Dim sel As HTMLSelectElement
Dim TabChevaux() As String
Dim L As Long
Dim i As Byte

'OBJECTIF : Récupérer les éléments de la liste déroulante chevaux (n° de Ref du cheval + Nom du cheval) dans un tableau String
   
    Application.ScreenUpdating = False
    'on ouvre la page web dans IE de façon invisible
    Set IE = CreateObject("internetExplorer.Application")
    IE.Visible = False
    IE.Navigate vURL
    Do Until IE.ReadyState = READYSTATE_COMPLETE
        DoEvents
    Loop
    'On stocke les éléments (N° + Nom) dans le tableau de type String redimensionné
    Set sel = IE.Document.getElementById("ctl00$cphContenuCentral$navigation_cheval$ddlChevaux")
    For i = 0 To sel.Length - 1
        ReDim Preserve TabChevaux(1 To 2, 1 To i + 1)
        TabChevaux(1, i + 1) = sel(i).Value
        TabChevaux(2, i + 1) = sel(i).getAdjacentText("afterBegin")
    Next i
    'On ferme IE (devenu inutile)
    IE.Quit
    Application.ScreenUpdating = True
   
'OBJECTIF : On récupère les tableaux Carrière de chaque cheval de la liste dans l'onglet Résultats
    With Sheets("www.mdf-xlpages.com")
        'On efface d'abord les anciennes données de l'onglet Résultats
        .Cells.Delete
       
        Application.ScreenUpdating = False
        'On boucle sur la liste de chevaux stockée pour récupérer les données souhaitées
        For i = 1 To UBound(TabChevaux, 2)
            'Trouver la prochaine ligne libre de l'onglet Résultats
            L = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
            'On inscrit le Nom du cheval
            .Cells(L + 2, 1).Value = TabChevaux(2, i)
            'On récupère le tableau de carrière (par requête Web)
            RecupCarriere .Cells(L + 4, 1), TabChevaux(1, i)
        Next i
        Application.ScreenUpdating = True
    End With
    MsgBox "Traitement terminé !  ", vbInformation + vbOKOnly, "myDearFriend!  -  www.mdf-xlpages.com"
End Sub

Sub RecupCarriere(R As Range, Ncheval As String)
Dim vURL As String
    vURL = "http://www2.france-galop.com/fgweb/Do ... =true&idcheval="
    vURL = vURL & Ncheval
    vURL = vURL & "&aaCrse=2010&cSp=P&numCrsePgm=297&statut=DP"
    With R.Parent.QueryTables.Add(Connection:= _
        "URL;" & vURL, Destination:=R)
        .Name = "MaRequete"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .WebSelectionType = xlSpecifiedTables
        .WebTables = "ctl00_cphContenuCentral_gvCarriere"   'ici, on cible uniquement la table souhaitée
        .WebFormatting = xlWebFormattingAll
        .WebPreFormattedTextToColumns = True
        .WebConsecutiveDelimitersAsOne = True
        .WebSingleBlockTextImport = False
        .WebDisableDateRecognition = False
        .WebDisableRedirections = False
        .Refresh BackgroundQuery:=False
        .Delete
    End With
End Sub

Je ne vais pas pouvoir t'expliquer en détail toute ma démarche, mais tu trouveras en couleur verte des commentaires que j'ai laissé pour que tu puisses te situer un peu dans ce code.

En espérant t'avoir un peu dépanné...

Cordialement,