Dans une TextBox, saisie uniquement numérique...

Dans une TextBox, saisie uniquement numérique... - VB/VBA/VBS - Programmation

Marsh Posté le 09-06-2008 à 17:17:25    

:hello:  
 
Bonsoir à tous !
 
Je présente mon problème.
J'ai une boîte de dialogue avec des zones de saisie (TextBox).
Certaines zones ne doivent être que des valeurs numériques... et d'autres alphanumériques.
Je cherche le code permettant de bloquer la personne qui va saisir de saisir des éléments non numériques... (bien sûr la virgule est acceptée).
 
;)

Reply

Marsh Posté le 09-06-2008 à 17:17:25   

Reply

Marsh Posté le 09-06-2008 à 18:52:48    

Salut


Option Explicit
 
Const entrees_decimales_permises = ".,0123456789" & vbCr & vbBack
Const entrees_entieres_permises = "0123456789" & vbCr & vbBack
Const Point = "."
Const Virgule = ","
 
' Remplace une saisie accidentelle d'un POINT par une VIRGULE
' permet donc l'utilisation du pavé numérique et n'admettra  
' pas la saisie d'un second séparateur décimal  
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    If KeyAscii = Asc(Point) Then
        If InStr(TextBox1, Virgule) = 0 Then
            KeyAscii = Asc(Virgule)
        Else
            KeyAscii = 0
        End If
    ElseIf InStr(entrees_decimales_permises, Chr(KeyAscii)) = 0 Then
        KeyAscii = 0
    ElseIf InStr(TextBox1, Virgule) > 0 And KeyAscii = Asc(Virgule) Then
        KeyAscii = 0
    End If
     
    If KeyAscii = 13 Then SendKeys "{TAB}": KeyAscii = 0
End Sub
 
Private Sub TextBox2_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    If InStr(entrees_entieres_permises, Chr(KeyAscii)) = 0 Then KeyAscii = 0
 
    If KeyAscii = 13 Then SendKeys "{TAB}": KeyAscii = 0
End Sub

Message cité 1 fois
Message édité par kiki29 le 09-06-2008 à 18:53:19
Reply

Marsh Posté le 09-06-2008 à 22:08:48    

kiki29 a écrit :

Salut


Option Explicit
 
Const entrees_decimales_permises = ".,0123456789" & vbCr & vbBack
Const entrees_entieres_permises = "0123456789" & vbCr & vbBack
Const Point = "."
Const Virgule = ","
 
' Remplace une saisie accidentelle d'un POINT par une VIRGULE
' permet donc l'utilisation du pavé numérique et n'admettra  
' pas la saisie d'un second séparateur décimal  
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    If KeyAscii = Asc(Point) Then
        If InStr(TextBox1, Virgule) = 0 Then
            KeyAscii = Asc(Virgule)
        Else
            KeyAscii = 0
        End If
    ElseIf InStr(entrees_decimales_permises, Chr(KeyAscii)) = 0 Then
        KeyAscii = 0
    ElseIf InStr(TextBox1, Virgule) > 0 And KeyAscii = Asc(Virgule) Then
        KeyAscii = 0
    End If
     
    If KeyAscii = 13 Then SendKeys "{TAB}": KeyAscii = 0
End Sub
 
Private Sub TextBox2_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    If InStr(entrees_entieres_permises, Chr(KeyAscii)) = 0 Then KeyAscii = 0
 
    If KeyAscii = 13 Then SendKeys "{TAB}": KeyAscii = 0
End Sub



 
Salut kiki29 !
 
Merci pour le code, je vais essayer cela.
Par contre, je le place où ?
Dans le This Workbook, dans le code de la boîte de dialogue concernée ?
 ;)


---------------
iMac 4Ghz (fin 2015) RAM 16Go SSD 256Go SSD 2To
Reply

Marsh Posté le 09-06-2008 à 22:23:20    

Bon, j'ai placé ton astuce au début du code de ma boîte de dialogue... et ça marche... cool.
Faut juste que je le copie 55 fois car j'ai 55 zone de saisie où il ne doit y avoir que des nombres.
Maintenant, j'ai une autre question.
Quand je saisis le nombre "25,25" et que je tabule, la donnée saisie est bien "25,25"... logique...  :D  
Quand je saisis "25,1" (ou "25" tout court) et que je tabule, la donnée saisie est "25,1" (ou "25" )... toujours logique...  :D  :D  
Mais j'aimerais que pour le "25,1" (ou "25" ), la donnée devienne "25,10" (ou "25,00" )... que la valeur soit constamment à 2 virgules...  :cry:  
Un peu comme quand on formate une cellule Excel avec 2 virgules et que - quelque soit la valeur saisie - on a toujours 2 virgules...
Et - grand luxe - qu'il y est le séparateur des milliers...  :p quand je tape "1524", j'aimerais "1 524" et non "1524"...


Message édité par scaryfan le 09-06-2008 à 22:25:17

---------------
iMac 4Ghz (fin 2015) RAM 16Go SSD 256Go SSD 2To
Reply

Marsh Posté le 09-06-2008 à 22:41:47    

Salut voir avec TextBox1_AfterUpdate() ou TextBox1_Exit et Format(TextBox1.Text, "##,##0.00" )

Message cité 1 fois
Message édité par kiki29 le 09-06-2008 à 22:48:29
Reply

Marsh Posté le 09-06-2008 à 23:08:02    

kiki29 a écrit :

Salut voir avec TextBox1_AfterUpdate() ou TextBox1_Exit et Format(TextBox1.Text, "##,##0.00" )


 
Merci, je vais essayer... ;)


---------------
iMac 4Ghz (fin 2015) RAM 16Go SSD 256Go SSD 2To
Reply

Marsh Posté le 10-06-2008 à 08:51:57    

:hello:  
 
J'ai ce code :
 

Code :
  1. Private Sub R001_AfterUpDate()
  2.     If R002.Text = "" Then R001.Text = 0
  3.     Format (R001.Text, "##,##0.00" )
  4.      
  5. End Sub


 
Mais ça ne marche pas... j'ai le message 'Erreur de compilation : erreur de syntaxe' et la ligne "Format" se met en rouge...
Quand je passe à la ligne, il y a un nouveau message : 'Erreur de compilation - Attendu:='
Quel est le souci ???
 
 :??:  
 
Ma TextBox s'appelle R001...
 :??:


---------------
iMac 4Ghz (fin 2015) RAM 16Go SSD 256Go SSD 2To
Reply

Marsh Posté le 10-06-2008 à 09:15:34    

Salut, c'est vrai je sous-entendais TextBox1.Text=Format (TextBox1.Text, "##,##0.00" )

Message cité 1 fois
Message édité par kiki29 le 10-06-2008 à 09:15:59
Reply

Marsh Posté le 10-06-2008 à 09:27:54    

kiki29 a écrit :

Salut, c'est vrai je sous-entendais TextBox1.Text=Format (TextBox1.Text, "##,##0.00" )


 
Salut kiki29 !
Ca marche nickel...  :bounce:  
Une dernière question !  :p  
Le code que tu m'as donné pour interdire la saisie alpha, je dois le dupliquer par autant de TextBox contenues dans ma Form ?
Il n'y a pas moyen de mettre 'Private Sub R001, R002, R003, R004..._KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)'
ou un truc du genre ? parce que j'ai 57 Textbox dans ma Form...  :whistle:


---------------
iMac 4Ghz (fin 2015) RAM 16Go SSD 256Go SSD 2To
Reply

Marsh Posté le 10-06-2008 à 09:40:45    

Si il faudrait passer par un module de classe car le VBA Excel ne possède pas comme VB6 la possibilté de créer un groupe de controles
Je crois avoir vu qqch de ce genre sur un autre forum, je le recherche pour le moment

Reply

Marsh Posté le 10-06-2008 à 09:40:45   

Reply

Marsh Posté le 10-06-2008 à 11:18:17    

kiki29 a écrit :

Si il faudrait passer par un module de classe car le VBA Excel ne possède pas comme VB6 la possibilté de créer un groupe de controles
Je crois avoir vu qqch de ce genre sur un autre forum, je le recherche pour le moment


 
Merci pour ton aide kiki29 !!!  :hello:


---------------
iMac 4Ghz (fin 2015) RAM 16Go SSD 256Go SSD 2To
Reply

Marsh Posté le 10-06-2008 à 11:36:05    

Je n'ai pas retrouvé le post en question et ai "bricolé" qqch à améliorer
( pb de temps pour le moment )
 
Placer dans un module de classe que l'on baptisera par exemple clsTBox


Option Explicit
 
Public WithEvents GroupeTxtB As MSForms.TextBox
 
Const entrees_decimales_permises = ".,0123456789" & vbCr & vbBack
Const Point = "."
Const Virgule = ","
 
Private Sub GroupeTxtB_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
 
    If KeyAscii = Asc(Point) Then
        If InStr(GroupeTxtB.Text, Virgule) = 0 Then
            KeyAscii = Asc(Virgule)
        Else
            KeyAscii = 0
        End If
    ElseIf InStr(entrees_decimales_permises, Chr(KeyAscii)) = 0 Then
        KeyAscii = 0
    ElseIf InStr(GroupeTxtB.Text, Virgule) > 0 And KeyAscii = Asc(Virgule) Then
        KeyAscii = 0
    End If
     
    If KeyAscii = 13 Then SendKeys "{TAB}": KeyAscii = 0
End Sub


 
Placer dans une UserForm


Option Explicit
Dim TB() As New clsTBox
 
Private Sub UserForm_Initialize()
Dim TxtB As MSForms.TextBox
Dim i As Integer, iLeft As Integer, iTop As Integer
 
    iLeft = 10: iTop = 10
    For i = 1 To 5
        Set TxtB = Me.Controls.Add("Forms.Textbox.1", , True)
        With TxtB
            .Width = 150
            .Height = 25
            .Left = iLeft
            .Top = iTop
        End With
 
        iTop = iTop + 25
         
        ReDim Preserve TB(1 To i)
        Set TB(i).GroupeTxtB = TxtB
    Next i
End Sub


 
PS Evite de recopier le code dans ta réponse, cela encombre le paysage pour rien


Message édité par kiki29 le 10-06-2008 à 11:39:59
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed