Rapport de message :*
 

Re: import page web

Titre du sujet : Re: import page web
par myDearFriend! le 24/05/2010 23:20:35

Bonsoir gmh, le Forum,

Contrairement à l'exemple fourni précédemment, tu souhaites finalement récupérer l'ensemble des données de la page Web et non plus seulement les données d'entête  (et si tu nous disais tout la prochaine fois, ça ne serait pas plus simple ?)

Dans la nouvelle pièce jointe, j'ai donc repris la totalité de la procédure VBA et repars donc avec le code suivant :
Option Explicit
'---------------------------------------------------------------------------------------
' Auteur    : Didier FOURGEOT (myDearFriend!)  -  www.mdf-xlpages.com
' Date      : 24/05/2010
' Sujet     : Récup données Web PMU
'---------------------------------------------------------------------------------------
Sub Traitement()
Dim vURL As String
Dim D As String, NumCourse As String
    With Sheets("Accueil")
        D = .Range("E2").Text
        NumCourse = .Range("E4").Text
    End With
    'URL de départ
    vURL = "http://www.pmu.fr/pmu/servlet/pmu.web ... etaillesServlet?dd=" _
            & D & "&idc=" & NumCourse & "&np=1&ppd=0"
    'Traiter
    RecupChevaux vURL
End Sub

Sub RecupChevaux(ByVal vURL As String)
Dim IE As InternetExplorer
Dim O As Object, OI As Object, OIS As Object
Dim L As Long

    'Ouvre la page web dans IE de façon invisible
    Set IE = CreateObject("internetExplorer.Application")
    IE.Visible = False
    'RAZ de la feuille
    ActiveSheet.Cells.Delete
   
    Application.ScreenUpdating = False
    On Error Resume Next
    'Boucle sur l'ensemble des partants
    Do
        If vURL = "" Then
            'Bouton "Suivant" sur la page Web ?
            For Each OI In IE.Document.Links
                If OI.Title = "Suivant" Then
                    vURL = OI.href
                End If
            Next OI
        End If
        If vURL = "" Then Exit Do   'Sortir à la fin
        'Ouvrir la page Web
        IE.Navigate vURL
        Do Until IE.ReadyState = READYSTATE_COMPLETE
            DoEvents
        Loop
        'Détermine première ligne libre
        L = Cells(Rows.Count, 1).End(xlUp).Row + 3
        'Récup Nom du partant
        Set O = IE.Document.getElementsByTagName("H1")
        For Each OI In O
            L = L + 1
            With Cells(L, 1)
                .Value = OI.innerText
                .Font.Bold = True
                Application.StatusBar = .Value
            End With
        Next OI
        'Récup Détail du partant
        Set O = IE.Document.getElementsByTagName("P")
        For Each OI In O
            If OI.innerText <> " Retour à l'accueil de pmu.fr" Then
                Set OIS = OI.getElementsByTagName("span")
                L = L + 1
                With Cells(L, 1)
                    .Value = OIS.Item(0).innerText
                End With
                With Cells(L, 2)
                    .Value = OIS.Item(1).innerText
                End With
            End If
        Next OI
        RecupPlusDetails Cells(L + 2, 1), vURL
        vURL = ""
        If L > 150 Then Exit Do
    Loop
    Columns(1).AutoFit
    ActiveSheet.UsedRange.HorizontalAlignment = xlLeft
    Application.ScreenUpdating = True
    'Fermer IE
    IE.Quit
    Application.StatusBar = False
    MsgBox "Traitement terminé !  ", vbInformation + vbOKOnly, "myDearFriend!  -  www.mdf-xlpages.com"
End Sub

Sub RecupPlusDetails(R As Range, vURL As String)
    With ActiveSheet.QueryTables.Add(Connection:="URL;" & vURL, Destination:=R)
        .Name = "LaRequete"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = False
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .WebSelectionType = xlSpecifiedTables
        .WebTables = "1"
        .WebFormatting = xlWebFormattingAll
        .WebPreFormattedTextToColumns = True
        .WebConsecutiveDelimitersAsOne = True
        .WebSingleBlockTextImport = False
        .WebDisableDateRecognition = False
        .WebDisableRedirections = False
        .Refresh BackgroundQuery:=False
        .Delete
    End With
End Sub
Evidemment, le traitement devient forcément plus long et il te faudra patienter quelques minutes pour obtenir le résultat escompté (chez moi, environ 3 minutes pour récupérer les données des 17 chevaux de la course donnée en exemple).

Par ailleurs, pour des raisons évidentes de test, j'ai dû supprimer la formule que tu avais mis en cellule E2 de ta feuille "Accueil".

En espérant que ça te convienne.

Cordialement,