XL 2021 VBA - Dans un UserForm faire une SetFocus avec le Control.TabIndex

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

Existe-t-il un moyen d'identifier un Control ou de faire un SetFocus sur un Control de UserForm directement avec le Control.TabIndex ?
 
Dernière édition:
Bonjour @Dudu2

1) Pour modifier l'ordre de tabulation tu peux faire comme ceci par exemple :
VB:
For Each ctrl In Me.Controls
    ctrl.TabIndex = ctrl.TabIndex + 100
Next

'Ou bien
Dim Nb&
Nb = 100
For Each ctrl In Me.Controls
    ctrl.TabIndex = ctrl.TabIndex + Nb
Next

2) Et si tu veux sauter une tabulation
Me.TextBox1.TabStop = False

et pour la rétablir
Me.TextBox1.TabStop = True

Un peu de lecture ....
==> https://learn.microsoft.com/fr-fr/o...eral/how-to-specify-tab-support-for-a-control

==> https://learn.microsoft.com/fr-fr/o...user-interface-help/tabindex-property-example

Edit : tu as modifié ta question il me semble

Le ctrl ayant TabIndex = 0 sera le ctrl actif à l'initialisation de ton USF.
 
Salut @Dudu2 ,

Normalement, la collection Controls rassemble ceux-ci en les ordonnant par leur TabIndex .
Tu devrais pouvoir faire un setfocus avec une instruction de ce type :

VB:
    Controls(index_du_control).setfocus

Attention cependant,
les controls n'acceptant pas tous le focus,
il faut tester le TabStop avant qui doit être Vrai

Mais piège:
celui-ci, s'il est indiqué à False dans les propriétés du VBE,
provoque une erreur si on le récupère à Faux dans le code (mais pourquoi ??!!! 😭)

Il faut également que le control soit visible pour recevoir le focus,
le code ci-dessous peut t'aider à le vérifier :
VB:
Private Sub CommandButton1_Click()
Dim TbStop As Boolean
    For I = 0 To Ctl.Count
        With Me.Controls(Ctl(I))
            On Error Resume Next
                TbStop = .TabStop
                If Err Then Err.Clear: TbStop = False
            On Error GoTo 0
            If .Visible = True And TbStop Then
                Me.Controls(Ctl(I)).SetFocus
                Debug.Print "Focus", I, Me.ActiveControl.Name & " - " & Me.ActiveControl.TabIndex
            End If
        End With
    Next
End Sub

Dans cet exemple, Le Ctl est un dictionary local dans lequel j'ai récupéré tous les controls au moment de l'Initialize:
VB:
Dim Ctl As Dictionary

Private Sub UserForm_Initialize()
....
    Set Ctl = New Dictionary
    Dim C As Control
    For Each C In Me.Controls
        Ctl.Add C.TabIndex, C.Name
    Next
....
End sub
 
Dernière édition:
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

Bonjour @Phil69970, @fanch55,

Merci pour vos retours.
@Phil69970, tu as doublé ta réponse de l'autre sujet.
Alors oui, pour un SetFocus il faut faire attention au .Visible, .Enabled et au type de Control car tous ne sont pas "Focusables".
On peut récupérer l'erreur à l'occasion.

Mais surtout je viens de vérifier que dans Me.Controls(index).Tabindex, il n'y a pas systématiquement équivalence entre index et TabIndex.
Surtout si on a modifié l'ordre de tabulation dans le UserForm.
Donc a priori il faut effectivement passer par un artifice genre Dictionary avec Item = Control et Key = TabIndex.
 
Dernière édition:
S'il ne s'agit que de Focuser sur le Control suivant dans l'ordre des TabIndex, ce code a l'air de fonctionner.
Rappel: il n'y a pas correspondance entre l'index du Control dans le UserForm et son TabIndex.
VB:
Private Sub SetFocusOnNextControl(Optional AfterTabIndex As Integer = -1)
    Dim CurrentTabIndex As Integer
    Dim ErrNumber As Long
    Dim i As Integer
    Dim k As Integer
    Dim AntiLoop As Boolean
  
    If Not AfterTabIndex = -1 Then
        CurrentTabIndex = AfterTabIndex
    Else
        CurrentTabIndex = Me.ActiveControl.TabIndex
    End If
  
ScanControls:

    For k = CurrentTabIndex + 1 To Me.Controls.Count - 1 + 1
        For i = 0 To Me.Controls.Count - 1
            If Me.Controls(i).TabIndex = k Then Exit For
        Next i
      
        If i > Me.Controls.Count - 1 Then
            If AntiLoop Then Exit For
            CurrentTabIndex = -1
            AntiLoop = True
            GoTo ScanControls
        End If
      
        On Error Resume Next
        Me.Controls(i).SetFocus
        ErrNumber = Err.Number
        On Error GoTo 0
      
        If ErrNumber = 0 Then Exit For
    Next k
End Sub
 

Pièces jointes

Rappel: il n'y a pas correspondance entre l'index du Control dans le UserForm et son TabIndex.
Bonjour
ça c'est par ce que quand tu construit tu ajoute et/ou tu enlève des controls
et donc par conséquent à la fin le tabindex n'est pas celui que tu voudrais
sinon le tabindex suit TOUJOURS l'ordre dans le quel tu les a construits dans le( parent direct)
la seule chose a faire pour travailler proprement , c'est de contrôler et modifier le tabindex de tes controls à la fin
on évite ainsi des codes en cul de bouteille
et là encore une fois on cible par le parent dans le cas de frame par exemple
set ctrl=frame1.controls(x+1)'x pour la valeur de tabindex donc controls suivant DANS LA FRAME!!

sinon en vba par exemple
set ctrl=textbox1
va te donner le premier controls s'appelant "textbox1" selon bien sur le tabindex
et c'est pas forcement celui là que tu cible car il peux avoir 36 "textbox1" dans 36 frames

d'ou l'importence de modifier le nom du control à la construction
puisque sans préfixe c'est la première occurrence donc

set ctrl=Frm1TxtBox 'le nom du textbox dans la frame1
set suivant=ctrl.parent.controls(ctrl.tabindex+1)

pas de code alambiqué , du pur ciblage et indexation en bon et du forme
 
Dernière édition:
- 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

  • Question Question
Microsoft 365 affichage userform
Réponses
4
Affichages
361
Réponses
2
Affichages
169
  • Question Question
XL 2019 User Form
Réponses
9
Affichages
314
Retour