bonjour marc
la je comprends plus rien
que dis tu (changement de page)?????
l'url reste la meme
même en direct sur IECode:url = "http://www.developpez.net/forums/subscription.php"
c'est plutôt une réécriture du moins je crois
Version imprimable
bonjour marc
la je comprends plus rien
que dis tu (changement de page)?????
l'url reste la meme
même en direct sur IECode:url = "http://www.developpez.net/forums/subscription.php"
c'est plutôt une réécriture du moins je crois
Après la validation du login, la page affichée change par deux fois même si pourtant l'URL reste la même.
En traçant le titre du document comme la propriété LocalName d'IE …
Re marc
donc si je veux arriver a mes fins il faudrait pouvoir boucler sur le localname apres le login c'est ca
est ce possible d'ailleurs ????
je vais voir comment je peut faire merci du tuyaux ;)
J'en suis certain et c'est plus simple que cette contribution !
Deux voies possibles : soit attendre le titre de la page finale (juste de la comparaison de chaines de caractères),
soit décompter le nombre de changement de titres …
c'est bon entre temps j'ai trouver
la encore une fois on joue sur la modification ou la présence d'un élément
j'ai bloque la ligne sleep on en a plus besoins
j'ai laisser le IE visible a true pour que tu vois bien que le message arrive même avant la fermeture de IE
c'est pour te dire
en vbs je le ferait plus tard en vba
hihihihi ca marche trop bienCode:
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 Dim url, Ie, Iedoc ,tablo url = "http://www.developpez.net/forums/subscription.php" set oldtab=createobject("scripting.dictionary") Set Ie = CreateObject("internetexplorer.application") Ie.Visible = true Ie.navigate url Do: Loop Until Ie.readystate = 4 Set Iedoc = Ie.document 'On Error resume next for each elem in iedoc.all if elem.id="vb_login_username"then login=true next if login=true then Set user = Iedoc.getelementbyid("vb_login_username") Set pass = Iedoc.getelementbyid("vb_login_password") user.Value = "identifiant" pass.Value = "motdepasse" Set bout = Iedoc.getelementsbyclassname("button") bout(0).Click end if err.clear Do: :Loop Until Ie.readystate = 4 pret=false do lgtb=Iedoc.getelementbyid("threadlist") if lgtb="[object HTMLDivElement]" then pret = true loop until pret=true 'wscript.sleep 1000 code=Iedoc.getelementbyid("threadlist").outerhtml Ie.quit set Fpage=createobject("htmlfile") with Fpage .write code set tabtitre=.getelementsbytagname("h3")'titre de la question 'j'ai fait juste un msgbox pour la première question mais tout est dans la variable code donc dans le 'body.innerhtml de Fpage msgbox tabtitre(1).innertext ' ici je referais ma décantation end with
Oui bien !
Dans le meilleur du monde Web : le site ne rame pas, n'a pas d'erreur de base de données
et n'est pas en maintenance, pas d'erreur de login, etc …
Même souci en utilisant locationName de manière simpliste :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 Sub DemoDVPlocationNameSimple() Const TITRE$ = "Abonnements - Forum du club des développeurs et IT Pro" With CreateObject("InternetExplorer.Application") .Navigate "http://www.developpez.net/forums/subscription.php" While .Busy Or .ReadyState < 4: DoEvents: Wend .Visible = True With .Document.forms(1) If .ID = "navbar_loginform" Then .all(3).Value = "Identifiant" .all(4).Value = "Mot de passe" .submit End If End With While .locationName <> TITRE: DoEvents: Wend ' suite du traitement ici End With End Sub
En regardant ton code, pas besoin de variable pour l'attente, exemple en remplaçant ma ligne n°17 par celle-ci :
While IsNull(.Document.getElementByID("threads")): DoEvents: Wend …
Et alors la ligne n°2 déclarant la constante TITRE devient inutile …
En testant ton code en VBA puis en procédant à une modification, j'ai de nouveau eu droit à l'erreur 70 :
j'ai remplacé .getElementByID par .all et cela ne le fait pas du tout !
Chacun de nos codes se retrouvera avec une boucle sans fin en cas de souci du site …
Via la voie du décompte du nombre de changement de titre et sans gestion d'erreur,
il est possible de bien faire face à d'éventuels soucis.
Bonjour marc
je suis en pause pour le repas mais après le boulot je regarde ca
il est beau le code en tout cas plus propre que le mien :D
Merci Patrick !
Partir d'une page blanche à parfois des avantages !
Comme affirmé depuis le post #60, l'idée est simple et, en respectant la règle TBTO,
le code - pas forcément beau (les goûts et les couleurs !) - en est naturellement simplifié …
Re
entre 2003 et 2007 il doit y avoir de sacrées différences de bibliothèque
parce que justement avant de faire une ligne de code je comprenais pas pourquoi le changement de page était pas cohérent chez moi (pour le localname)
et toi tu trouve les éléments dans un form hors chez moi c'était dans un div j'ai pourtant remonté le parentnode jusque au body et il n'y avais pas de form
enfin je teste ca en rentrant avec vbs 64 et vba office 2007 32 bits
pour le moment je digère
édit. je l'avais fait comme ca comme je te l'avais dit
pour la table de "treadlist" et chez moi ca gêneraitCitation:
While IsNull
une erreur "utilisation non autorisé de la valeur null etc....."
comme quoi 2003 et 2007
edit encore une fois
il y a aussi le test sur le login
chez toi par le navbar.... chez moi par le vb,...... le navbar chez moi étant toujours présent dans le outerhtml même après entrer
Je crois bien l'avoir pourtant déjà testé dimanche sur la version 2007 d'Excel,
je vais de nouveau regarder ce soir notamment pour la fonction VBA IsNull et les éléments threads & threadlist …
localName n'est pas interne à Excel mais bien à Internet Explorer !
Mais là aussi, peu importe la version d'IE (tests sous v9, v10 et v11) …
Quant à l'élément "navbar_loginform", dans la page du login c'est le deuxième élément de la collection forms du Document
mais pas dans la page des abonnements !
Une alternative est si IE.locationName (ou IE.Document.title) ne correspond pas à la page des abonnements,c'est donc la page du login (dans le meilleur du monde Web !) :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 Sub DemoDVPlocationNameSimpleAlternative() Const TITRE$ = "Abonnements - Forum du club des développeurs et IT Pro" With CreateObject("InternetExplorer.Application") .Navigate "http://www.developpez.net/forums/subscription.php" While .Busy Or .ReadyState < 4: DoEvents: Wend .Visible = True If .locationName <> TITRE Then With .Document.forms("navbar_loginform") .all(3).Value = "Identifiant" .all(4).Value = "Mot de passe" .submit End With While .locationName <> TITRE: DoEvents: Wend End If ' suite du traitement ici End With End Sub
Ou encore en modifiant la ligne n°9 ainsi : If .locationName = "Forum du club des développeurs et IT Pro" Then …
Il m'est déjà arrivé de remplacer le fameux WaitIE du tutoriel par un test sur locationName,
bien pratique lors du chargement d'une page intermédiaire avant la page finale (redirection) …
Bonjour,
Eh bien vous foncez...
Désolé je suis trés en retard sur vous...surtout que je viens de voir que vous avez mis des commentaires sur la version euronextallequities...
En effet la page nasdaq n'est pas stable mais en le sachant et en pointant correctement avec une correction en amont cela ne provoque pas d'erreur...
Marc tu m'indiques de mettre un Doevents au cas ou, il faut le mettre comme cela?
Do While oTAll.Length <> 0: DoEvents: Loop
Pour ton post 42 je regarde cela attentivement...au plus vite...et aussi poste sous peu la version nasdaq avec le gif comme repére(je l'ai retrouvée)...tu verras hormis des set et toi des . c'est la même chose (enfin je crois) sauf que tu seras surement un peu plus rapide avec les points...
Mais si tu bloques le chargement aprés le onchange sur le gif(nous) ou dans la boucle(toi) cela doit revenir au même...
Au plaisir
itwoo, on ne fonce pas vraiment, on est légèrement hors sujet depuis le post #48 en attendant ton retour sur le post #42 ! :mrgreen:
Du reste ce hors sujet aurait mérité une contribution à lui seul …
Pour DoEvents, oui comme la ligne n°14 du post #23 …
Rappel : afin d'éviter les smileys indésirables à l'affichage,
cocher la case « Désactiver les smileys dans le message » dans l'éditeur du post …
Quant à la table, cela marche mais VBA ne supporte pas les fote d'ortografe !
Car tableadata n'est pas l'objet déclaré tabledata ‼ Pourtant clair est le message d'erreur, tu aurais dû le voir !
C'est normal quelque part de trouver une ressemblance s'agissant de récupérer les mêmes données !
Et comme une contribution doit pouvoir servir à d'autres et croisant plus de pages web sans repère …
Marc merci j'ai corrigé le message...
re
bonjour itwoo t'é a la traine:ptdr::ptdr:
non je plaisante ...effectivement comme dit marc on est un peu hors sujet la
Marc ne te gène pas pour en faire une autre (contrib)
surtout que tu utilise une "const" donc peut être générique
je viens de tester ca fonctionne effectivement en vbs 64
je viens de constater aussi que en utilisant les "navbar" au lieu des vb bar ca va plus vite avec le test sur le location
par contre avec le test sur le "treadlist" les vb sont plus rapide
je n'est pas regardé dans l'inspecteur(F12 mon ami) mais a mon avis il doit y avoir 2 .JS ou argument différemment obtenu
bon allez marc une contrib!!!...une contrib!!....
en parlant de itwoo tu crois que ca vaudrait le coup de lui faire un Euronext all equities version 2 avec IE dans les vbs juste pour voir:mouarf:
Pour itwoo je n'en sais rien car franchement je ne me suis pas penché sur EuroNext
mais à partir du moment qu'il dispose d'une solution bien plus véloce via une bibliothèque de requêtes,
il ne doit pas trop en avoir besoin … Mais ne te gêne pas Patrick !
Cette contribution était juste pour répondre à la problématique à l'origine de sa discussion,
savoir comment contrôler la mise à jour d'un élément d'une page Web par le pilotage d'Internet Explorer …
Et cela pourrait être utile à d'autres !
Pour ton exemple de la page des abonnements de ce site, j'ai évoqué le décompte du nombre de changement du titre
afin d'éviter des surprises, mais ce n'est pas vraiment utile ici car comme l'identification est en dur dans le code
il y a peu de chance qu'elle échoue … Toutefois, je préfère blinder en utilisant getElementsByName
renvoyant une collection même si il n'y a pas d'élément, sa propriété length est à zéro alors …
Si le site est à l'Ouest, peu de chance de plantage ainsi :Code:
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 Sub DemoDVPlocationNameAlternative() Const TITRE$ = "Abonnements - Forum du club des développeurs et IT Pro" With CreateObject("InternetExplorer.Application") .Navigate "http://www.developpez.net/forums/subscription.php" While .Busy Or .ReadyState < 4: DoEvents: Wend .Visible = True With .Document.getElementsByName("navbar_loginform") If .Length = 1 Then With .Item(0) .all(3).Value = "Identifiant" .all(4).Value = "Mot de passe" .submit: CT% = 1 End With End If End With If CT Then While .locationName <> TITRE: DoEvents: Wend With .Document.getElementsByName("threadlist") OK% = .Length = 1 If OK Then With .Item(0) ' suite du traitement ici End With End If End With If Not OK Then .Quit: Beep End With End Sub
re
d'accords Marc la gestion du site a l'ouest par "le length =1 "en plus je prend !!!!!
on pourrait même ajouter a ce niveau un "TIME OUT " pourquoi pas ?en cas ou l'ouest changerait de coté :D
pour Nasdaq il en a une aussi avec xmlhttp 3 seconde pour 10 ans en une seule requête, c'est pour ca que je comprenais pas ses demandes avec IE et la gestion d'attenteCitation:
Pour itwoo je n'en sais rien car franchement je ne me suis pas penché sur EuroNext
mais à partir du moment qu'il dispose d'une solution bien plus véloce via une bibliothèque de requêtes,
de toute façon ca n'a jamais fait de mal a personne d'apprendre
tenez marc et itwoo Une piqure de rappel
voila pourquoi je dis que quand je comprends pas ....je comprends pas :mouarf::mouarf:Code:
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 Sub nasdaq() faire_ceci_ou_cela = colle_moi_ca_dans_le_sheet("http://www.nasdaq.com/symbol/f/historical", "10y", Cells(1, 1)) End Sub Function getsource(url, argmts) With CreateObject("microsoft.xmlhttp") .Open "POST", url, False 'entete de la requette obligatoire pour ce site(ne fonctionne pas sans ) .setRequestHeader "Accept", "*/*" .setRequestHeader "Content-Type", "application/json" .setRequestHeader "X-Requested-With", "XMLHttpRequest" .setRequestHeader "Referer", "http://www.nasdaq.com/symbol/f/historical" .setRequestHeader "Accept-Language", "fr-FR" .setRequestHeader "Accept-Encoding", "gzip, deflate" .setRequestHeader "User-Agent", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)" .setRequestHeader "Host", "www.nasdaq.com" .setRequestHeader "Content-Length", "11" .setRequestHeader "DNT", "1" .setRequestHeader "Connection", "Keep - Alive" .setRequestHeader "Cache-Control", "no-cache" .send argmts & "|false|F" getsource = .responsetext End With End Function Function colle_moi_ca_dans_le_sheet(url, argmts, cel) With CreateObject("htmlfile") .body.innerhtml = getsource(url, argmts) faire = .ParentWindow.clipboardData.SetData("text", .getelementsbytagname("table")(0).outerhtml) With Sheets(1): cel.Select: .Paste: End With Selection.HorizontalAlignment = xlLeft faire = .ParentWindow.clipboardData.ClearData("text") End With End Function
vaccin:
AVEC INTERNET EXPLORER
1°tu ouvre ta page Nasdaq
2° tu ouvre mon ami F12
3° tu clique sur "démarrer la capture"
4° TU REVIENS SUR INTERNET EXPLORER ET tu clique sur la combo et tu choisi la durée
5° tu attend c'est normal c'est Nasdaq:mouarf:
5° une fois que c'est venu tu reprend la fenêtre de mon ami F12
6° tu clique arrêter la capture
7° tu te retrouve avec une seule ligne
8° tu clique vue détaillée
9° tu clique sur corps de la demande
10° tu copie ca d'en un coin( se sera l'argument du send de la requête)
11° tu clique sur entête de la demande
12° tu copie tout a partir de "accept"
13° tu remplace les triple espace de ce que tu viens de copier par (",")et un guillemet de chaque coté de la phrase complète et tu met devant ".setRequestHeader"dans le cas ou la requête est dans un block "with/end with"si ca n'est pas les cas la variable représentant la requeté devant le point
14° regarde le résultat dans la piqure de rappel
moi personnellement j'aime pas les piqures mais si sa peut aider
|EDIT]
CONCERNANT abbv L'ARGUMENT POUR LE SEND C'EST "10y|false|ABBV"la aussi l'entête est obligatoire
J'entendais par site à l'Ouest quand il affiche erreur base de données ou est en maintenance.
Mais effectivement lorsqu'il rame à l'ouverture, cela peut se gérer via un Timeout juste après le Navigate du genre du post #18 …
Ton code via requête ressemble à mes essais, un en passant par le Presse-papiers puis conversion des données
et l'autre via une variable tableau …
Bonjour,
Marc pendant que je regarde tes posts+ tests voici en attendant l'ancien code pour nasdaq:
c'est vrai qu'il manque:
un timeout éventuel sur la boucle de vérification du gif (si le site est long) non corrigé
aussi pointage sur la table(3) qui parfois devient 4 ou autre...mais cela a été corrigé version suivante
Pour info plus testé cela depuis un moment(et surtout pas pendant longtemps) car utilisation de la requête...mais normalement cette version marche sans faille.
La condition est positionnée aprés le onchange (pour éviter tout probléme, il n'y a pas continuation tant que block n'est pas passé)...et non sur la table comme toi mais sinon ca me semble équivalent...donc ici blocage des problémes éventuels au départ
ici ce sont des set et non des .
Code:
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 Sub DemoNASDAQie() Const URL$ = "http://www.nasdaq.com/symbol/abbv/historical" 'Const URL$ = "http://www.nasdaq.com/symbol/f/historical" Const TXT$ = " Import en cours " Application.StatusBar = TXT & " " Dim table Set IE = CreateObject("InternetExplorer.Application") IE.Navigate URL While IE.Busy Or IE.readyState < 4: DoEvents: Wend IE.Visible = True Set IEDoc = IE.Document If InStr(IEDoc.body.innerHTML, URL) Then Set htmlSelectElem = IEDoc.all("ddlTimeFrame") htmlSelectElem.Value = "10y" IEDoc.all("ddlTimeFrame").onchange End If Set pret = IEDoc.getElementById("ajaxloader") Do: DoEvents: Loop While LCase(pret.Style.display) = "block" Set htmlTagCol = IEDoc.getElementsByTagName("table") Set tabledata = htmlTagCol.Item(3) 'va choisir la table n°4 (celle des données) T0$ = tabledata.outerHTML IE.Quit ... end sub