Là ce site de la RATP est vraiment le cas d'école standard :
• Attente de la fin de l'ouverture de la page initiale via WaitIE IE …
• Attente de la fin de la mise à jour de la page tant que IEDoc.readyState <> "complete" …
Là ce site de la RATP est vraiment le cas d'école standard :
• Attente de la fin de l'ouverture de la page initiale via WaitIE IE …
• Attente de la fin de la mise à jour de la page tant que IEDoc.readyState <> "complete" …
Sinon, pas rien à voir, mais bon...
J'avance dans la lecture de mon ouvrage VBA mais ça ne donne pas non plus toutes les solutions !
Pour coller le résultat la requête, le code est
Code : Sélectionner tout - Visualiser dans une fenêtre à part Feuil1.Cells(iElement, "C").Value = Trim(ElemGen.Children(iElement).innerText)
sauf que moi, je souhaiterais faire une boucle. Donc plusieurs questions.
Est ce que je fais une boucle du style "Je déclare ma boucle dans une nouvelle variable "Boucle_RATP" et j'appelle ma variable "PremierIE"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 Sub boucle_for() For i = 1 To 300 '300 en exemple 'Sub PremierIE Next End Sub
J'ai essayé d'adapter le code vu sur un post :
Sachant que, je sais, ce ne sont pas des URL dans ma colonne, mais le ".End(xlUp).Row" et le "For i = 1 to derli" m"intéressait.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 Sub lien() derli = Cells(65000, 1).End(xlUp).Row On Error Resume Next For i = 1 To derli navurl = Cells(i, 1).Hyperlinks(1).Address Cells(i, 5) = navurl Next i End Sub
Mais à bloque.
Après, le souci, c'est que je ne peux pas la faire (la boucle) car deux choses me bloquent :
Aller chercher la valeur "adresse d'origine" dans ma colonne A
Aller chercher la valeur "adresse destination" dans ma colonne B, sur la même ligne que l'adresse d'origine
Là, j'ai essayé des codes avec .Offset (0,0), par rapport à ma cellule active qui serait en A2 par exemple mais non...
Code : Sélectionner tout - Visualiser dans une fenêtre à part InputRatpOrigineZoneTexte.Value = ActiveCell(2, 1)
pareil pour la destination...
Ensuite
Après, j'ai essayé des codes avec également .Offset (0,1), même ligne, une colonne à droite de la "B" (destination)", les ActiveCells... mais ça ne passe pas !
Code : Sélectionner tout - Visualiser dans une fenêtre à part Feuil1.Cells(iElement, "C").Value = Trim(ElemGen.Children(iElement).innerText)
Bref, j'ai des prémices mais rien ne passe car dans la rudesse de sieur Code, toute erreur est sanctionnée négativement aussi sec ! ça passe pas !
Salut
Dans ces cas la, j'utilise souvent le for each.
Voila un exemple de ce qui peut-être fait (je n'ai rien testé)
++
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 Sub XMLReq_RATP_Boucle() 'Cette sub va interroger le serveur 'Il faut activer la bibliothèque Microsoft WinHTTP Service et M$ MSXML Dim DemandeFichier As MSXML2.XMLHTTP, URL As String Dim IEDoc As New HTMLDocument Dim FSys As Object, MonFic Dim texte As String Dim ElemGen As HTMLGenericElement Dim TheCell As Range 'On bloque la mise à jour de l'écran 'Application.ScreenUpdating = False 'On boucle sur les cellules de la colonne A With Feuil1 For Each TheCell In .Range("A2", .Cells(.Rows.Count, "A").End(xlUp)) 'On définie l'URL 'URL = "http://www.ratp.fr/itineraires/fr/ratp/resultat-detaille/start/15+Av.+des+Champs-%C3%89lys%C3%A9es+75008+Paris/end/69+Boulevard+de+la+Villette+75010+Paris/is_date_start/1/date/2014-11-25/time/07%3A25%3A00/route_type/plus_rapide" 'On va chercher les adresses et infos qui constitues l'URL, départ dans la colonne A, arrivée dans la colonne B, date en colonne C, .... URL = encodeURL("http://www.ratp.fr/itineraires/fr/ratp/resultat-detaille/start/" & TheCell.Value & "/end/" & TheCell.Offset(0, 1).Value & "/is_date_start/1/date/" & TheCell.Offset(0, 2).Value) '&.... 'On instancie Set DemandeFichier = CreateObject("Microsoft.XMLHTTP") 'On génère la requête DemandeFichier.Open "POST", URL, False DemandeFichier.setRequestHeader "Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" DemandeFichier.setRequestHeader "Accept-Encoding", "gzip , deflate" DemandeFichier.setRequestHeader "Content-Type", "text/html; charset=utf-8" 'DemandeFichier.setRequestHeader "Content-Length", "240" DemandeFichier.setRequestHeader "Cache-Control", " no-store, no-cache, must-revalidate, post-check=0, pre-check=0" DemandeFichier.setRequestHeader "Accept-Language", "fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3" DemandeFichier.setRequestHeader "Connection", "keep-alive" DemandeFichier.setRequestHeader "Host", "www.ratp.fr" DemandeFichier.setRequestHeader "Pragma", "no-cache" 'Ajouté DemandeFichier.setRequestHeader "Referer", URL DemandeFichier.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.0; rv:29.0) Gecko/20100101 Firefox/29.0" 'On envoie la requete DemandeFichier.send 'On place la page web reçu en retour dans un document web IEDoc.body.innerHTML = DemandeFichier.responseText 'On recherche l'élément contenant la liste DL DT Set ElemGen = IEDoc.getElementsByClassName("box switch-details")(0) 'Ensuite tu retrouves le même code pour aller chercher tes éléments dans la page que te retourne le serveur 'La partie demande est bien plus rapide ainsi. '.... 'On place l'info recherchée dans la 11ème colonne TheCell.Offset(0, 10).Value = Trim(ElemGen.Children(3).innerText) '... Next End With End Sub
Qwaz
Qwazerty...
MERCI !
C'est enfin le résultat que je voulais !
Au début, ça ne fonctionnait pas car
"URL = encodeURL" était à remplacer par "URL = URLEncode"
mais ça, j'ai mis 5 minutes à le trouver (voire un peu plus...)
Et après, ça bloquait au niveau du
Code : Sélectionner tout - Visualiser dans une fenêtre à part DemandeFichier.Open "POST", URL, False
J'ai d'abord cru que c'était le code qui déconnait, j'ai essayé "GET" à la place de "POST", false > True....
Mais en mettant un espion sur URL (après l'avoir suvolé avec ma souris), j'ai vu que l'URL générée n'était pas bonne.
Bref, pour coller à la base RATP, j'ai complété la ligne encodeURL avec les données des heures ...
et j'ai agit sur le Sub URLEncode, en y ajoutant des caractères et en indiquant ce qu'il fallait remplacer
Je me suis aidé du site suivant
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 Public Function URLEncode( _ StringVal As String, _ Optional SpaceAsPlus As Boolean = False _ ) As String Dim StringLen As Long: StringLen = Len(StringVal) If StringLen > 0 Then ReDim result(StringLen) As String Dim i As Long, CharCode As Integer Dim Char As String, Space As String If SpaceAsPlus Then Space = "+" Else Space = "%20" For i = 1 To StringLen Char = Mid$(StringVal, i, 1) CharCode = Asc(Char) Select Case CharCode Case 97 To 122, 65 To 90, 48 To 57, 45, 46, 47, 58, 95, 126 '47 et 58 ajouté result(i) = Char Case 32 'ajouté result(i) = "+" Case 0 To 15 result(i) = "%0" & Hex(CharCode) Case 233 'ajouté result(i) = "%C3%A9" Case Else result(i) = "%" & Hex(CharCode) End Select Next i URLEncode = Join(result, "") End If End Function
http://www.gtwiki.org/mwiki/?title=VB_Chr_Values
Bref, un très très très grand merci à tous et particulièrement à Qwazerty
Là ça tourne.
Je vais essayer de progresser en VBA et pourquoi pas essayer de faire passer la boucle quand il ne trouve pas, à la requête suivante.
Dans tous les cas, un grand merci !
Je croyais les adresses en majuscules comme affirmé dans le post #13 !
Franchement tu as galéré malgré la présence d'un code déjà opérationnel de conversion dans le post #16, purée ‼
Je n'ai pas menti
Dans mon cas, le fichier contenait uniquement des majuscules... demain, cela se présentera peut-être différemment.
Je traite le code que j'arrive à comprendre (à minima). Marc-L, tu écris du code qui est très performant mais dont je ne comprends pas grand chose.
Le but pour moi est de comprendre ce que j'écris et ce que j'exécute. Il ne suffit pas de faire un copier/coller du code post#16 pour que ça fonctionne.
Mon but est de le faire sur le site des transports de paris et pourquoi pas sur d'autres moteur de recherche, d'où ma nécessité de comprendre le code !
Donc, oui, effectivement, j'ai galéré mais je comprends le pourquoi du comment plutôt que d'appliquer une procédure dont je ne comprends quasiment rien.
Lorsque j'appréhenderais mieux le VBA, je pourrais reconsidérer tes propositions.
Je te remercie néanmoins pour tout car à lire tes propositions de code, ça sent l'optimisation maximale
yuck,
tu tu joins un classeur en .xlsx (sans macro) avec quelques parcours à calculer
et le résultat affiché pour les deux premiers (question de présentation car mes perches sont restées sans réponse …),
je pourrais te proposer une ultime procédure à étudier les longues soirées d'hiver au coin du feu !
_________________________________________________________________________________________________
Si déboguer est l’art de corriger les bogues, alors programmer est l’art d’en faire !
Hello
Je mets le fichier, sans macro.
Le "truc" c'est que j'ai mis les dates et l'heure de départ au format texte, afin qu'il inverse l'année-mois-jour et qu'il affiche les secondes.... nécessaires à la requête.
Je suis preneur d'une ultime procédure
Là, je vais me concentrer sur les erreurs et leur gestion car le code s'arrête quand le moteur de la RATP ne trouve pas.
Il faut d'abord que je commence par dire de lire les données sur la cellule active (la ligne en gros) et qu'il déplace la cellule active au fil du temps et qu'il reprenne, en cas de blocage, à la ligne d'en dessous, sauf s'il est vide.
Voilà
Concernant les dates, pas de souci avec des cellules au format date ou texte en français "jj/mm/aaaa";
idem pour des heures sans les secondes comme dans les codes 2 & 3 du post #8 …
Pour « quand le moteur de la RATP ne trouve pas » c'est normalement déjà géré dans ces codes
mais je suis preneur d'un couple d'adresses provoquant ce cas afin de pouvoir tester.
Avec un bloc contigu d'adresses, la propriété CurrentRegion combinée à une boucle sont idéales …
Je vais regarder les codes des post #8
Sinon, pour une adresse qui bloque "en direction de ou depuis"
36, RUE CLOVIS JACQUIERTS, 51000, CHALON-EN-CHAMPAGNE
Le site indique : "Adresse d’arrivée inconnue, veuillez reformuler votre demande."
Mais il ne génère pas d'URL car il bloque la création de ladite URL qui ne donnerait rien.
Normal, la RATP ne va pas jusqu'à cette ville
Après, il y a des origine-destination qui ont des résultats à 6H du matin mais pas à 8H
Par exemple :
4, RUE DES GOBELINS, 78790, MONTCHAUVET > 75, AVENUE DES CHAMPS-ELYSEES, 75008, PARIS
Là message d'erreur, pour la requête de 8H "Aucun trajet ne correspond à votre recherche."
En fait, il a des services tôt le matin, mais plus après
Voilà
bonjour
serait il possible d'avoir une liste de départ/ arrivée la plus complète possible?
je te le demande parce que je ne l'ai pas trouver sur le site
POST#30, il y a un fichier avec 3 exemples
Ils sont complets avec
ORIGINE
DESTINATION
DATE DE DEPART
HEURE DE DEPART
TEMPS DE PARCOURS (résultat de la requête)
si c'est bien de ça dont tu parles.
il y a que 3 depart/arrivée
je suis pas sur que ca le soit ?
bonjour
comme mon pseudo l'indique je suis de Toulon
alors paris pour moi c'est loin
je ne connais pas les rues etc......
J'ai un résultat de mon côté à 8h00 : 2 h 10 min …
Sinon en intégrant tes deux adresses supplémentaires plus celles du début en minuscules,
cela fait une base de six parcours à calculer, suffisante dans un premier temps …
Patrick, ne sachant pas la quantité réelle de parcours à calculer et la volonté de _yuck_ de comprendre les codes VBA,
merci de ne pas proposer une voie avec des abeilles ou des noisettes, laissons-le d'abord digérer !
Tu souhaiterais plus de "couple" Origine-Destination ? c'est bien ça ?
je partais du principe que si ça fonctionne...ça fonctionne
Si tu le souhaites, je peux en ajouter
re
t'inquiet Marc les abeille je les gardes pour la fin
non j'ai parcouru le post et Stéphane a proposer l'utilisation d'une requête
j'ai un peu remanier son code et ca pourrait fonctionner
par contre il faut le lieu de départ et la destination
dans son exemple il y en a que 3 alors c'est vite fait 8 seconde chez moi pour 3 requête en boucle vba( pas les abeilles )
pour les noisettes je travaille encore pour faire une version stable
yuck: oui c'est ca je veux plus de couple de lieu (départ/destination )
Oui, c'est vrai, sauf si tu changes de date... si tu passes au 26/11/2014, un mercredi, y a pas.
Bref, ce n'est peut-être pas le meilleur exemple du monde, mais ça existe.
La quantité réelle va jusqu'à 500 OD sur des créneaux horaires allant de 6h00 à 9h00. reste à définir le pas. Si l'on prend un trajet toutes les 1/2 heures
Cela fait 500 * 7 = 3500 requêtes.
J'ai "généré" des adresses, souvent que des codes postaux mais ça passe aussi. Cela permet de tester 2000 OD.
A noter que j'ai triplé mon code afin d'avoir les résultats pour 6h00, 7h00 et 8h00. Mais là, pas besoin.
Par contre, je l'avais évoqué mais j'ai un souci entre la version du code qui fonctionne parfaitement chez moi et qui plante sur mon pc de boulot.
De la sorte que je ne peux pas tester vos propositions sur mon pc de travail
PC Home : Vista 32 bits , Office 2010 32 bits
PC travail: W7 64 bits, Office 2013 64 bits
Y a-t-il une solution ?
et oui encore le même problème
les version de Windows et IE
c'est pour cela que je verrais mieux des requêtes plutôt que IE l'object(Microsoft.xmlhttp)n'ayant pratiquement rien changé depuis XP
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager