Microsoft 365 SetFocus sur le premier Texbox vide de la Frame

Piment

XLDnaute Occasionnel
Bonjour à tous, pensée particulière pour Job75.
Je reviens vers vous une fois encore afin de m'aider à solutionner une difficulté que je rencontre.
Je voudrais que dès la sortie( par Tabulation) de la combobox, le focus soit mis sur le premier TextBox vide de la Frame de mon Usf.
Actuellement dès la sortie par Tab ou Entrer, le focus est mis sur le premier TextBox de la Frame.
Ci-joint un fichier minimaliste de mon fichier de base. Le but est de donner plus de fluidité à la saisie.
Par avance merci de votre sollicitude.
 

Pièces jointes

  • Essai4.xlsm
    50.5 KB · Affichages: 15
Solution
Re à tous,
Ca y est!
Les codes fournis par Fanch55, apparemment, fonctionnent après quelques modifications.
J'ai gardé tous mes codes de départ, et j'ai inséré les codes de la Frame de Fanch55.
Têtu comme je suis, je suis resté sur mon idée de départ, tout en restant attentif à ce que vous me proposiez.
C'est-à-dire à la sortie de la comboBox, la Frame avait le Focus (Menu: Ordre de Tabulation). Il fallait donc lui demander de balayer les TextBox jusqu'au premier TexBox vide et de lui faire prendre le Focus.
Apparemment c'est ce que fait les codes de Fanch55.
Je vous mets le fichier en pièces jointes. Si vous pouvez me confirmer, ou si vous pensez qu'à terme il pourrait avoir problème, merci de me faire savoir.

patricktoulon

XLDnaute Barbatruc
@ChTi160
le keydown du textbox sans la virgule
VB:
Private Sub TbX_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If UF.Controls("ComboBox1").ListIndex = -1 Then KeyCode = 0: Exit Sub
    Select Case KeyCode
    
    Case 96 To 105    'quand on apuie sur les touche de 0 à 9
        If TbX <> "" Then If CStr(Format(TbX.Value, "#0.00")) = TbX.Value Then KeyCode = 0: Exit Sub

    Case 110: KeyCode = 188    'on remplace le point par la virgule


    Case 8, 46, 13, 9
    
    Case Else: KeyCode = 0    'toute les autres touches sont bloquées
    End Select
End Sub

le keydown du textbox avec la virgule
VB:
Private Sub TbX_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If UF.Controls("ComboBox1").ListIndex = -1 Then KeyCode = 0: Exit Sub
    Select Case KeyCode
    
    Case 96 To 105    'quand on apuie sur les touche de 0 à 9
        If TbX <> "" Then If CStr(Format(TbX.Value, "#0.00")) = TbX.Value Then KeyCode = 0: Exit Sub

    Case 110: KeyCode = 188    'on remplace le point par la virgule

    case 188 'if instr(tbx.text ,",")>0 then keycode =0
 
    Case 8, 46, 13, 9
    
    Case Else: KeyCode = 0    'toute les autres touches sont bloquées
    End Select
End Sub
tout simplement
quand on met rien dans le case la touche est alors acceptée mais le fonctionnement du textbox est celui d'origine tout simplement
par contre si on veux eviter de taper 2 fois la virgule on bloque le keycode à 0 si le caractères"," est déjà present
 

patricktoulon

XLDnaute Barbatruc
Re
Donc pas de gestion du point et de la virgule ?
Autre question à Patrick
Dans mon modeste fichier, j'avais trouvé utile de gérer les Touches de la Ligne de Chiffres (il y a des PC qui n'ont pas de Pavé , je crois !

Jean marie
ben tu ajoute un case tout simplement
case 48 to 57'balbalbla
ou
tu le merge au case 96 to 105

exemple le keydown complet de la combo avec le msgbox

VB:
'si on tape sur les touches numeriques la liste se reduit aux occurences du même  LEFT que le  VALUE
Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    Dim s&, txt$
    With ComboBox1
        Select Case (KeyCode)
        Case 96 To 105, 48 To 57   '  ici c'est les touches de 0  à 9
            If KeyCode < 96 Then KeyCode = KeyCode + 48
            Select Case Len(.Value): Case 2, 5, 8, 11: .Value = .Value & " ": End Select
            .Value = .Value & Chr(KeyCode - 48)
            Select Case Len(.Value): Case 2, 5, 8, 11: .Value = .Value & " ": End Select
            txt = .Text
            partListe
            KeyCode = 0
            tbxligne = ""
            .DropDown
            If .ListCount = 0 Then
                .Text = Left(.Text, Len(.Text) - 1)
                MsgBox txt & vbCrLf & "Aucune occurence disponnible" & vbCrLf & "pour ce début de numéro": .SetFocus
            End If
        Case 8
            'If .ListCount = 1 Then .Value = ""
            If Right(.Value, 1) = " " Then s = 2 Else s = 1
            If .Value <> "" Then .Value = Left(.Value, Len(.Text) - s): partListe Else .List = tbl
            KeyCode = 0
            tbxligne = ""
            If .Value = "" Then Textbox1.SetFocus: .SetFocus
        Case 46
            .Value = ""
            partListe
     Case Else: KeyCode = 0
      End Select
     End With
End Sub

le keycode du tbx(event global textbox)
VB:
Private Sub TbX_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If UF.Controls("ComboBox1").ListIndex = -1 Then KeyCode = 0: Exit Sub
    Select Case KeyCode

    Case 96 To 105, 48 To 57   'quand on apuie sur les touche de 0 à 9
        If KeyCode < 96 Then KeyCode = KeyCode + 48
        If TbX <> "" Then If CStr(Format(TbX.Value, "#0.00")) = TbX.Value Then KeyCode = 0: Exit Sub

    Case 110, 188: KeyCode = 188   'on remplace le point par la virgule
        If InStr(TbX.Text, ",") > 0 Then KeyCode = 0

    Case 8, 46, 13, 9

    Case Else: KeyCode = 0    'toute les autres touches sont bloquées
    End Select
End Sub
je sais pas si tu vois mais quand un code est bien pensé il est facile d'apporter des modifs ;)
 

ChTi160

XLDnaute Barbatruc
Pas sûr d'avoir compris donc je demande !
Quand tu mets :
VB:
    Case 96 To 105    'quand on appuie sur les touches de 0 à 9
        If TbX <> "" Then If CStr(Format(TbX.Value, "#0.00")) = TbX.Value Then KeyCode = 0: Exit Sub
cela autorise t'il la modification des Chiffres déjà entrés ? Ou alors c'était demandé ??????
Jean marie
 

patricktoulon

XLDnaute Barbatruc
Pas sûr d'avoir compris donc je demande !
Quand tu mets :
VB:
    Case 96 To 105    'quand on appuie sur les touches de 0 à 9
        If TbX <> "" Then If CStr(Format(TbX.Value, "#0.00")) = TbX.Value Then KeyCode = 0: Exit Sub
cela autorise t'il la modification des Chiffres déjà entrés ? Ou alors c'était demandé ??????
Jean marie
cela:
1° autorise les touche 0 à 9
2°annule la touche si le nombre à l'intéruer est déjà un nombre décimal à 2 decimales
 

patricktoulon

XLDnaute Barbatruc
re
et je précise par ce que c'est important
ca bloque les touche du pavé mais pas les autres touche du genre back(retour en arrire
par ce que ca se pase uniquement dans le case 96 to 105 soit les touches du pavé
mais je t'ai donné le complet dans mon message précedent avec les touche chiffre du haut du clavier si pas de pavé numerique(portable par exemple)
 

patricktoulon

XLDnaute Barbatruc
re
maintenant que tu comprends un peu mieux le principe du select case keycode dans le keydown
je n'ai pas fait une erreur mais je me sui compliqué la tache pour rien
dis moi un peu ou cela pourrait être ?
c'est assez simple ca fait parti de mes dernieres ajouts
comme quoi c'est pas parfait chez moi non plus 🤣 🤣
 

ChTi160

XLDnaute Barbatruc
Re
Je pense que piment va y regarder ! car le premier interressé ! Moi je continue d'apprendre par moi-même et je n'ai pas de base de données de code ou autre lol
Tu dis :
maintenant que tu comprends un peu mieux
et encore Lol
Je recommence à chaque fois et c'est pour cela que je suis lent lol ,jamais le même code !!! lol
Merci pour ce cours (Code que je ne réutiliserai peut-être jamais ! il faudra que je recherche en Tapant PatrickToulon et piment)
Cordialement
Jean marie
 

patricktoulon

XLDnaute Barbatruc
je ne sais pas si tu te rends compte qu'en un seul event le Keydon j'ai le format et l'intuitivitéet les touches selectionnées et d'autres touches exeptées

imagine ce qui tente encore aujourd'hui de le faire dans le change 🤣 🤣 🤣 🤣
et je précise que c'est possible mais au moyen d'un algo bien tordu qui consiste a utiliser la mémorisation dans le tag en profitant du (value avant/apres)
mais comme c'est bien tordu je vous entrainerais pas sur ce terrain glissant
🤣🤣

Alors tu a trouvé ou j'ai fait du yaourt

Re
Je pense que piment va y regarder ! car le premier interressé ! Moi je continue d'apprendre par moi même et je n'ai pas de base de données de code ou autre lol
je recommence a chaque fois et c'est pour cela que je suis lent lol ,jamais le même code !!! lol
Merci pour ce cours !
Jean marie
prend une cle usb de 4 giga ça suffit ca coute 5 balles
quand tu a aboutie a un code réutilisable dans d'autre app ou contexte tu le sauve en txt
tu te sert de ta base quand tu en a besoins
bon aujourd'hui moi j'ai 2 terra 🤣🤣
mais bon je suis un peu passioné (trop peut être)🤣

de faire le même code ou pas c'est pas grave c'est le raisonnement qui faut retenir
 

ChTi160

XLDnaute Barbatruc
Re
Pour finir, je m'amuse d'abord avec ces Fichiers et quand ça ne m'amuse plus souvent le demandeur a disparu et ça ne pose aucun problème Lol
Je ne suis peut-être pas un passionné, mais je tente avec mes petits moyens d'aider. Cela depuis un jour de 2005.
Et je ne suis pas encore lassé Lol
ca durera le temps que ça dure !
Cordialement
Jean marie
Ps : tu dis : "Alors tu a trouvé ou j'ai fait du yaourt"
je dis : "Non j'ai pas cherché !"
T'inquiète : Ce n'est pas un problème 😂
mets la réponse pour piment .....
 

patricktoulon

XLDnaute Barbatruc
re
ben oui apprendre en s'amusant c'est toujours plus agréable
tu n'a pas trouvé ou je me suis cassé la tête pour rien ?
allez je t'aide
les lignes incriminées ont des "???"
comment j'aurais du faire?
VB:
'si on tape sur les touches numeriques la liste se reduit aux occurences du même  LEFT que le  VALUE
Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    Dim s&, txt$ '??????????????????
    With ComboBox1
        Select Case (KeyCode)
        Case 96 To 105, 48 To 57   '  ici c'est les touches de 0  à 9
            If KeyCode < 96 Then KeyCode = KeyCode + 48
            Select Case Len(.Value): Case 2, 5, 8, 11: .Value = .Value & " ": End Select
            .Value = .Value & Chr(KeyCode - 48)
            Select Case Len(.Value): Case 2, 5, 8, 11: .Value = .Value & " ": End Select
            txt = .Text '????????????????????????
            partListe
            KeyCode = 0
            tbxligne = ""
            .DropDown
            If .ListCount = 0 Then
                .Text = Left(.Text, Len(.Text) - 1) '??????????????????
                MsgBox txt & vbCrLf & "Aucune occurence disponnible" & vbCrLf & "pour ce début de numéro": .SetFocus '?????????????
            End If
        Case 8
            'If .ListCount = 1 Then .Value = ""
            If Right(.Value, 1) = " " Then s = 2 Else s = 1
            If .Value <> "" Then .Value = Left(.Value, Len(.Text) - s): partListe Else .List = tbl
            KeyCode = 0
            tbxligne = ""
            If .Value = "" Then Textbox1.SetFocus: .SetFocus
        Case 46
            .Value = ""
            partListe
        Case Else: KeyCode = 0
        End Select
    End With
End Sub
 

patricktoulon

XLDnaute Barbatruc
re
1° je supprime la variable txt
2°je supprime la ligne ou je l'instruit ,avec la valeur
3°j'inverse l'ordre de ces deux lignes
VB:
  .Text = Left(.Text, Len(.Text) - 1) '??????????????????
                MsgBox txt & vbCrLf & "Aucune occurence disponnible" & vbCrLf & "pour ce début de numéro": .SetFocus '?????????????
4° et je remplace "txt" dans la ligne du message ^par ".text"

j'économise le poids de la variable string"txt" et du code
;)
 

Discussions similaires

Statistiques des forums

Discussions
312 206
Messages
2 086 222
Membres
103 158
dernier inscrit
laufin