XL 2021 VBA - UserForm ActiveControl dans un Frame

  • 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,
J'ai une TextBox dans un Frame.
Je SetFocus sur cette TextBox et l'ActiveControl est toujours le Frame.
Comment je fais pour récupérer l'ActiveControl TextBox ?
Merci
 
Bonjour à tous

Un exemple si tu as 2 Frames nommé (Frame1 et Frame2) avec 5 textbox dans chaque frame

VB:
Private Sub UserForm_Initialize()
Frame2.TabStop = True
Frame2.TabIndex = 0
TextBox8.TabIndex = 0
End Sub

C'est le textbox8 de la frame2 qui aura le focus à l'initialisation de USF
 

Pièces jointes

c’était peut être @eric72

mais je suis certain que tout les deux en avons discuté
 
🤣 🤣 🤣 🤣
oui
je m'en souviens très bien même maintenant
c’était peut être en mp au sujet de La reprise de focus au move de la souris entre deux userforms pour reactiver un textbox avec le curseur dessus (textbox eventuellement dans la frame )
quand les frames étaient trop au bord de l'userform et qu'il fallait alors utiliser en parallèle l'event move des frames aussi
ça y est ça te revient maintenant ?
c'est pour cela que je t'avais donné cette formulation qui gère aussi bien un textbox dans un frame que dans le userform directement sans nommage du parent
set ctr=activecontrol.parent.activecontrol
si le textbox est dans un userform le .parent designe le userform et donc le .activecontrol suivant designe le textbox
si le textbox est dans un frame le .parent designe le frame et donc le .activecontrol suivant designe le textbox

pas besoins de nom
🤪
 
Je ne comprends pas... On boucle.
VB:
Private Sub UserForm_Activate()
    Me.TextBox1.SetFocus
End Sub

Private Sub UserForm_Click()
    MsgBox Me.ActiveControl.Parent.ActiveControl.Name
End Sub
1755444493053.png
 

Pièces jointes

Dernière édition:
Bonsoir.
Théoriquement un Frame ou une page de Multipage pourrait en contenir d'autres.
Alors je propose ça :
VB:
Function GetActiveControl(Obj As Object) As MSForms.Control
   Set GetActiveControl = Obj.ActiveControl
   If TypeOf GetActiveControl Is MSForms.Frame Then Set GetActiveControl = GetActiveControl(GetActiveControl)
   If TypeOf GetActiveControl Is MSForms.MultiPage Then Set GetActiveControl = GetActiveControl(GetActiveControl.SelectedItem)
   End Function
VB:
Private Sub UserForm_Activate()
   MsgBox GetActiveControl(Me).Name
   End Sub
Oups. Oublié Set pour la dernière instruction …
 
Dernière édition:
oui le .parent est implicite vu que dans un frame c'est le frame qui est renvoyé
c'est une des différences avec VB6 qui demandait le ".parent"
peut être aussi le framework pour x.x que nous avons dans win 10 à la base
bref je ne sais
en tout cas c'est bien control_renvoyé . controlactif
 
Bonsoir @Dranreb, @patricktoulon,

@Dranreb, 2 remarques:
Tu as raison, les Frame et MultiPages peuvent s'emboiter et je n'en ai pas tenu compte.

D'autre part, en MultiPage, si la Page active ne contient pas de Control activable, ton code crash comme le mien avant que je ne teste si le ActiveControl récupéré est Nothing auquel cas le ActiveControl est la Page.
1755452683570.png
 
Dernière édition:
J'ai supprimé le code précédent qui ne tenait pas compte des emboitements possibles de Frame et MultiPages.
Par contre, comme je suis un peu perdu dans les appels récursifs du code de @Dranreb, j'ai simplement fait une boucle qui tient compte soit d'une Page sans Control activable soit d'une Page dont aucun Control activable n'a encore été activé (voir remarque ci-dessous).
VB:
'-----------------------------------
'Get the ActiveControl in a UserForm
'-----------------------------------
Function GetActiveControl(UserForm As Object) As MSForms.Control
    Set GetActiveControl = UserForm.ActiveControl
    Do
        If TypeOf GetActiveControl Is Frame Then
                Set GetActiveControl = GetActiveControl.ActiveControl
        ElseIf TypeOf GetActiveControl Is MultiPage Then
            Set GetActiveControl = GetActiveControl.SelectedItem
            If Not GetActiveControl.ActiveControl Is Nothing Then Set GetActiveControl = GetActiveControl.ActiveControl
        Else
            Exit Do
        End If
    Loop
End Function

Une remarque annexe:
Dans une Page de MultiPage contenant une TextBox (par exemple), tant qu'on n'a pas cliqué/activé la TextBox, c'est la Page qui est l'ActiveControl quand on l'active. Par contre si on a cliqué/activé la TextBox au moins 1 fois, c'est toujours la TextBox qui est l'ActiveControl quand on active la Page. Excel.... !
 

Pièces jointes

Dernière édition:
Bonsoir à tous,
Je suis Patrick pour le coup, toujours écouter les parents

Dans un UserForm, si ton TextBox est dans un Frame, alors UserForm.ActiveControl renvoie le Frame, et non le contrôle enfant.
Pour récupérer le vrai contrôle actif dans la hiérarchie, il faut descendre dans les conteneurs (Frame, MultiPage, Page) jusqu’à trouver le contrôle final.

VB:
Function GetActiveControl(UserForm As Object) As MSForms.Control
    Dim Ctrl As MSForms.Control
   
    Set Ctrl = UserForm.ActiveControl
   
    Do While Not Ctrl Is Nothing
        If TypeOf Ctrl Is Frame Then
            Set Ctrl = Ctrl.ActiveControl
        ElseIf TypeOf Ctrl Is MultiPage Then
            If Not Ctrl.SelectedItem Is Nothing Then
                If Not Ctrl.SelectedItem.ActiveControl Is Nothing Then
                    Set Ctrl = Ctrl.SelectedItem.ActiveControl
                Else
                    Set Ctrl = Ctrl.SelectedItem
                End If
            End If
        ElseIf TypeOf Ctrl Is Page Then
            If Not Ctrl.ActiveControl Is Nothing Then
                Set Ctrl = Ctrl.ActiveControl
            Else
                Exit Do
            End If
        Else
            Exit Do
        End If
    Loop
   
    Set GetActiveControl = Ctrl
End Function

Nicolas
 
- 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

Réponses
5
Affichages
161
Réponses
118
Affichages
2 K
Réponses
5
Affichages
382
Réponses
1
Affichages
220
Réponses
2
Affichages
83
Retour