XL 2016 UserForm vbModeless - Ré-activation ne donne pas le Focus à l'ActiveControl

  • 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 !

Dudu2

XLDnaute Barbatruc
Bonjour,

C'est expliqué dans le fichier:

1640470057461.png


Bien que j'ai pu ré-activer le UserForm vbModeless sur son MouseMove() (différentes options essayées), le focus ne vient pas dans l'ActiveControl du UserForm.
Si vous avez un idée...

Edit: Faut-il se rabattre sur la génération d'un clic souris sur les coordonnées de l'ActiveControl ?
Cordialement.
 

Pièces jointes

Dernière édition:
Solution
re
Bonjour @Dudu2
comme je te l'ai dit il faut sortir des sentiers battus
je reprend ton userform
j'ajoute un textebox en plus qui sera masqué si il faut si tu en a déjà plusieurs c'est pas la peine d'en ajouter

donc
dans ton exemple j'ajoute un textbox même de taille zero si tu veux

demo.gif


ensuite je vire tout ton code entièrement
je vais gérer le sélection change dans le userform directement
dans cet event je vais pointer l'activecntrol

et au mouve dans le userform si un control a été pointer je le reactive en le disablant et le re enabilisant
parti de la il est actif et je lui done le focus et selstart
le tour est joué
VB:
Public WithEvents feuille As Worksheet
Public ctrl As Object

Private Sub...
J'avais fait un truc comme ça avec la souris.
Pour le SetFocus avec du non UIAutomation, ça passe avec la propriété Control.Visible modifiée 2 fois.

Par contre c'est basé sur un UserForm_MouseMove() qui peut ne pas se déclencher si avec la souris on rentre directement sur un Control en bordure (ici TextBox2) ou qui n'a pas le temps de se déclencher si on y rentre suffisamment vite.
 

Pièces jointes

je vais faire un appel de dons
pour acheter des barrettes mémoire pour la tête a @Dudu2 🤪🤪🤣👍🤪

si je te dis textbox_exit ca te rappelle rien ?
........
non vraiment pas ?
.......
si je te dis module classe non toujours pas ?
.......
je vais un peu t'aider
VB:
'*****************************************************************************************************
'    ___     _     _______  __      _   ____  _   _  _______  ___     _   _   _    ___     _     _.
'   //  \\  /\\      //    // \\   //  //    //  //    //    //  \\  //  //  //   //  \\  //|   //
'  //___// //__\    //    //__//  //  //    //__//    //    //   // //  //  //   //   // // |  //
' //      //   \\  //    //  \\  //  //    //  \\    //    //   // //  //  //   //   // //  | //
'//      //    // //    //   // //  //___ //    \\  //     \\__// //__//  //___ \\__// //   |//
'****************************************************************************************************
'Module classe permettant le Selreactivate de l'userform
'created by patricktoulon
#If VBA7 Then
    Private Declare PtrSafe Function GetActiveWindow Lib "user32.dll" () As LongPtr
    Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
#Else
    Private Declare Function GetActiveWindow Lib "user32.dll" () As Long
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
#End If

Public WithEvents bt As MSForms.CommandButton
Public WithEvents lab As MSForms.Label
Public WithEvents lbx As MSForms.ListBox
Public WithEvents fram As MSForms.Frame
Public WithEvents txtb As MSForms.TextBox
Public WithEvents combo As MSForms.ComboBox
Public WithEvents img As MSForms.Image
Public WithEvents UforM As UserForm
Dim cls(1 To 100) As New FormSelfReactivate
#If VBA7 Then
    Public HandleForM As LongPtr
#Else
    Public HandleForM As Long
#End If
Public uf As Object
Public Function init(usf)
    Dim ctrl
    For Each ctrl In usf.Controls
        i = i + 1
        Select Case True
            Case TypeName(ctrl) = "CommandButton" Or TypeOf ctrl Is CommandButton: Set cls(i).bt = ctrl: Set cls(i).uf = usf
            Case TypeName(ctrl) = "ListBox" Or TypeOf ctrl Is ListBox: Set cls(i).lbx = ctrl: Set cls(i).uf = usf
            Case TypeName(ctrl) = "TextBox" Or TypeOf ctrl Is TextBox: Set cls(i).txtb = ctrl: Set cls(i).uf = usf
            Case TypeName(ctrl) = "Frame" Or TypeOf ctrl Is Frame: Set cls(i).fram = ctrl: Set cls(i).uf = usf
            Case TypeName(ctrl) = "Label" Or TypeOf ctrl Is Label: Set cls(i).lab = ctrl: Set cls(i).uf = usf
            Case TypeName(ctrl) = "Image" Or TypeOf ctrl Is Image: Set cls(i).img = ctrl: Set cls(i).uf = usf
            Case TypeName(ctrl) = "ComboBox" Or TypeOf ctrl Is ComboBox: Set cls(i).combo = ctrl: Set cls(i).uf = usf
        End Select
    Next
    Set UforM = usf
    Set uf = usf
End Function

Private Sub Class_Terminate()
    Erase cls
End Sub

Private Sub UForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single): bouge: End Sub
Private Sub Combo_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single): bouge: End Sub
Private Sub lbx_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single): bouge: End Sub
Private Sub bt_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single): bouge: End Sub
Private Sub Fram_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single): bouge: End Sub
Private Sub Lab_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single): bouge: End Sub
Private Sub TxtB_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single): bouge: End Sub
Private Sub img_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single): bouge: End Sub

Public Sub bouge()
    Dim Control As MSForms.Control
    HandleForM = FindWindow(vbNullString, uf.Caption)
    '------------------------
    'UserForm n'est pas actif
    '------------------------
    If Not GetActiveWindow = HandleForM Then
        'Ré-activer le UserForm
        AppActivate uf.Caption

        Set Control = uf.ActiveControl

        'Force Control Activation
        With Control
            On Error Resume Next
            .Visible = Not .Visible
            .Visible = Not .Visible
            .SetFocus
        End With
    End If
End Sub
module userform
VB:
Dim cl As FormSelfReactivate


Private Sub UserForm_Activate()
    Image1.Picture = Application.CommandBars.GetImageMso("HappyFace", 50, 50)'j'aime bien il est rigolo
    Set cl = New FormSelfReactivate
    cl.init Me
End Sub
et oui maintenant ça doit revenir hein
c'est quoi déjà l'expression?
Bonnet blanc blanc bonnet c'est ça ?
patrick
😉
 

Pièces jointes

Si je manque de barrettes mémoires, tu manques de puissance CPU
1736380484042.gif
.
Faire du MouseMove sur tous les contrôles c'est sortir le canon Ceasar de 155mm pour faire peur à une mouche sur le toit du camion. Évidemment que j'ai y pensé (pour le Control concerné), tu ne veux quand même pas que je te rappelle le lien de ma ressource sur les Enter/Exit de Controls de UserForm. Mais je n'ai pas osé la disproportion des moyens face à l'enjeu minuscule d'une situation qui n'a quasi-aucune chance de se produire car personne ne met un Control en limite de UserForm. Et même si c'est le cas, que le Control ne soit pas réactivé, ça n'a pas tellement d'importance.
 
ok comme tu veux
et non je n'ai pas besoin que tu me rappelle ta ressource qui est basée sur ce que je t'ai proposé dans la discussion qui la précédée malgré que ce jour là tu m'a tenu le même type de discours que le canon de césar pour exploser la mouche
je manque peut être de plusieurs choses je sais pas mais surtout pas de mémoire
sur ce point crois moi je suis plutôt bien outillé

donc tu ne suis plus ce projet ,il n'est donc pas nécessaire que je donne le hook global
 
Notre forum d’entraide est 100 % gratuit et le restera.
Aucune formation payante, aucun fichier à acheter, rien à vendre. Mais comme tout site, nous devons couvrir nos frais pour continuer à vous accompagner.
Soutenez-nous en souscrivant à un compte membre : c’est rapide, vous choisissez simplement votre niveau de soutien et le tour est joué.

Je soutiens la communauté et j’accède à mon compte membre
Retour