Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2010 Forcer saisie de chiffres

Appo1985

XLDnaute Occasionnel
Bonjour à tous. J'ai besoin d'aide.
J'ai saisie ce code pour forcer la saisie de chiffres dans les Texbox de mon userform. Mais il ya 12 Texbox (Texbox1 à 12) et je voudrais faire la même chose pour tous les autres.
Dois-je cliquer sur chaque Texbox pour introduire le code ou y a t'il un autre moyen pour faire un seul code? Mon userform est nommé ufnote1. Merci d'avance.
Code.
Private sub Texbox1_change()
If NotNumeric(Me.Texbox1) Then
Me.Texbix1=""
End if
End sub
 

job75

XLDnaute Barbatruc
Bonjour Appo1985,

Votre code ne va pas, placez dans le code de l'UserForm :
VB:
Private Sub TextBox1_Change()
Chiffres TextBox1
End Sub

Private Sub TextBox2_Change()
Chiffres TextBox2
End Sub

Private Sub TextBox3_Change()
Chiffres TextBox3
End Sub

'----------

Sub Chiffres(TB As Object)
Dim x$, i&
x = TB
For i = Len(x) To 1 Step -1
    If Not IsNumeric(Mid(x, i, 1)) Then x = Left(x, i - 1) & Mid(x, i + 1)
Next
TB = x
End Sub
S'il y a 12 TextBox il faut 12 macros Change.

On peut l'éviter en utilisant un module de classe mais c'est une autre histoire.

A+
 

Appo1985

XLDnaute Occasionnel
Ok. Compris! Merci bien
 

JM27

XLDnaute Barbatruc
bonsoir
avec l'évènement keypress ( évènement qui se produit avant l'évènement change ; vaut mieux prévenir que guérir !!)
si l'on saisi une valeur non numérique , celle ci est inopérante
a multiplier par les 12 textbox

Code:
Private Sub TextBox1_KeyPress(ByVal Touche As MSForms.ReturnInteger)
    If InStr("0123456789", Chr(Touche)) = 0 Then Touche = 0
End Sub
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
bonjour
le problème avec l'event change c'est que tu le déclenche 2 fois
perso je pense que le forcer de saisie doit etre et toujours l'etre en amont et non post saisie
et pour cela tu a les deux events keypress et keydown qui ont en callback respectivement le keyascii et keycode qui peuvent tout simplement être annulé
tu en a 12 et 12 ou 36 et bien ....!! c'est bonnet blanc blanc bonnet
alors pour l'event keypress
mille excuse @JM17 on c'est croisés

VB:
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
AllTextbox_KeyPress KeyAscii
End Sub

Private Sub TextBox2_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
AllTextbox_KeyPress KeyAscii
End Sub

Private Sub TextBox3_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
AllTextbox_KeyPress KeyAscii
End Sub

'etc..etc..

Private Sub AllTextbox_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If Not Chr(KeyAscii) Like "[0-9,.]" Then KeyAscii = 0
End Sub

pour le keycode maintenant

VB:
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    AllTextBox_KeyDown KeyCode
End Sub

Private Sub TextBox2_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    AllTextBox_KeyDown KeyCode
End Sub

Private Sub TextBox3_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    AllTextBox_KeyDown KeyCode
End Sub

Private Sub AllTextBox_KeyDown(ByVal KeyCode As MSForms.ReturnInteger)
    Select Case KeyCode
    Case 96 To 105, 8, 9, 46, 13, 37, 39, 188, 110  ' choisir 110 ou 188 pour le separateur decimal( je laisse les deux   pour l'instant)
    Case Else: KeyCode = 0
    End Select
'96 à 105 sont les chiffre du pavé numérique
'8 c'est la touche retour en arriere
'9c'est la touche Tab
'46 c'est la touche suppr
'13 c'est la touche enter
'37 et 39 sont les flèche gauche et droite
'188 et 110 sont la virgule et le point
End Sub

a oui c'est bien l'argument en callback hein !!
perso je préfère le keydown qui me permet de gérer plus de touche
voila tu sais tout
je tiens a bien préciser que en mettant l'argument (keyascii ou keycode)a zéro la touche est annulée donc l'event change n'est pas sollicité
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
petit complement a but ecole et informatif
@job75 disait
On peut l'éviter en utilisant un module de classe mais c'est une autre histoire.
ou tout simplement classer ces textbox intra userform

pareil un userform et 3 textbox pour les texts
demo avec keypress
VB:
Public WithEvents TxtB As MSForms.TextBox
Dim cls() As New UserForm1

Private Sub UserForm_Activate()
 'pour les tests j'ai mis 3 textboxs dans le userform
Dim i&
For i = 1 To 3
 ReDim Preserve cls(1 To i)
Set cls(i).TxtB = Me.Controls("TextBox" & i)
Next
End Sub

Private Sub TxtB_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If Not Chr(KeyAscii) Like "[0-9,.]" Then KeyAscii = 0
x = InStr(1, TxtB.Value, ".") > 0 Or InStr(1, TxtB.Value, ",") > 0
If x And Chr(keyacii) Like "[!0-9]" Then KeyAscii = 0
End Sub

et pour keydown
VB:
Public WithEvents TxtB As MSForms.TextBox
Dim cls() As New UserForm2

Private Sub UserForm_Activate()
'pour les tests j'ai mis 3 textboxs dans le userform
   Dim i&
   For i = 1 To 3
        ReDim Preserve cls(1 To i)
        Set cls(i).TxtB = Me.Controls("TextBox" & i)
    Next
End Sub

Private Sub TxtB_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    Select Case KeyCode
    Case 96 To 105, 8, 9, 46, 13, 37, 39
    Case 188, 110    ' choisir 110 ou 188 pour le separateur decimal( je laisse les deux   pour l'instant)
        If TxtB Like "*[,.]*" Then KeyCode = 0
    Case Else: KeyCode = 0
    End Select
  End Sub

vous l'aurez remarqué, j'ai ajouté l'impossibilité de taper 2 fois le séparateur dans le textbox
 

patricktoulon

XLDnaute Barbatruc
re
bonsoir @job75 ça se défend mais on parle plus de saisie mais de manip souris
et il reste plusieurs problème avec ta logique (avec boucle)
par exemple quand tu tape le séparateur si décimale (même si c'est le bon pour vba ça va planter forcement )
en cas de copier coller si un caractère et venu foutre le boxon il est arbitraire de dire que seuls les numériques précédent sont bons c'est toute la chaîne qui n'est pas bonne
une bonne occasion d'utiliser shift ça
 

job75

XLDnaute Barbatruc
Bonjour le forum,

Si l'on veut autoriser l'entrée de nombres décimaux non signés :
VB:
Private Sub TextBox1_Change()
Chiffres TextBox1
End Sub

'----------

Sub Chiffres(TB As Object)
Dim ds$, x$, i&, y$, n&
ds = Application.DecimalSeparator
x = TB
For i = Len(x) To 1 Step -1
    y = Mid(x, i, 1)
    If y = ds Then n = n + 1
    If Not (IsNumeric(y) Or y = ds And n = 1) Then x = Left(x, i - 1) & Mid(x, i + 1)
Next
TB = x
End Sub
Seul le dernier séparateur décimal est conservé.

A+
 

Discussions similaires

Réponses
49
Affichages
1 K
Réponses
3
Affichages
167
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…