[VBA] Comment savoir si un UserForm d'un autre classeur est visible
Le
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
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
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
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
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 :
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 :
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
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
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
---------------------------------------------------------------
pas le modifier.
Le 19/11/2015 11:49, MichD a écrit :
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
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 :
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
---------------------------------------------------------------