Suite à mon précédent code, comme le site fonctionne avec seulement deux paramètres - les adresses -
voici des démonstrations pour une fonction à paramètres variables (l'astuce consistant à faire correspondre
la variable tableau des paramètres avec celle des éléments de la page web) extrayant le temps de trajet,
la Demo1 affichant par exemple "31 min" et la Demo2 récupérant uniquement la valeur numérique :
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
| Sub Demo1()
MsgBox TempsRATP("15 Av. des Champs-Élysées 75008 Paris", _
"69 Boulevard de la Villette 75010 Paris", "7", "25", "25/11/2014")
End Sub
Sub Demo2()
[C2].Value = Val(TempsRATP([A2].Value, [B2].Value))
End Sub
Function TempsRATP$(ParamArray PA())
If UBound(PA) < 1 Then TempsRATP = "Erreur!": Exit Function
AR = Array("start", "end", "time_hour", "time_minute", "date")
With CreateObject("InternetExplorer.Application")
.Navigate "http://www.ratp.fr/itineraires/fr/ratp/recherche-avancee"
While .Busy Or .ReadyState < 4: DoEvents: Wend
With .Document
With .all
For N% = 0 To Application.Min(UBound(AR), UBound(PA))
.Item("itineraire_" & AR(N)).Value = PA(N)
Next
.action_submit.Click
End With
While .ReadyState <> "complete": DoEvents: Wend
TempsRATP = .getElementsByTagName("DL")(0).all(4).innerText
End With
.Quit
End With
End Function |
Ce code est la résultante du tutoriel et de l'analyse de la page web via son code et l'outil d'inspection
de tout navigateur Web (F12), en visualisant le contenu d'une variable pointant sur la collection des éléments "DL",
la donnée se trouvant dans le premier élément de cette collection dans son cinquième sous-élément … (ligne n°29)
Or, en observant l'adresse de la page du résultat de la recherche, il est inutile de procéder ainsi ‼
Et oui car dans cette adresse il y a les paramètres de la recherche :
inutile donc de passer par la première page afin d'y renseigner les paramètres,
autant appeler directement la page résultat, gagnant ainsi deux bonnes secondes de traitement !
Voici donc une nouvelle fonction nécessitant seulement quatre paramètres : les deux premiers - les adresses - sont obligatoires
puis suivent la date et l'heure, respect de l'ordre dans l'adresse de la page résultat …
Mais tous les paramètres étant obligatoires dans cette adresse, le code se charge de fournir si besoin la date et l'heure :
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
| Sub Demo1()
MsgBox TempsRATP("15 Av. des Champs-Élysées 75008 Paris", _
"69 Boulevard de la Villette 75010 Paris", "25/11/2014", "7:25")
End Sub
Sub Demo2()
[C2].Value = Val(TempsRATP([A2].Value, [B2].Value))
End Sub
Function TempsRATP$(ParamArray AR())
Dim PA()
If UBound(AR) < 1 Then TempsRATP = "Erreur!": Exit Function
PA = AR: If UBound(PA) < 3 Then ReDim Preserve PA(3)
If Not IsDate(PA(3)) Then PA(3) = "8:0"
If IsDate(PA(2)) Then PA(2) = Format$(Application.Max(Date, CDate(PA(2))), "yyyy-mm-dd") _
Else PA(2) = Format$(Date, "yyyy-mm-dd")
With CreateObject("InternetExplorer.Application")
.Navigate "http://www.ratp.fr/itineraires/fr/ratp/resultat-detaille/start/" & _
Replace(Application.Trim(PA(0)), " ", "+") & "/end/" & _
Replace(Application.Trim(PA(1)), " ", "+") & "/is_date_start/1/date/" & _
PA(2) & "/time/" & PA(3) & "/route_type/plus_rapide"
While .Busy Or .ReadyState < 4: DoEvents: Wend
TempsRATP = .Document.getElementsByTagName("DL")(0).all(4).innerText
.Quit
End With
End Function |
Piloter Internet Explorer est la méthode la plus lente mais parfois il n'y a pas d'autre possibilité …
Un peu plus rapide est la fonctionnalité de feuille de calculs Nouvelle requête sur le Web
aussi programmable en VBA - QueryTable - enfin, quand la page web s'y prête …
Plus rapide encore est d'utiliser une bibliothèque externe de requêtes
(WinHttp ou Xml, il y a un tutoriel mais un peu ardu pour un débutant)
au minimum trois fois plus véloce comparé au pilotage d'Internet Explorer,
c'est cette méthode employée dans cette nouvelle ébauche de la fonction mais, s'agissant de récupérer uniquement
une donnée, ne pas s'embêter avec des fonctions web, l'extraire directement du code source de la page (ligne n°34) :
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
| Sub Demo1()
MsgBox TempsRATP("15 Av. des Champs-Elysees 75008 Paris", _
"69 Boulevard de la Villette 75010 Paris", "25/11/2014", "7:25")
End Sub
Sub Demo2()
[C2].Value = TempsRATP([A2].Value, [B2].Value)
End Sub
Function TempsRATP(ParamArray AR())
Dim PA()
If UBound(AR) < 1 Then TempsRATP = "Erreur 1!": Exit Function
PA = AR: If UBound(PA) < 3 Then ReDim Preserve PA(3)
If Not IsDate(PA(3)) Then PA(3) = "8:0"
If IsDate(PA(2)) Then PA(2) = Format$(Application.Max(Date, CDate(PA(2))), "yyyy-mm-dd") _
Else PA(2) = Format$(Date, "yyyy-mm-dd")
URL$ = "http://www.ratp.fr/itineraires/fr/ratp/resultat-detaille/start/" & _
Replace(Application.Trim(PA(0)), " ", "+") & "/end/" & _
Replace(Application.Trim(PA(1)), " ", "+") & "/is_date_start/1/date/" & _
PA(2) & "/time/" & PA(3) & "/route_type/plus_rapide"
With CreateObject("Microsoft.XMLHTTP")
.Open "GET", URL, False
.setRequestHeader "DNT", "1"
On Error Resume Next
.send
On Error GoTo 0
If .Status = 200 Then
SP = Split(.responseText, "Le plus rapide : ")
If UBound(SP) = 1 Then TempsRATP = Val(SP(1)) Else TempsRATP = "Erreur 2!"
Erase SP
Else
TempsRATP = "Erreur " & .Status & " " & .statusText & " !"
End If
End With
End Function |
Je l'ai qualifiée
d'ébauche car les fins lecteurs auront remarqué dans la
Demo1 la disparition des caractères accentués …
Contrairement à Internet Explorer dans lequel les caractères accentués passent comme une lettre à la Poste !
Je m'adresse à Patrick, à Stéphane (l'auteur de l'
Excelentissime tutoriel) s'il passe par bonheur ici
et aux autres chevronnés de l'utilisation d'une bibliothèque de requêtes :
que ce soit avec la méthode
GET ou avec la
POST, j'ai essayé divers paramètres via
setRequestHeader
tant au niveau de
Accept,
accept-charset et particulièrement
Content-Type …
Sinon en dehors de supprimer les caractères accentués, je crois bien avoir aperçu une fonction convertissant
les accents d'une adresse URL (comme l'adresse de la page résultat de la recherche en manuel)
mais là je ne l'ai pas sous le coude …
Dernier point : lorqu'il est nécessaire d'enchaîner les requêtes pour intégrer chaque résultat dans une cellule d'une feuille,
il y a une variante permettant encore de réduire le temps de traitement en suivant alors
la fameuse chanson de John Lennon, Let It Be !
♫ Voir donc
cette contribution …
Lors de ma première mise en place de cette variante, un processus par
QueryTable nécessitant presque dix minutes
(n'en demandait que cinq sur un autre ordinateur dans un autre lieu) est passé sous la barre des trente secondes ‼
_________________________________________________________________________________________________
Le savoir est la seule matière qui s'accroit quand on la partage. (Socrate)
Partager