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
 
Merci @Nicolas JACQUIN pour ton code du Post #15.
Il a quand même des airs de famille avec mon code du Post #14. 😉

@Dranreb, j'avais aussi pensé à utiliser ce Controls.Count mais tu peux avoir dans le Count des Controls qui ne sont pas activables (ex d'un Label ou d'une Image). D'ailleurs j'ai toujours un crash sur cette Page 2:
VB:
Function GetActiveControl(Obj As Object) As MSForms.Control
   If Obj.Controls.Count = 0 Then Exit Function
   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
1755460209277.png
1755460405177.png

De plus, il y a toujours un Control Actif "final" me semble-t-il, même si ce Control est une Page d'un MultiPage. Et il peut être intéressant de le connaître. Le code du Post #14 le retourne.
 
Dernière édition:
Bon alors je mettrais On Error Resume Next et derrière If Err Then Set GetActiveControl = Obj: Exit Function
VB:
Function GetActiveControl(Obj As Object) As MSForms.Control
   On Error Resume Next
   Set GetActiveControl = Obj.ActiveControl
   If Err Then Set GetActiveControl = Obj: Exit Function
   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
 
Dernière édition:
Ok, ça, ça fonctionne (je suis le testeur de @Dranreb 😅)
VB:
Function GetActiveControl(Obj As Object) As MSForms.Control
   Set GetActiveControl = Obj.ActiveControl
   If GetActiveControl Is Nothing Then Set GetActiveControl = Obj: Exit Function
   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
 
Ok, ça, ça fonctionne (je suis le testeur de @Dranreb 😅)
VB:
Function GetActiveControl(Obj As Object) As MSForms.Control
   Set GetActiveControl = Obj.ActiveControl
   If GetActiveControl Is Nothing Then Set GetActiveControl = Obj: Exit Function
   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
et bien c'est pas si mal en appel récursif
voila comme quoi tu vois pas besoin de nom
on contourne le parent pour le multipage avec son page(index de value)
pour le reste c'est activecontrol.activecontrol

terminé

👍
 
On peut même gagner une instruction qui dépareille cette jolie succession de tests, surtout qu'elle vient après un ":" disgracieux (à mon goût).
VB:
Function GetActiveControl(Obj As Object) As MSForms.Control
   Set GetActiveControl = Obj.ActiveControl
   If GetActiveControl Is Nothing Then Set GetActiveControl = Obj
   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
 
tu peux l’écrire avec un joli switch avec ligne interrompue + indentation pour une lisibilité et modification(ajout supression) aisée
VB:
Function GetActiveControl(Obj As Object) As MSForms.Control
    Set GetActiveControl = Obj.ActiveControl
    If GetActiveControl Is Nothing Then Set GetActiveControl = Obj
    Set GetActiveControl = Switch( _
                                  GetActiveControl Is MSForms.Frame, GetActiveControl(GetActiveControl), _
                                  GetActiveControl Is MSForms.MultiPage, GetActiveControl(GetActiveControl.SelectedItem) _
                                  )
End Function
 
- 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