Comment récupérer un texte sur une page Web sans ID et sans nom
Pourriez vous m'aider à récupérer une information sur une page web en VBA ?
Le numéro de série sur lequel je fait une recherche est : H5M9KW2
Pour le moment j'arrive à entrer sur la page web et simulé un clic à l'aide du code suivant :
Dim IE As InternetExplorer
Set IE = CreateObject("InternetExplorer.Application")
Dim IEDoc As HTMLDocument
Dim numserie As Object
IE.Visible = True
IE.navigate "le lien"
Call WaitIE(IE)
Set IEDoc = IE.document
Set numserie = IEDoc.getElementsByName("entry-main-input-home")
numserie.Item.Value = Sheets(8).Cells(57, 3).Value
'Traitement du bouton dans div
Dim Generic As HTMLGenericElement
Set Generic = IEDoc.all("btn-entry-select")
Generic.ClickMais maintenant je souhaite récupérer la date de fin de garantie ( j'ai essayé getelementbyclass,getelementbyID.... sans succès).
exemple du code sur lequel je souhaite extraire le innerTEXT :
( Je débute VBA)
<br>Bonjour,
La manipulation d'Internet Explorer est toujours délicate alors il faut prendre cet essai comme une aide à la compréhension du mécanisme :
Sub Navig()
Dim IE As InternetExplorer, t()
Set IE = CreateObject("InternetExplorer.Application")
Dim IEDoc As HTMLDocument
Dim numserie As Object
IE.Visible = True
IE.navigate "le lien"
Call WaitIE(IE)
Set IEDoc = IE.document
Set numserie = IEDoc.getElementsByName("entry-main-input-home")
numserie.Item.Value = Sheets(8).Cells(57, 3).Value
'Traitement du bouton dans div
Dim Generic As HTMLGenericElement
Set Generic = IEDoc.all("btn-entry-select")
Generic.Click
WaitIE IE
set IEDoc = IE.document 'nouvelle page après clic
set htmlcoll = iedoc.getelementsbyclassname("warrantyExpiringLabel mb-0 mr-3") 'affectation de la collection des éléments identifiés par la classe "warranty..."
for each elem in htmlcoll 'pour chaque élément de la collection d'éléments obtenue
if elem.innertext like "Date d'expiration*" then 'si innertext de l'élément contient "Date..."
n = n + 1: redim preserve t(1 to n) 'incrémentation n et dimension tableau
t(n) = elem.innertext 'l'item n du tableau recoit innertext
end if
next elem
msgbox join(t, vblf)
end subD'ailleurs, je crois qu'il existe des solutions plus simples, pour ce que vous cherchez à faire, avec PowerQuery notamment mais je n'en suis pas certain.
Cdlt,
Bonjour 3GB,
d'abord merci pour le temps que tu m'a consacré ( grâce à ta proposition j'ai appris ce qu'est Redim Preserve ( un tableau de données)).
Malheureusement, il ne récupère toujours pas le texte demandé, d'après le mode débogage la procédure ne rentre pas dans le IF:
If elem.innerText Like "Date d'expiration*" Then 'si innertext de l'élément contient "Date..."
n = n + 1: ReDim Preserve t(1 To n) 'incrémentation n et dimension tableau
t(n) = elem.innerText 'l'item n du tableau recoit innertext
End IfElle fait 3 fois IF et End if puis me retourne une messagebox vide.
Cela voudrais t'il dire que le innertext recherché n'ai pas du HTML ?
Je me renseigne sur PowerQuery, n'hésitez pas à me proposer toutes autres solutions et me faire parvenir vos lumières.
Merci.
Bonjour,
C'est résolu 3GB :).
Grand merci.
Je me suis acharné sur du innertext mais grâce à l'espion VBA, j'ai constaté que c'était un outerText.
Du coup j'ai juste remplacé Innertext par outertext dans le code et voila.
il ne me reste plus qu'a creuser pour trouver pourquoi tu as mis
Dim IE As InternetExplorer, t()Je sais que T() c'est un tableau,
Mais pourquoi il est a coté de la variable IE et pourquoi il n'y a pas de As quelque chose derrière. Je vais faire mes recherches merci encore.
Salut Mistyk972,
Super, je suis content que ça marche !
En effet, le t() correspond à un tableau dynamique. C'est un type de variable qui peut contenir plusieurs éléments.
Pourquoi le tableau cependant ? Parce que je ne savais rien de la page et il aurait été possible d'avoir plusieurs correspondances avec "Date d'expiration...". Donc, je me suis dit qu'en faisant le plus, on pourrait plus facilement faire le moins.
Donc si le tableau ne contient qu'un élément, nul besoin d'un tableau, une variable de type string suffit :
Sub Navig()
Dim IE As InternetExplorer, sExpir as string
Set IE = CreateObject("InternetExplorer.Application")
Dim IEDoc As HTMLDocument
Dim numserie As Object
IE.Visible = True
IE.navigate "le lien"
Call WaitIE(IE)
Set IEDoc = IE.document
Set numserie = IEDoc.getElementsByName("entry-main-input-home")
numserie.Item.Value = Sheets(8).Cells(57, 3).Value
'Traitement du bouton dans div
Dim Generic As HTMLGenericElement
Set Generic = IEDoc.all("btn-entry-select")
Generic.Click
WaitIE IE
set IEDoc = IE.document 'nouvelle page après clic
set htmlcoll = iedoc.getelementsbyclassname("warrantyExpiringLabel mb-0 mr-3") 'affectation de la collection des éléments identifiés par la classe "warranty..."
for each elem in htmlcoll 'pour chaque élément de la collection d'éléments obtenue
if elem.outertext like "Date d'expiration*" then 'si outertext de l'élément contient "Date..."
sExpir = elem.outertext 'sExpir vaut outertext
exit for 'sortie anticipée de la boucle (qui n'aurait pas été adaptée avec des correspondances multiples)
end if
next elem
msgbox sExpir
end subEt on peut déclarer plusieurs variables à la suite :
dim o as object, r1 as range, r2 as range, s as string, ...Mais il faut bien mettre le type, sinon la variable est de type variant (il n'y a pas de factorisation du typage). Donc comme tu l'as compris, t() est un tableau de type variant. On aurait pu mettre t() as string pour un tableau contenant des chaines de caractères.
J'espère que ces détails pourront t'aider.
Bon courage pour la suite de ta navigation IE, c'est vraiment du boulot !
Cdlt,