Sélectionner un Element d'un menu déroulant avec valeur
Bonjour,
En tant que débutant et malgré les nombreuses consultations sur les forums, je ne peux pas résoudre un problème : sélectionner un élément en fonction de sa valeur sur VBA.
En tant normal, il faut cliquer sur le bouton "--Select--" pour afficher les éléments du menu déroulant (London, Paris, Madrid) et cliquez ensuite sur l'un de ces pays pour que le site charge la page du pays en question (Fonction Countryredirect).
J'ai essayé différentes manipulations comme IE.document.getElementById ou tagname ou encore all mais sans succès. Je sais aussi que je dois utiliser FireEvent pour l'élément "onchange". Si vous pouvez m'éclairer sur le sujet. Merci.
Voici le début de mon code VBA
Private Sub Country()
Dim IE As New InternetExplorer
Dim IEDoc As HTMLDocument
URL = "xxxxxxx"
IE.navigate URL
Do Until IE.ReadyState = 4
DoEvents
Loop
IE.Visible = True
Call IE.Document.getElementById("uname").setAttribute("value", "user")
Call IE.Document.getElementById("pass").setAttribute("value", "password")
Call IE.Document.getElementById("btn").Click
Do Until IE.ReadyState = 4
DoEvents
Loop
'C'est ici que je dois sélectionner mon pays.
End Sub
Ci dessous vous trouverez le code source de la page WEB.
<form name="form1" method="post" action="">
<div class="mdx-div-qwup mdx-gen-d2c7gwdanimation">Select your country:</div>
<div class="">
<select class="mdx-div-1y6e selectlist" id="countryselect" name="countryselect" onChange="countryRedirect(this.value);" >
<option id="countrySelect" selected="selected">--Select--</option>
<option value= London >- London</option>
<option value= Paris >- Paris</option>
<option value= Madrid >- Madrid</option>
</select>Je vous mets aussi la fonction pour mieux comprendre le code.
function makeSelect(value) {
var selectedVal = document.getElementById("countrySelect");
selectedVal.value = value;
selectedVal.text = value;
selectedVal.style.fontWeight = 'bold';
}
function countryRedirect(value){
//alert("Val : "+value);
if (value =='London')
{
document.getElementById("selCountry").value='L';
verInformeMarca("L") ;
}
else if (value =='Paris')
{
document.getElementById("selCountry").value='P';
verInformeMarca("P");
}
else if (value =='Madrid')
{
document.getElementById("selCountry").value='M';
verInformeMarca("M");Bonjour,
Vous avez peut-être déjà essayer de la sorte mais voici un essai :
Private Sub Country()
Dim IE As New InternetExplorer
URL = "xxxxxxx"
with IE
.navigate URL
AttenteIE IE
.Visible = True
with .Document
.getElementById("uname").setAttribute("value", "user")
.getElementById("pass").setAttribute("value", "password")
.getElementById("btn").Click
end with
AttenteIE IE
temporiser
with .Document
if range("A1").value <> "" then 'exemple de condition ou les villes se trouvent en A1 (en liste déroulante)
.getElementById("countrySelect").value = range("A1").value '<<< prend nom de la ville
end if
.getElementById("btn2").Click 'hypothétique bouton2 à cliquer suite au choix de ville
end with
end with
End Sub
Sub AttenteIE(IE as InternetExplorer)
Do Until
IE.ReadyState = 4
DoEvents
Loop
end sub
Sub temporiser()
Application.wait now + timevalue("00:00:01")
end subPour l'instant, je me suis seulement intéressé au code HTML.
Cdlt,
Bonjour,
Tout d'abord, merci pour votre message.
j'ai essayé votre code sans succès. Apres plusieurs recherche je pense que le problème est que dès que une fois la connexion au compte établie, l'url est change.
Url page login: xxx com
Ensuite après avoir cliquer sur le button "btn", l'url change pour arriver sur la page ou je dois sélectionner un pays:
Url selection pays: xxx com/country.jsp
Le code n'arrive apparemment pas comprendre cela et a tendance à chercher les éléments HTML sur l'url de départ. C'est ce que je pense mais je n'arrive pas à résoudre le problème. J'ai souvent l'erreur "91" : variable objet ou variable de bloc with non définie.
Pour verifier cette hypothèse, j'ai utiliser Msgbox ie.LocationURL et je vois s'afficher l'url de départ. Alors que je souhaiterais que ce soit l'Url selection pays: "xxx com/country.jsp"
'début du code
ie.document.getElementById("btn").click
Do until ie.ReadyState=4
doEvents
application.wait now + TimeValue("00:00:05")
msgbox ie.LocationURl 'le message affiche l'url de départ
End SubJe pense qu'une fois ce problème résolu, je pourrais vérifier si votre code ainsi que les autres déjà essayés sont corrects.
Cordialement et Merci encore pour votre message.
Bonjour,
Oui, j'y ai pensé à ce problème ! Est-ce que vous obtenez une nouvelle fenetre avec le clic ?
Pouvez-vous essayer ce code dans un premier temps :
Private Sub Country()
Dim IE As New InternetExplorer
Dim oHTML as HTMLDocument
URL = "xxxxxxx"
with IE
.navigate URL
AttenteIE IE
set oHTML = .Document
.Visible = True
with oHTML
.getElementById("uname").setAttribute("value", "user")
.getElementById("pass").setAttribute("value", "password")
.getElementById("btn").Click
end with
AttenteIE IE
temporiser
set oHTML = .Document 'après tempo et IE complet, on capte le nouvel objet document html
oHTML.getElementById("countrySelect").value = "Paris"
end with
End Sub
Sub AttenteIE(IE as InternetExplorer)
Do Until
IE.ReadyState = 4
DoEvents
Loop
end sub
Sub temporiser()
Application.wait now + timevalue("00:00:05")
end subet dans un second temps, avec une fonction (en gardant les 2 autres procédures que je n'ai pas reprises ici) :
Private Sub Country()
Dim IE As New InternetExplorer
Dim oHTML as HTMLDocument
URL = "xxxxxxx"
with IE
.navigate URL
AttenteIE IE
set oHTML = .Document
.Visible = True
with oHTML
.getElementById("uname").setAttribute("value", "user")
.getElementById("pass").setAttribute("value", "password")
.getElementById("btn").Click
end with
AttenteIE IE
end with
temporiser 'apres tempo, on essaie de capter la nouvelle fenetre IE via notre recupie
set IE = RecupIE 'fonction permettant de récupérer la derniere fenetre IE
msgbox IE.locationurl 'pour test
set oHTML = IE.Document 'capte le html document
oHTML.getElementById("countrySelect").value = "Paris" 'assigne à l'élément countryselect la valeur Paris
End Sub
Function RecupIE() as InternetExplorer
Dim oShell As ShellWindows
Dim obj As IWebBrowser2
Dim oIE As InternetExplorer
Set oShell = New ShellWindows
For Each obj In oShell
If obj.Application = "Internet Explorer" Then
Set oIE = obj
End If
Next obj
Set RecupIE = oIE
End SubPourriez-vous me dire où ça bloque si ça bloque encore ? Merci,
Cdlt,
Re-bonjour,
Franchement, merci beaucoup, je n'ai essayé que le premier code et il a parfaitement fonctionné.
J'ai juste ajouté une petite ligne pour permettre de lancer l'évènement "onchange".
Private Sub Country()
Dim IE As New InternetExplorer
Dim oHTML as HTMLDocument
URL = "xxxxxxx"
with IE
.navigate URL
Do Until
IE.ReadyState = 4
DoEvents
Loop
Set oHTML = .Document
.Visible = True
With oHTML
.getElementById("uname").value= "user"
.getElementById("pass").value= "password"
.getElementById("btn").Click
end with
IE.ReadyState = 4
DoEvents
Loop
Application.wait now + timevalue("00:00:01")
set oHTML = .Document
oHTML.getElementById("countrySelect").value = "Paris"
oHTML.getElementById("countrySelect").FireEvent("onchange")
End with
Do Until
IE.ReadyState = 4
DoEvents
Loop
Application.wait now + timevalue("00:00:01")
End SubGrâce à Application.Wait now + ("00:00:01") , on laisse à IE suffisamment de temps pour charger et donc pour capturer le nouvel objet document html.
Un grand merci à vous.
Cordialement,
Super ! Je suis content que ça marche !
Au cas où, le second code est plus approprié lorsque le clic ouvre une nouvelle fenêtre et donc un nouvel IE.
Bonne continuation,
Cdlt,