Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[VBA] Comment savoir si un UserForm d'un autre classeur est visible

12 réponses
Avatar
JièL
Salutatousses

Z = monformulaire.Visible

Z me donne bien l'info True ou False si le formulaire du classeur actuel
est affiché ou pas.

Mais comment je peux faire la même chose à partir d'un autre classeur
(Classeur2.xlsm) ?
J'ai tenté des écritures de codes totalement improbables (genre
Z=Classeur1.xlsm.monformulaire.visible), mais je n'ai pas pu deviner
comment faire...

Si vous avez la solution, merci d'avance

--
JièL pédaleur VBAiste

10 réponses

1 2
Avatar
Jacquouille
Hello
Juste une question totalement à l'improviste:
Tu ne dois pas spécifier tout le chemin du classeur, avant de lui poser la
question?


Jacques
" Le vin est au repas ce que le parfum est à la femme."
.
"JièL" a écrit dans le message de groupe de discussion :
n2ifri$ae4$

Salutatousses

Z = monformulaire.Visible

Z me donne bien l'info True ou False si le formulaire du classeur actuel
est affiché ou pas.

Mais comment je peux faire la même chose à partir d'un autre classeur
(Classeur2.xlsm) ?
J'ai tenté des écritures de codes totalement improbables (genre
Z=Classeur1.xlsm.monformulaire.visible), mais je n'ai pas pu deviner
comment faire...

Si vous avez la solution, merci d'avance

--
JièL pédaleur VBAiste


---
L'absence de virus dans ce courrier électronique a été vérifiée par le logiciel antivirus Avast.
http://www.avast.com
Avatar
MichD
Bonjour,

Je crois que la seule alternative est d'utiliser ce que Laurent Longre a
appelé "Nom masqué".
Ces derniers n'appartiennent pas à la collection "Names" que l'on retrouve
dans Excel.
Dans l'exemple, La valeur de la variable "LaVar" demeure en mémoire tant
et aussi longtemps qu'Excel est ouvert. Tu peux fermer tous les classeurs et
si tu en ouvres un dernier, tu peux toujours extraire la valeur "LaVar".

'Pour définir la valeur de la variable :
'-------------------------------------------------------
Sub Définir_La_Valeur()
Dim LaVar As String
LaVar = "Autre Nom"
Application.ExecuteExcel4Macro ("SET.NAME(""LaVal"",""" & LaVar & """)")
End Sub
'-------------------------------------------------------

'Pour retrouver la valeur de la variable :
'-------------------------------------------------------
Sub Retrouver_La_Valeur()
Dim ValNom As String
ValNom = Application.ExecuteExcel4Macro("GET.NAME(""LaVal"")")
End Sub




MichD
---------------------------------------------------------------
"JièL" a écrit dans le message de groupe de discussion :
n2ifri$ae4$

Salutatousses

Z = monformulaire.Visible

Z me donne bien l'info True ou False si le formulaire du classeur actuel
est affiché ou pas.

Mais comment je peux faire la même chose à partir d'un autre classeur
(Classeur2.xlsm) ?
J'ai tenté des écritures de codes totalement improbables (genre
Z=Classeur1.xlsm.monformulaire.visible), mais je n'ai pas pu deviner
comment faire...

Si vous avez la solution, merci d'avance

--
JièL pédaleur VBAiste
Avatar
JièL
Salut Alain Proviste

nan, ça ne donne rien, en fait je pense que ça n'est pas prévu tout
simplement :-/

Merci pour ta participation ;-)

--
JièL

Le 18/11/2015 19:31, Jacquouille a écrit :
Hello
Juste une question totalement à l'improviste:
Tu ne dois pas spécifier tout le chemin du classeur, avant de lui poser
la question?


Jacques
" Le vin est au repas ce que le parfum est à la femme."
.
"JièL" a écrit dans le message de groupe de discussion :
n2ifri$ae4$

Salutatousses

Z = monformulaire.Visible

Z me donne bien l'info True ou False si le formulaire du classeur actuel
est affiché ou pas.

Mais comment je peux faire la même chose à partir d'un autre classeur
(Classeur2.xlsm) ?
J'ai tenté des écritures de codes totalement improbables (genre
Z=Classeur1.xlsm.monformulaire.visible), mais je n'ai pas pu deviner
comment faire...

Si vous avez la solution, merci d'avance

Avatar
JièL
Bonjour MichD

soit j'ai rien compris ton explication (ce qui est fort possible), soit
c'est toi qui n'a pas compris la question, mais avec ce code je ne vois
pas comment je peux tester si un userform (affiché via un autre
classeur) est visible ou pas.

Pour moi ce code créé une variable d'environnement dans le système,
c'est tout.

Tu peux m'en dire plus sur ton code steuplé ?

Merci

--
JièL ri 1 compris

Le 18/11/2015 20:27, MichD a écrit :
Bonjour,

Je crois que la seule alternative est d'utiliser ce que Laurent Longre a
appelé "Nom masqué".
Ces derniers n'appartiennent pas à la collection "Names" que l'on
retrouve dans Excel.
Dans l'exemple, La valeur de la variable "LaVar" demeure en mémoire tant
et aussi longtemps qu'Excel est ouvert. Tu peux fermer tous les
classeurs et
si tu en ouvres un dernier, tu peux toujours extraire la valeur "LaVar".

'Pour définir la valeur de la variable :
'-------------------------------------------------------
Sub Définir_La_Valeur()
Dim LaVar As String
LaVar = "Autre Nom"
Application.ExecuteExcel4Macro ("SET.NAME(""LaVal"",""" & LaVar & """)")
End Sub
'-------------------------------------------------------

'Pour retrouver la valeur de la variable :
'-------------------------------------------------------
Sub Retrouver_La_Valeur()
Dim ValNom As String
ValNom = Application.ExecuteExcel4Macro("GET.NAME(""LaVal"")")
End Sub




MichD
---------------------------------------------------------------
"JièL" a écrit dans le message de groupe de discussion :
n2ifri$ae4$

Salutatousses

Z = monformulaire.Visible

Z me donne bien l'info True ou False si le formulaire du classeur actuel
est affiché ou pas.

Mais comment je peux faire la même chose à partir d'un autre classeur
(Classeur2.xlsm) ?
J'ai tenté des écritures de codes totalement improbables (genre
Z=Classeur1.xlsm.monformulaire.visible), mais je n'ai pas pu deviner
comment faire...

Si vous avez la solution, merci d'avance

Avatar
Fredo P.
Comme ça d'emblé avec le gestionnaire d'erreur,: exécuter une instruction
sur l'usfr, contrôler la valeur Errnumber ensuite.

"JièL" a écrit dans le message de groupe de discussion :
n2ifri$ae4$

Salutatousses

Z = monformulaire.Visible

Z me donne bien l'info True ou False si le formulaire du classeur actuel
est affiché ou pas.

Mais comment je peux faire la même chose à partir d'un autre classeur
(Classeur2.xlsm) ?
J'ai tenté des écritures de codes totalement improbables (genre
Z=Classeur1.xlsm.monformulaire.visible), mais je n'ai pas pu deviner
comment faire...

Si vous avez la solution, merci d'avance

--
JièL pédaleur VBAiste
Avatar
JièL
heum... l'idée me plait, mais comment je m'adresse à un formulaire
ouvert par un autre classeur ?

Une précision que je n'avais pas donné avant : le formulaire est non modal

--
JièL

Le 19/11/2015 10:24, Fredo P. a écrit :
Comme ça d'emblé avec le gestionnaire d'erreur,: exécuter une
instruction sur l'usfr, contrôler la valeur Errnumber ensuite.

"JièL" a écrit dans le message de groupe de discussion :
n2ifri$ae4$

Salutatousses

Z = monformulaire.Visible

Z me donne bien l'info True ou False si le formulaire du classeur actuel
est affiché ou pas.

Mais comment je peux faire la même chose à partir d'un autre classeur
(Classeur2.xlsm) ?
J'ai tenté des écritures de codes totalement improbables (genre
Z=Classeur1.xlsm.monformulaire.visible), mais je n'ai pas pu deviner
comment faire...

Si vous avez la solution, merci d'avance

Avatar
MichD
Quand tu ouvres ledit formulaire, tu renseignes la variable d'environnement
comme
tu l'appelles. Si la variable contient l'expression "Ouvert", cela signifie
que le formulaire
est ouvert et visible. Si tu fermes toujours le même formulaire, la variable
prend la
valeur "Fermé". À n'importe quel moment, tu peux tester la valeur de cette
variable
à partir d'un autre classeur d'Excel, et ce sans problème!

Évidemment, cela suppose que tous les classeurs s'ouvrent à partir de la
même instance
de l'application Excel. (Je n'ai pas testé expressément le cas ou
l'utilisateur utilise des
instances d'Excel différentes...)

Une autre méthode serait d'utiliser un "NOM" de la collection "NAMES" en vba
et recourir
au même principe. Quand tu ouvres le formulaire, tu affectes au "NOM", la
valeur "Ouvert"
sinon, la valeur de ce "NOM" est fermé.

Un petit exemple :
'Pour créer le NOM quand tu ouvres le formulaire du classeur.
'Évidemment, ce code est dans le code d'un événement du formulaire
Workbooks("Classeur1").Names.Add "toto", "Fermé", Visible:úlse
OU
ThisWorkbook.Names.Add "toto", "Fermé", Visible:úlse 'OUVERT OU FERMÉ
SELON LE CAS!

'Pour lire la valeur de ce nom à partir d'un autre classeur...
x = Workbooks("Classeur1").Names("toto")

Si tu trouves une autre méthode, je suis preneur!


MichD
---------------------------------------------------------------
Avatar
JièL
Merci MichD, mais je ne maitrise pas l'autre classeur... donc je ne peux
pas le modifier.

Le 19/11/2015 11:49, MichD a écrit :
Si tu trouves une autre méthode, je suis preneur!



j'ai trouvé ça
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA"
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA"
(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As
Any) As Long

Sub test()
Application.Run "C:TempClasseur1.xlsm!AffForm"
Handle = FindWindow(vbNullString, "UserForm1")
If Handle <> 0 Then
FermeForm = SendMessage(HandleForm, &H10, 2&, ByVal 0&)
End if
End Sub

Ca fonctionne, mais SendMessage(HandleForm, &H10, 2&, ByVal 0&) plante
AffForm sur l'instruction UserForm1.Show lors de la troisième fois ou on
lance Test()

Pourquoi la 3ème, ça c'est le mystère.

Merci

--
JièL
Avatar
Fredo P.
un lien de mes recherches:
http://silkyroad.developpez.com/VBA/VisualBasicEditor/#LVI

"JièL" a écrit dans le message de groupe de discussion :
n2k7ol$tki$

heum... l'idée me plait, mais comment je m'adresse à un formulaire
ouvert par un autre classeur ?

Une précision que je n'avais pas donné avant : le formulaire est non modal

--
JièL

Le 19/11/2015 10:24, Fredo P. a écrit :
Comme ça d'emblé avec le gestionnaire d'erreur,: exécuter une
instruction sur l'usfr, contrôler la valeur Errnumber ensuite.

"JièL" a écrit dans le message de groupe de discussion :
n2ifri$ae4$

Salutatousses

Z = monformulaire.Visible

Z me donne bien l'info True ou False si le formulaire du classeur actuel
est affiché ou pas.

Mais comment je peux faire la même chose à partir d'un autre classeur
(Classeur2.xlsm) ?
J'ai tenté des écritures de codes totalement improbables (genre
Z=Classeur1.xlsm.monformulaire.visible), mais je n'ai pas pu deviner
comment faire...

Si vous avez la solution, merci d'avance

Avatar
MichD
On peut toujours afficher un formulaire à partir d'un autre formulaire
en appelant une macro dans le fichier où se retrouve le formulaire

'pour appeler la macro à partir d'un classeur ouvert
'-----------------------------
Sub test()
Application.Run "Classeur1!Afficher_Formulaire"
End Sub
'-----------------------------

Dans le module standard où est le formulaire
'-----------------------------
Sub Afficher_Formulaire()
UserForm1.Show 0
UserForm1.TextBox1 = "toto"
End Sub
'-----------------------------

Mais ceci ne te dit pas expressément si le formulaire est visible ou non
si c'est ce que tu veux savoir...

Deuxièmement, un formulaire est fait pour traiter les données des feuilles
de
calcul du classeur dans lequel il se retrouve.

Tu peux questionner une base de données même d'un classeur fermé en
utilisant
ADO (Activex Data Object) en passant des requêtes... Je ne connais pas de
moyen
d'accéder au contrôle d'un formulaire ouvert à partir d'un autre classeur.

MichD
---------------------------------------------------------------
1 2