VBA Internet explorer accéder a une fenêtre IE popup (HTA?)
Bonjour,
Je suis sur un petit projet d'automatisation de tache.
J'utilise VBA pour interagir avec IE.
Je suis bloquer par un popup ouvert apres un "clic" sur un bouton.
Le bouton renvoie a une balise html <a qui a dans son href un script
==> Ce script lance l'ouverture d'un pupup avec la fonction window. open
je souhaite accéder a ce popup pour pouvoir interagir avec les éléments q'il contient.
Ci dessous la fonction que j’utilise pour récupérer une page IE. Cela ne constionne pas avec le popup car
En fouillant dans la console dans le code HTML de la page ci dessous les élément sur ce popup:
Quelqu'un a un soliton ? Merci d'avance
fonction VBA :
Function GetobIEOBject(URL As String) As Object
Dim objShell As Object
Dim obj As Object
Set objShell = CreateObject("shell.application")
For Each obj In objShell.Windows
'If TypeName(obj.document) = "HTMLDocument" Then
If obj.LocationURL = URL Then Set GetobIEOBject = obj
'End If
Next obj
End Function
Balise HTML:
<a href="javascript:afficherBanqueHoraire();" onclick="nePasAvertirEnQuittant=true;" onmouseover="return overlib('Pour afficher la banque horaire', CAPTION, 'Cliquez ici ...');" onmouseout="return nd();" class="orangegras">Afficher la
banque horaire</a>
ci dessous le code du script.
function afficherBanqueHoraire() {
try {
if (oBanqueHoraire == null || oBanqueHoraire.closed) {
if (document.all){
//Cas ie
oBanqueHoraire = showModelessDialog("TapGrHoraire.jsp",window,"status:no;dialogLeft:200;dialogTop:100;dialogWidth:900px;dialogHeight:300px;resizable:yes;help:no");
} else {
oBanqueHoraire = window.open("/Tap/Gerer/TapGrHoraire.jsp","WinTapGrHoraire","status=no, Left=200, Top=100, Width=900px, Height=200px, resizable=yes, help=no");
}
}
oBanqueHoraire.focus();
} catch(ex) {
alert("L\'accès à la banque horaire est impossible !");
}
}
//FMR QC939 Fonction pour Gérer la banque horaire
// FDN QC 939 - modification de la méthode
Bonjour et
Est-ce qu'il est possible d'avoir le site sur lequel tu veux intervenir ? est-ce qu'il est possible d'avoir un fichier excel ?
Mais j'anticipe le fait que ce ne soit pas accessible pour nous.
Mon expérience est d'utiliser plutôt firefox ou chrome.
De lancer le site
ShellExecute(0, "open", url, 0, 0, 1)et d'activer la fonction javascript dans la barre d'adresse du navigateur (firefox ou chrome) par des sendkeys.
SendKeys "%d"
Application.Wait (Now + TimeValue("00:00:01"))
SendKeys "javascript:_______ici_la_fonction_et_ses_arguments________;"
SendKeys "{ENTER}"il faut bien connaître javascript pour lui envoyer les bonnes fonctions.
Un exemple d'activation d'une fonction javascript d'un site web par excel :
https://forum.excel-pratique.com/viewtopic.php?p=857883#p857883
Toutefois, dans ton cas, je remarque que la fonction ne fait qu'ouvrir une page web dont on connaît a priori l'adresse en relatif :
/Tap/Gerer/TapGrHoraire.jspJe ne suis donc pas sûr qu'il faille passer par une cuisine de fonction javascript.
Merci Stellson, Sympa l'acceuil
T'a vu juste, malheureusement le site est un intranet, tu ne pourra pas y avoir accès.
Concernant les autre navigateur je suis obligé de passer par IE , je ne suis pas sur que les bibliothèques de fonctions existe pour Firefox et chrome.
Dans mon cas, j'ai trouvé une solution pour accéder au bouton.
La variable objet B_Aff_Banque_Horaire me permet d'agir sur la page principale.
Après la commande B_Aff_Banque_Horaire.Click le popup apparait.
C'est la que les chose se complique !!
Cette fenêtre comporte un tableau avec de nombreuses valeurs, j'ai besoin d'agir sur ces valeurs et de faire des sélections.
Pour cela je pensais lier la variable IE2 à cette fenêtre POPUP puis agir sur le code HTML de ce POPUP ( il a sont propre HTML).
La commande :
Set IE2 = GetobIEOBject(URL) avec URL2 = "
" ne marche pas
en fait elle n'existe pas dans objShell.Windows !!!
En fouillant sur internet j'ai lu que la fonction window.open ouvre une fenêtre IE secondaire, mais cela ne m'avance pas trop!
Bon en gros je suis bloqué tant que je ne trouve pas un moyen de récupérer l'accès a ce POPUP
ci dessous le code ( toujours en construction )
Option Explicit
Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal Milliseconds As LongPtr)
Function GetobIEOBject(URL As String) As Object
Dim objShell As Object
Dim obj As Object
Set objShell = CreateObject("shell.application")
For Each obj In objShell.Windows
If TypeName(obj.document) = "HTMLDocument" Then
If obj.LocationURL = URL Then Set GetobIEOBject = obj
End If
Next obj
End Function
Sub WaitIE(objIE As InternetExplorer)
'On boucle tant que la page n'est pas totalement chargée
Do While objIE.Busy: DoEvents: Loop
Do Until objIE.readyState = READYSTATE_COMPLETE: DoEvents: Loop
End Sub
Sub Essai()
Dim IE1 As InternetExplorer
Dim IE2 As InternetExplorer
Dim IE1Doc As HTMLDocument
Dim IE2Doc As HTMLDocument
Dim Frame1_Doc As HTMLDocument
Dim htmltable As htmltable
Dim Generic As HTMLGenericElement
Dim B_Aff_Banque_Horraire As HTMLGenericElement
Dim URL As String
Dim URL2 As String
Dim tag As String
Dim CP As String
Dim index As Integer
' Affectation des variable adresse site internet"
URL = "
"
'URL2 = "
"
' Affectation du site sur URL à la l'objet EI2
Set IE1 = GetobIEOBject(URL)
Set IE1Doc = IE1.document
IE1.Visible = True
'Aans le document HTML (de IE1) un nouveau dument est attaché a une balise frame
'Affectation variable pour document balise frame 1
Set Frame1_Doc = IE1Doc.frames("contenu").document.frames.Item(1).document
' recherche du formulaire HTML
For index = 0 To 200
Set Generic = Frame1_Doc.getElementsByTagName("form")(index)
On Error GoTo saut1
If Generic.Name = "Formulaire" Then
Exit For
End If
Next
' Recherche de la table générale identifié par la class "nn"
For index = 0 To 200
Set htmltable = Generic.getElementsByTagName("table")(index)
On Error GoTo saut1
If htmltable.ClassName = "nn" Then
Exit For
End If
Next
' Recherche de la table contenu - pas de name, id, ou class etc...
Set htmltable = htmltable.Children(0).Children(1).Children(0).Children(1)
' Rechercher Bouton "Afficher banque horraire" pas de name, id, ou class etc...
Set B_Aff_Banque_Horraire = htmltable.Children(1).Children(0).Children(0).Children(0)
B_Aff_Banque_Horraire.Click
'==> a ce niveau du programme la fenêtre popup s'ouvre.
'code pour associer la page popup a l'objet IE2
'==> IE2 is nothiong
Set IE2 = GetobIEOBject(URL2)
Set IE2Doc = IE2.document
IE2.Visible = True
'==> IE2 is nothing !!!!!!!!
'//////////////////////////////////////////////////////////////////////
'Routine de remplissage à réaliser
'//////////////////////////////////////////////////////////////////////
'boucle pour trouver la case du tableau de la du mois et entrée le code horaire
' il gau = "AJ_" & Jou_du_mois & "_AG_" & CP & "_"
For index = 0 To 200
Set Generic = Frame1_Doc.all.Item(index)
If Generic.name = "XXXXXXXXXXXX" Then
Generic.Click
Exit For
End If
Next
Set IE1 = Nothing
Set IE2 = Nothing
Set IE1Doc = Nothing
Set IE2Doc = Nothing
Set Frame1_Doc = Nothing
Set htmltable = Nothing
Set Generic = Nothing
Set B_Aff_Banque_Horraire = Nothing
End Sub
Bonjour,
Est-ce que tu dois agir sur la popup ou juste récupérer des données ?
Si la popup est bien ouverte, tu dois pouvoir envoyer (sendkeys) ctrl+a et ctrl+c pour capter les données affichées et revenir sur excel pour coller les valeurs. Le tableau devrait alors pouvoir être copié.
Re Steelson,
Dans le POPUP j'ai une tableau avec une vingtaine de case.
J'ai besoin de cliquer sur une des cases suivant le besoin.
En faite dans le remplissage de formulaire cette fenêtre est une sorte de panel. je sélectionne une case pour remplir des données sur la page IE principale.
Je viens d'essayer pas de réaction au commandes clavier
Donc là, j ne sais pas faire aujourd'hui ! et surtout pas avec IE.je sélectionne une case pour remplir des données sur la page IE principale.
Je viens d'essayer de faire un jeu d'essai ... mais impossible d'autoriser les popup avec IE sans intervenir sans cesse sur les paramètres. On peut aussi dans ce cas s'appuyer sur le site du forum et "jouer" avec les icônes supplémentaires ...
Je peux réfléchir sur une solution avec chrome ou firefox (navigateurs dernière génération) avec lesquels on peut facilement récupérer le code source, mais pas IE !
Pour le moment je rends mon tablier sur cette question (tout en gardant le sujet en tête).
Le seul truc rigolo que j'ai exploité un jour était de piloter la souris pour cliquer virtuellement sur une case.
Il faut que la fenêtre soit toujours positionnée au même endroit (ou détecter sa position) et les zones calibrées.
Salut Steelson,
Merci pour tout, c'est pas évident surtout lorsqu'il s'agit d'un intranet sur lequel tu ne peux pas te connecter.
En faisant quelques recherches, j'ai vu que la fonction java qui ouvre le popup est : window.open
Le second argument de cette fonction est le nom (interne de la fenêtre). particularité de window.open:
si une fenêtre IE avec portant ce nom existe déjà le popup s'ouvrira sur cette fenêtre.
L'idée est la suivante :
Créer une page internet portant le nom interne "WinTapGrHoraire" l'affecter a un objet exemple: IEpopup .
faire l'appui sur le bouton pour lancer le popup
Puis voir si le popup a bien été ouvert dans IEpopup.
Pour cela je voudrais lancer la fonction java script window.open sur VBA.
Sais tu si cela est possible?
Je vais lacer quelques essais, notamment
- lancer du javascript dans IE par sendkeys et cela semble fonctionner
- et ouvrir une popup dans une fenêtre existante comme tu le suggères (sur ce point, un premier essai a quand même ouvert la popup dans une autre fenêtre mais je pense comprendre pourquoi).
Pour cela je voudrais lancer la fonction java script window.open sur VBA.
Oui c'est possible
Ci-joint un exemple ... mais ce qui est possible avec chrome donne parfois des résultats un peu curieux avec IE chez moi.
Fais cet essai, avec 2 variantes :
Application.Wait (Now + TimeValue("00:00:04"))
SendKeys "%d"
Application.Wait (Now + TimeValue("00:00:01"))
SendKeys "javascript:alert{(}'coucou'{)};"
SendKeys "{ENTER}"et
Application.Wait (Now + TimeValue("00:00:04"))
SendKeys "%d"
Application.Wait (Now + TimeValue("00:00:01"))
SendKeys "javascript:window.open{(}'https://www.google.fr/','WinTapGrHoraire','status=no, Left=200, Top=100, Width=900px, Height=200px, resizable=yes, help=no'{)};"
SendKeys "{ENTER}"%d permet d'accéder à la barre d'adresse, cela fonctionne aussi avec IE
la commande javascript s'écrit avec des apostrophes au lieu des guillemets ici, et avec encadrement des parenthèses
Faut laisser faire il y a une tempo.
Le second argument de cette fonction est le nom (interne de la fenêtre). particularité de window.open:
si une fenêtre IE avec portant ce nom existe déjà le popup s'ouvrira sur cette fenêtre.
Je suis assez dubitatif.
J'ai créé une page avec comme titre maPopup.
J'en ai créé une seconde qui appelle une popup dans la fenêtre maPopup mais qui s'est ouverte dans une autre fenêtre
Cela donne ceci :
Et quand je regarde la liste des fenêtres ouvertes, j'en ai bien 2 au même nom, mais avec des "handle" différents !
Le point positif est qu'au travers de la recherche des fenêtres on puisse accéder quand même aux informations ... à suivre. Regarde de ton côté avec mon envoi précédent (car chez moi IE a des fonctionnements erratiques parfois, ou incompréhensibles).
Je reviens sur le sujet ...
Pour cela je voudrais lancer la fonction java script window.open sur VBA.
Dans ton cas il suffit d'activer la fonction chapeau en javascript :
SendKeys "%d"
Application.Wait (Now + TimeValue("00:00:01"))
SendKeys "javascript:afficherBanqueHoraire{(}{)};"
SendKeys "{ENTER}"Je pense qu'il faut comprendre que window.open ouvre dans la fenêtre trucmuche si cette dernière est déjà une popup lancée par la page, pas une fenêtre lancée auparavant en direct.
Quelque pistes :
VBA code to interact with specific IE window that is already open
J'ai fait un essai peu concluant pour moi. Mais je vais explorer cette voie
car je sais retrouver les hwnd des fenêtres ouvertes (cf copie d'écran ci-dessus).
EDIT : last news ...
Après de longues investigations au travers des forums ou autres discussions mondiales, je n'ai pas trouvé grand chose, quelques pistes cependant dont une que j'ai poursuivie à force de compilation d'éléments de droite et de gauche.
Pour définir l'objet correspondant à la popup, utilise cette fonction
Function TrouveTitre(titre As String) As Object
' uniquement IE
Dim shl, wins, i, win
Set shl = CreateObject("Shell.Application")
Set wins = shl.Windows
Set TrouveTitre = Nothing
For i = 0 To wins.Count - 1
On Error Resume Next
Set win = wins.Item(i)
If win.Document.Title Like "*" & titre & "*" Then Set TrouveTitre = win
Next
End Functionet appelle là comme suit :
Set IE2 = Nothing
Set IE2 = TrouveTitre("WinTapGrHoraire")
If IE2 Is Nothing Then Exit Subattention, sans lancer une fenêtre qui a le même nom par ailleurs !
J'ai essayé avec une page html qui lance en popup une recherche google et cela fonctionne super bien !
Bonjour Aoya
Un retour sur la proposition ?