Vous utilisez un navigateur obsolète. Il se peut que ce site ou d'autres sites Web ne s'affichent pas correctement. Vous devez le mettre à jour ou utiliser un navigateur alternatif.
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 !
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
@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
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.
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
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
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
Pour le code par boucle du Post #14 point n'est besoin d'une variable Control de travail.
Et en faisant le test sur Page différemment...
Ça raccourci le code.
- 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