Boostez vos compétences Excel avec notre communauté !
Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force.
Apprenez, échangez, progressez – et tout ça gratuitement !
👉 Inscrivez-vous maintenant !
Dans une fonction, je récupère le Handle de la fenêtre active: API GetActiveWindow.
Comment savoir si ce Handle est celui d'un UserForm ou pas ? Par le ClassName ? Autre ?
thunderxframe ou thunderDframe
tu fait pareil que je fait pour la child de la combo dim str space$(255)
getclassname handle str ,255
msgbox trim(str)
avec les bonne déclaration d'api bien sur
Merci pour ta proposition. Je vais regarder le code mais le GetWindowText il me semble que je l'avais testé, je ne récupérais ni le Caption ni le nom du UserForm. Je vais quand même vérifier mais ce qui m'intéresse c'est savoir si c'est un UserForm. Alors si je récupère le nom, ce qui m'étonnerais avec cette API, je pourrais comparer avec les UserForms visibles du Projet. Idéalement il faudrait récupérer une information de Class caractéristique d'un UserForm.
Le but est assez complexe, il s'agit, pour un utilitaire utilisant lui-même un UserForm de savoir, lorsqu'il est demandé d'exclure des interactions extérieures quand il est affiché, s'il doit se placer en vbModeless + Interactive = False car appelé directement ou en vbModal sur un UserForm vbModeles qui l'appelle, sachant que sur un UserForm vbModal il ne peut se placer lui-même qu'en vbModal. Alors il faut que je sache qui l'appelle car que je veux privilégier le vbModeless qui me permet de faire des choses comme boucler pour faire un timer ou capter des sélections sur feuille alors que le UserForm est affiché.
thunderxframe ou thunderDframe
tu fait pareil que je fait pour la child de la combo dim str space$(255)
getclassname handle str ,255
msgbox trim(str)
avec les bonne déclaration d'api bien sur
Le but est assez complexe, il s'agit, pour un utilitaire utilisant lui-même un UserForm de savoir, lorsqu'il est demandé d'exclure des interactions extérieures quand il est affiché, s'il doit se placer en vbModeless + Interactive = False car appelé directement ou en vbModal sur un UserForm vbModeles qui l'appelle, sachant que sur un UserForm vbModal il ne peut se placer lui-même qu'en vbModal. Alors il faut que je sache qui l'appelle car que je veux privilégier le vbModeless qui me permet de faire des choses comme boucler pour faire un timer ou capter des sélections sur feuille alors que le UserForm est affiché.
re dans ce cas là met une variable public dans le usf appellé (pas l'appelant)
du genre public QUI
substitue la fonction show par ta propre fonction show
du genre
VB:
Option Explicit
Public QUI
PublicFunction ShowX(parmoi,OptionalByVal vbmode =1)With UserForm1
Set.QUI = parmoi
.Show vbmode
EndWithEndFunctionPrivateSub UserForm_Activate()
MsgBox "Hallo!!! c'est "& QUI.Name &" qui appelle"EndSub
Il me semble bien que j'avais testé ça y a un certain temps sans arriver à un résultat.
Dans les 2 cas je récupère le Handle Excel comme Parent du UserForm.
Maintenant je vais tester avec une fonction interne qui fait le Show pour voir la différence.
Ok, quand on intercepte le Handle avant le Show on récupère bien le bonne classe.
C'est dommage qu'à partir du UserForm de 2ème niveau on ne retrouve pas le Handle du UserForm de 1er niveau.
Excel rattache systématiquement les UserForms à l'ActiveWindow apparemment.
Et à toutes fins utiles, une petite fonction pour terminer...
VB:
PrivateDeclare PtrSafe Function GetActiveWindow Lib"user32.dll"()As LongPtr
PrivateDeclare PtrSafe Function GetClassName Lib"user32"Alias"GetClassNameA"(ByVal hWnd As LongPtr,ByVal lpClassName AsString,ByVal nMaxCount AsLong)AsLong'--------------------------------------------------'Retourne True si le Handle est celui d'un UserForm'--------------------------------------------------Function CallerIsUserForm(OptionalByVal hWndCaller As LongPtr =0)AsBooleanDimClassAsStringIf hWndCaller =0Then hWndCaller = GetActiveWindow
Class= Space$(255)Call GetClassName(hWndCaller,Class, Len(Class))Class= UCase(Left(Class, InStr(Class, Chr(0))-1))IfClass="THUNDERDFRAME"OrClass="THUNDERXFRAME"Then'Return value
CallerIsUserForm =TrueEndIfEndFunction
Edit: Et comme le précise @patricktoulon dans le message suivant, si on appelle cette fonction d'un UserForm pour savoir qui veut l'afficher, il faut intercepter le Handle de l'appelant AVANT le UserForm_Activate() car Excel ne donnera pas un UserForm appelant comme Parent du UserForm appelé, ce qui exclut de le retrouver avec l'API GetParent() !
Ce qui revient à devoir écrire une procédure Public dans le UserForm de type:
VB:
PrivateDeclare PtrSafe Function GetActiveWindow Lib"user32.dll"()As LongPtr
PrivateDeclare PtrSafe Function GetClassName Lib"user32"Alias"GetClassNameA"(ByVal hWnd As LongPtr,ByVal lpClassName AsString,ByVal nMaxCount AsLong)AsLongPrivate AppelantEstUserForm AsBooleanPublicSub Display(OptionalByVal ShowMode AsInteger= vbModal)
AppelantEstUserForm = CallerIsUserForm
Me.Show ShowMode
EndSub
Et au lieu de faire UserForm1.Show, faire UserForm1.Display (avec le paramètre Mode éventuel)
Et à toutes fins utiles, une petite fonction pour terminer...
VB:
PrivateDeclare PtrSafe Function GetActiveWindow Lib"user32.dll"()As LongPtr
PrivateDeclare PtrSafe Function GetClassName Lib"user32"Alias"GetClassNameA"(ByVal hWnd As LongPtr,ByVal lpClassName AsString,ByVal nMaxCount AsLong)AsLong'--------------------------------------------------'Retourne True si le Handle est celui d'un UserForm'--------------------------------------------------Function CallerIsUserForm(OptionalByVal hWndCaller As LongPtr =0)AsBooleanDimClassAsStringIf hWndCaller =0Then hWndCaller = GetActiveWindow
Class= Space$(255)Call GetClassName(hWndCaller,Class, Len(Class))Class= UCase(Left(Class, InStr(Class, Chr(0))-1))IfClass="THUNDERDFRAME"OrClass="THUNDERXFRAME"Then'Return value
CallerIsUserForm =TrueEndIfEndFunction
Edit: Et comme le précise @patricktoulon dans le message suivant, si on appelle cette fonction d'un UserForm pour savoir qui veut l'afficher, il faut intercepter le Handle de l'appelant AVANT le UserForm_Activate() car Excel ne donnera pas un UserForm appelant comme Parent du UserForm appelé, ce qui exclut de le retrouver avec l'API GetParent() !
Ce qui revient à devoir écrire une procédure Public dans le UserForm de type:
VB:
PrivateDeclare PtrSafe Function GetActiveWindow Lib"user32.dll"()As LongPtr
PrivateDeclare PtrSafe Function GetClassName Lib"user32"Alias"GetClassNameA"(ByVal hWnd As LongPtr,ByVal lpClassName AsString,ByVal nMaxCount AsLong)AsLongPrivate AppelantEstUserForm AsBooleanPublicSub Display(OptionalByVal ShowMode AsInteger= vbModal)
AppelantEstUserForm = CallerIsUserForm
Me.Show ShowMode
EndSub
Et au lieu de faire UserForm1.Show, faire UserForm1.Display (avec le paramètre Mode éventuel)
re
comme je te l'ai montré dans le message précédent #6
à utiliser une fonction pucblic perso d'affichage (show) ben tant qu'a faire utilise un argument supplémentaire object userform et utilise findwindow
comme ca on est sur
- Navigue sans publicité - Accède à Cléa, notre assistante IA experte Excel... et pas que... - Profite de fonctionnalités exclusives Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel. Je deviens Supporter XLD