macro vba pour recuperer du texte sur un site internet
bonjour,
Je souhaiterais automatiser le fait de récupérer des donnés depuis le site abc bourse.
j'ai fait une macro qui parcourt ma feuille excel et pour chaque code ISIN va sur le site https://www.abcbourse.com/
je trouve la zone de recherche je copie le code isin, je fait la recherche et j'arrive sur la page de la société en question.
Jusque la je m'en suis sortie plutôt bien.
Par contre pour trouver les info dont j'ai besoin j'ai du mal. le code affiche des erreurs qui ne sont pas tout le temps les même alors que je ne fait pas de modif. Ca ne fonctionne pas et je ne comprends pas pourquoi.
voila le premier module qui fonctionne :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| Global WsValo As Worksheet
Sub Macro1()
'1 Selection du l'onglet a traiter
Set WsValo = ThisWorkbook.Worksheets("valo")
'3 creation du range ListeIsin
Dim RgListeIsin As Range
With WsValo
.Range("B1").Value = 10
Set RgListeIsin = .Range(.Cells(1, 1), .Cells(.Cells(Rows.Count, 1).End(xlUp).Row, 1))
End With
'4 On pracourt le tableau et on va sur le net pour chaque ligne.
Dim cellule As Range
For Each cellule In RgListeIsin
Internet cellule
Next cellule
End Sub |
et le module qui ne fonctionne pas completement
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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
| Dim IE As New InternetExplorer
Dim IEDoc As HTMLDocument
Sub Internet(RgIsin As Range)
'Chargement de la page page Web ABC bourse
SiteUrl "https://www.abcbourse.com/"
'On lance la recherche du code isin dans la barre de recherche
RechercheNet "txtAutoComplete", "btnAC", RgIsin.Value
'On recherche les valeurs
Dim collec As HTMLDivElement
Set collec = IEDoc.body.all("dis03")
WsValo.Range("f8").Value = collec.innerText
'On libère les variables
Set IE = Nothing
Set IEDoc = Nothing
End Sub
Sub WaitIE(IE As InternetExplorer)
Do While Not IE.readyState = READYSTATE_COMPLETE
DoEvents
Loop
End Sub
Sub WaitDoc(doc As HTMLDocument)
Do While Not doc.readyState = "complete"
DoEvents
Loop
End Sub
Sub SiteUrl(url As String)
'Chargement de la page web
IE.navigate url
'Affichage de la fenêtre IE
IE.Visible = True
'On attend le chargement complet de la page
WaitIE IE
'On pointe le membre Document
Set IEDoc = IE.document
End Sub
Sub RechercheNet(IdZone As String, IdBouton As String, Isin As String)
Dim ZoneRecherche As HTMLInputElement
Dim BoutonRecherche As HTMLInputButtonElement
'On pointe la zone de recherche
Set ZoneRecherche = IEDoc.all(IdZone)
'On entre le code isin
ZoneRecherche.Value = Isin
'On pointe le bouton ok
Set BoutonRecherche = IEDoc.all(IdBouton)
'On click sur le bouton ok
BoutonRecherche.Click
'On attend le chargement complet de la page
WaitIE IE
'On pointe le membre Document
Set IEDoc = IE.document
End Sub |
Tout fonctionne jusqu'a la partie 'On recherche les valeurs. la je n'y comprends plus rien.
la variable collec affiche nothing.
merci de votre aide.
De l'observation naît la solution …
C'est un problème de synchro, le code pointant sur un élément inexistant / pas encore chargé, bref la charrue avant les bœufs !
A l'ouverture initiale, il faut attendre tant que Busy (est à True) et ReadyState < 4 (propriétés d'IE).
Pour la mise à jour d'une page, après un click ou une validation par exemple,
il faut attendre tant que ReadyState - du Document - est différent de "complete".
C'est la base mais cela ne suffit pas avec certains sites faisant appels à des requêtes indépendantes
venant alimenter la page après le feu vert des ReadyState !
Et même parfois selon la version de Windows et d'IE le ReadyState peut rester bloqué à 3 !
Dans ces cas, il suffit juste d'observer le fonctionnement de la page
afin de pouvoir détecter par code la présence d'un élément particulier via la fonction IsObject par exemple …
Voir les discussions de ce forum sur le site abcbourse, je me souviens d'une discussion initiée fin mai 2016 s'étant étirée jusqu'à fin août !