XL 2021 VBA - Comment savoir dans quel mode (vbModal / vbModeless) est affiché un UserForm

  • Initiateur de la discussion Initiateur de la discussion Dudu2
  • Date de début Date de début

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 !

Re,

Sinon la possibilité d'une méthode générique

Dans un module standard
VB:
Option Explicit
Private formModes As Object ' Scripting.Dictionary

Public Sub InitFormModeTracking()
    If formModes Is Nothing Then Set formModes = CreateObject("Scripting.Dictionary")
End Sub

Public Sub ShowUserForm(UF As Object, Optional ByVal Mode As VbModal = vbModal)
    InitFormModeTracking
    formModes(UF.Name) = Mode
    UF.Show Mode
End Sub

Public Function GetFormMode(UF As Object) As VbModal
    InitFormModeTracking
    If formModes.exists(UF.Name) Then
        GetFormMode = formModes(UF.Name)
    Else
        ' Valeur par défaut si jamais non initialisée
        GetFormMode = vbModal
    End If
End Function

Et au lieu d'afficher ton USF
Code:
UserForm1.Show vbModeless
Tu fais
Code:
Call ShowUserForm(UserForm1, vbModeless)
Et pour connaitre le mode, dans ton USF
Code:
Dim mode As VbModal
mode = GetFormMode(UserForm1)
If mode = vbModal Then
    MsgBox "Modal"
Else
    MsgBox "Modeless"
End If

Voilà, tu ne trouveras pas mieux je pense
 
J'ai un assez grand nombre de UserForms dans une application complexe.
Le problème n'est pas lié à 1 UserForm particulier mais si je dois afficher un UserForm vbModeless dans un classeur alors qu'un UserForm vbModal est affiché dans un autre classeur je dois le savoir et l'identifier pour le fermer.

Alors je peux effectivement gérer un système comme l'indique @wDog66 avec pour chaque UserForm une variable associée indique comment il est affiché mais j'aimerais que ce soit direct.
 
Oui, ça rend la main à la procédure ayant affiché le UserForm vbModal.
Il faut juste qu'elle ne fasse rien après le .Show vbModal ce qui est le cas si le UserForm est en mode affichage sans interaction.
Du moins si le code l'a prévu ainsi.
 
C'est bien mais ça ne dit pas si un UserForm est modal ou pas d'autant que si les actions sont bloquées sur tous les classeurs, ce n'est pas le cas sur un nouveau classeur bien qu'Excel informe que l'opération d'ouverture d'un nouveau classeur n'est pas possible !

J'ai essayé les Styles et ExStyles du GetWindowLong() ou du GetWindowInfo() mais rien ne différencie le mode d'affichage.
Donc la seule méthode est celle du fichier du 1er post.
 
re
Bonjour bonjour
comme ça vite fait un truc a l'arrache
on essaie de sélectionner une cellule (PAS PAR UN SELECT!!!!) mais par la simu de la souris
si la cellule change c'est qu'il est non modal

exemple un userform et un bouton
VB:
'patricktoulon
Private Type POINTAPI
    x As Long
    y As Long
End Type

Private Declare PtrSafe Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal dwData As Long, ByVal dwExtraInfo As Long)
Private Declare PtrSafe Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
Private Declare PtrSafe Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long

Private Const MOUSEEVENTF_LEFTDOWN As Long = &H2
Private Const MOUSEEVENTF_LEFTUP As Long = &H4

Private Sub CommandButton1_Click()
    Dim cell As Range, x, y, pt As POINTAPI
    Set cell = ActiveCell
    GetCursorPos pt
    'on prend les points de la cellule en dessous
    With ActiveWindow.ActivePane
        x = .PointsToScreenPixelsX(cell.Left)
        y = .PointsToScreenPixelsY(cell.Offset(2).Top - 2)
    End With
    'on y place le curseur
    SetCursorPos x, y
    ' on simule un clic gauche
    mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0
    mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0
    DoEvents
    SetCursorPos pt.x, pt.y
    'si la cellule a changé au click souris simulé c'est que le userform est non modal sinon elle ne change pas donc modal
    MsgBox "Modal : " & CStr(cell.Address = ActiveCell.Address)
    cell.Select
End Sub
 
- 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

Discussions similaires

  • Question Question
Microsoft 365 affichage userform
Réponses
4
Affichages
361
Retour