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
bonsoir
tiens c'est ma fonction ça la keyasciiX
oui sauf que celui qui la copié ne la pas fait entièrement il l'a raccourci inutilement et oui!!! quand un textbox est dans un frame le activecontrol renvoie le parent donc la frame
là vous avez la version complète
VB:
'*************************************************************************************************
'forcer les textbox en numerique seulement
Sub KeyAsciiX(keyascii)
'le vrai code ET au complet !!!!!! de patricktoulon
Dim ctrl As Object
Set ctrl = ActiveControl: If TypeName(ctrl)...
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
🤪
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
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
@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.
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.... !
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
- 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