Positionner curseur à la suite des chiffres rentrés

david84

XLDnaute Barbatruc
Bonjour à tous,
dans un userform permettant de réunir des renseignements propres à des associations (nom, adresse, commune,...), j'ai notamment à renseigner une textbox devant contenir le n°Siret de l'association. Ce textbox est géré par différentes procédures événementielles, dont, entre autres un événement Keypress permettant de n'autoriser la saisie que de nombres (cette partie étant gérée par une fonction "Nombre") dont voici le code :
Code:
Private Sub Siret_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If Nombre(KeyAscii.Value) <> "" Then
KeyAscii = Asc(Nombre(KeyAscii.Value))
Else
KeyAscii = 0
MsgBox "Caractère interdit !", vbCritical
Cancel = True
'Siret.SelStart = 0 'positionne le curseur au début du textbox
'Siret.SelLength = Len(Siret) 'sélectionne le texte déjà entré
End If
End Sub

Cette macro fonctionne correctement mais actuellement, lorsque je fais une erreur de saisie en rentrant une lettre à la place d'un nombre et que le message "Caractère interdit !" apparait et que je ferme cette boîte de dialogue, je suis obligé de re cliquer dans la textbox pour continuer à rentrer ma suite de nombres.

Or, lorsque je ferme la boîte de dialogue, je voudrais qu'un curseur apparaisse et soit placé à la suite des nombres déjà rentrés.
J'ai placé un rem devant les essais déjà tentés (Siret.SelStart et Siret.SelLength).
Merci de me faire part de vos idées et solutions éventuelles.
A+
 

Papou-net

XLDnaute Barbatruc
Re : Positionner curseur à la suite des chiffres rentrés

Bonjour david84, Pierrot93,

David, en simplifiant ton code comme suit, ça fonctionne comme tu le souhaites :

Code:
Private Sub Siret_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If KeyAscii < 48 Or KeyAscii > 57 Then
  KeyAscii = 0
  MsgBox "Caractère interdit !", vbCritical
End If
End Sub

Tu n'as nul besoin de créer la fonction Nombre, un test de la valeur KeyAscii se suffit à lui-même.

Espérant avoir aidé.

Cordialement.
 

david84

XLDnaute Barbatruc
Re : Positionner curseur à la suite des chiffres rentrés

Re,
Pierrot:) Merci pour ta réponse. Ta solution ne donne pas le résultat escompté sur mon fichier. Je crois même l'avoir tenté auparavant mais cela ne fonctionnait pas alors que je pensais le contraire. Je me demande si cela n'est pas dû au fait que l'événement keypress "fige" la procédure (je ne sais pas comment l'expliquer et comme je débute en VBA, je suis peut-être à côté de la plaque:rolleyes:). En tout cas, j'ai l'impression qu'en se servant de Sendkeys, tu passes au textbox suivant pour revenir ensuite dans le textbox Siret, ce qui te permet de "réinitialiser" l'événement (bon si tu penses que ce n'est pas cela, n'hésite pas à me donner ton point de vue STP;))
Finalement, je suis allé cherché du coté de SendKeys et j'ai trouvé une combinaison qui me donne ce que je cherche. Voici le code :
Code:
Private Sub Siret_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If Nombre(KeyAscii.Value) <> "" Then
KeyAscii = Asc(Nombre(KeyAscii.Value))
Else
KeyAscii = 0
MsgBox "Caractère interdit !", vbCritical
Cancel = True
[B]SendKeys "{TAB}"
SendKeys "{BACKSPACE}"
SendKeys "{UP}"[/B]
End If
End Sub

Bon, il y a surement plus simple mais cela apparemment fonctionne.

Papou:) : merci pour ton intervention et je note ta remarque judicieuse.
Merci et A+;)
 

Pierrot93

XLDnaute Barbatruc
Re : Positionner curseur à la suite des chiffres rentrés

Re, bonjour Papou:)

le code ci-dessous fonctionne chez moi, ou alors quelque chose m'a échappé, fort possible du reste...

Code:
Option Explicit
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If InStr("0123456789", Chr(KeyAscii)) = 0 Then
    KeyAscii = 0
    MsgBox "Caractère interdit !", vbCritical
    With TextBox1
        .SelStart = Len(.Text)
        .SetFocus
    End With
End If
End Sub

d'autre part comprends pas ton "Cancel = True", pour moi pas un argument de l'événement en question....

@+
 

david84

XLDnaute Barbatruc
Re : Positionner curseur à la suite des chiffres rentrés

Re Papou
Le code en lui-même fonctionne mais lorsque je fais une erreur de saisie en rentrant une lettre à la place d'un nombre et que le message "Caractère interdit !" apparait et que je ferme cette boîte de dialogue, je suis obligé de re cliquer dans la textbox pour continuer à rentrer ma suite de nombres. Je n'ai donc pas le curseur qui apparaît et qui se place à la suite des nombres déjà rentrés.
C'est pour cela que je suis passé par SendKeys et là c'est ok.
Pourquoi, chez toi tu as le curseur qui se positionne à la suite des nombres déjà rentrés lorsque tu fermes la boîte de dialogue ?

Edit : Pierrot : je teste et te dis ce qu'il en est.
 

david84

XLDnaute Barbatruc
Re : Positionner curseur à la suite des chiffres rentrés

Re Pierrot
Même résultat que celui de Papou : ton code fonctionne, comme celui que j'avais initialement utilisé du reste mais je suis obligé de re-sélectionner le textbox pour continuer à rentrer mon n° siret. Or c'est cela précisément que je voulais obtenir (cf mon message initial). Maintenant même question qu'à Papou : est-ce que chez toi tu as le curseur qui se positionne à la suite des nombres déjà rentrés lorsque tu fermes la boîte de dialogue lorsque tu utilises ta macro ?
A+
Edit :
d'autre part comprends pas ton "Cancel = True", pour moi pas un argument de l'événement en question....
Merci de l'info. Une erreur sans doute due à mes tests mutiples et que je n'ai pas effacée (tu sais pour l'instant je tâtonne...:rolleyes:).
 
Dernière édition:

david84

XLDnaute Barbatruc
Re : Positionner curseur à la suite des chiffres rentrés

Re Pierrot
si, comme indiqué dans mon 1er message
Ce textbox est géré par différentes procédures événementielles, dont, entre autres un événement Keypress
J'ai 5 procédures : change, KeyDown, KeyPress, KeyUp, Exit.
Si tu veux, je peux te placer une copie du fichier mais c'est du 2007 comme la dernière fois...

Edit : pour info j'ai testé ton code et celui de papou en inactivant les 4 autres événements de la textbox et cela ne change rien : le code fonctionne mais je dois re cliquer dans la textbox pour pouvoir continuer à rentrer ma suite de nombres.
Donc si cela fonctionne chez vous, cela doit être dû à un autre événement qui ne gère pas directement la textbox Siret mais je ne vois pas lequel.
 
Dernière édition:

klin89

XLDnaute Accro
Re : Positionner curseur à la suite des chiffres rentrés

Bonsoir Pierrot93, david84, Papou-net

Essaie ceci :

Code:
Private Sub Siret_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
  If InStr("0123456789", Chr(KeyAscii)) = 0 Then KeyAscii = 0
End Sub
Klin89

Pas bien vu les réponses de Pierrot et Papounet, désolé :rolleyes:
 
Dernière édition:

david84

XLDnaute Barbatruc
Re : Positionner curseur à la suite des chiffres rentrés

Re
Merci Klin89 pour ta réponse qui s'apparente à celles fournies par Pierrot et papou.
Ci-joint comme convenu fichier contenant les explications.
En fait les codes proposés fonctionnent correctement et même celui initialement utilisé dans le fichier à partir du moment où le ShowModal de l'UserForm "Nouvelle" est placé sur True (c'est JNP;), qui m'a alerté la-dessus).
Le problème, c'est que je veux le garder sur False:rolleyes:.
Merci de me communiquer le moyen éventuel de contourner ce problème.
A+
Edit : le moyen le plus simple serait de désactiver le message d'erreur et d'être plus explicite dans le message affiché par le ContolTipText, mais peut-être -y-a-t-il d'autres possibilités...
 

Pièces jointes

  • Copie (2) de BD_JNP_DO_29_11_2010.xlsm
    112.7 KB · Affichages: 64
Dernière édition:

Papou-net

XLDnaute Barbatruc
Re : Positionner curseur à la suite des chiffres rentrés

Re Papou
Le code en lui-même fonctionne mais lorsque je fais une erreur de saisie en rentrant une lettre à la place d'un nombre et que le message "Caractère interdit !" apparait et que je ferme cette boîte de dialogue, je suis obligé de re cliquer dans la textbox pour continuer à rentrer ma suite de nombres. Je n'ai donc pas le curseur qui apparaît et qui se place à la suite des nombres déjà rentrés.
C'est pour cela que je suis passé par SendKeys et là c'est ok.
Pourquoi, chez toi tu as le curseur qui se positionne à la suite des nombres déjà rentrés lorsque tu fermes la boîte de dialogue ?

Edit : Pierrot : je teste et te dis ce qu'il en est.

Bonjour david84, Pierrot93, klin89,

Pour répondre à ta question, david, oui : chez moi le curseur se repositionne bien à la suite des nombres lorsque je ferme le message d'erreur. Mais ça ne fonctionne effectivement plus lorsque le ShowModal de l'UserForm est à False. Ca se comprend un peu, car lors de la fermeture du MsgBox, le Focus revient à la Feuille de calcul active. Et je ne vois pas, dans l'immédiat, de solution à ce problème, les essais que j'ai tentés n'aboutissant pas pas. Peut-être serait-il plus simple de conserver ShowModal à True ?

Cordialement à tous.
 

Statistiques des forums

Discussions
312 229
Messages
2 086 423
Membres
103 206
dernier inscrit
diambote