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.jsp

Je 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

je sélectionne une case pour remplir des données sur la page IE principale.

Donc là, j ne sais pas faire aujourd'hui ! et surtout pas avec IE.

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.

33mouse.xlsm (20.63 Ko)

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 :

capture d ecran 592

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 !

capture d ecran 593

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 Function

et appelle là comme suit :

    Set IE2 = Nothing
    Set IE2 = TrouveTitre("WinTapGrHoraire")
    If IE2 Is Nothing Then Exit Sub

attention, 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 ?

Rechercher des sujets similaires à "vba internet explorer acceder fenetre popup hta"