Forcer saisie numerique dans toutes les textbox de l'USF

PEX

XLDnaute Occasionnel
Bonjour a tous,

je viens vers vous pour avoir une a niveau au niveau de mon code.
je voudrais forcer la saisie numerique dans toutes les textbox de mon USF. j'ai reussi mais je trouve le code long et je pense qu'il y a un moyen de faire plus cours.

Code:
Private Sub textbox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If InStr("1234567890,-", Chr(KeyAscii)) = 0 Then KeyAscii = 0
End Sub
Private Sub textbox3_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If InStr("1234567890,-", Chr(KeyAscii)) = 0 Then KeyAscii = 0
End Sub
Private Sub textbox4_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If InStr("1234567890,-", Chr(KeyAscii)) = 0 Then KeyAscii = 0
End Sub
Private Sub textbox5_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If InStr("1234567890,-", Chr(KeyAscii)) = 0 Then KeyAscii = 0
End Sub
Private Sub textbox6_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If InStr("1234567890,-", Chr(KeyAscii)) = 0 Then KeyAscii = 0
End Sub
Private Sub textbox7_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If InStr("1234567890,-", Chr(KeyAscii)) = 0 Then KeyAscii = 0
End Sub
Private Sub tbmontee_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If InStr("1234567890,-", Chr(KeyAscii)) = 0 Then KeyAscii = 0
End Sub
Private Sub tbdescente_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If InStr("1234567890,-", Chr(KeyAscii)) = 0 Then KeyAscii = 0
End Sub
Private Sub tbmontee2_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If InStr("1234567890,-", Chr(KeyAscii)) = 0 Then KeyAscii = 0
End Sub
Private Sub tbmontee3_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If InStr("1234567890,-", Chr(KeyAscii)) = 0 Then KeyAscii = 0
End Sub

on est d'accord obligé il y a plus simple :p

Cordialement

Pex
 

david84

XLDnaute Barbatruc
Re : Forcer saisie numerique dans toutes les textbox de l'USF

Bonsoir,
créer un module de classe nommé TxtBox et y placer ce code :
Code:
Public WithEvents TBox As MSForms.TextBox

Private Sub TBox_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If InStr("1234567890,-", Chr(KeyAscii)) = 0 Then KeyAscii = 0
End Sub

Dans le code du formulaire :
Code:
Dim ColTBox As Collection

Private Sub UserForm_Initialize()
Dim Ctrl As MSForms.Control
Dim MyCtrl As TxtBox
Set ColTBox = New Collection
For Each Ctrl In Me.Controls
    If TypeOf Ctrl Is MSForms.TextBox Then
        Set MyCtrl = New TxtBox
        Set MyCtrl.TBox = Ctrl
        ColTBox.Add MyCtrl
    End If
Next Ctrl
End Sub
A+
 

Pièces jointes

  • Saisie_numerique_dans_les_TextBox.xls
    42.5 KB · Affichages: 106

jeanba

XLDnaute Occasionnel
Bonjour à tous!

J'ai un souci similaire à ce qui est traité ici.
Cependant, je ne veux pas appliquer le forçage de la saisie numérique sur tous les TextBox de mon USF, mais sur les ceux allant de 1 à 10 par exemple.
Ma boucle de contrôle me retourne des erreurs!!!

En reprenant l'exemple du fichier ci-dessus où il y a 3 textbox. Imaginons que je veux que le contrôle de saisie numérique ne s'applique qu'aux textbox 2 et 3..
Merci par avane
 

youky(BJ)

XLDnaute Barbatruc
Bonjour Jeanba,
Une ligne en plus dans le code
Bruno
VB:
Private Sub UserForm_Initialize()
Dim Ctrl As MSForms.Control
Dim MyCtrl As TxtBox
Set ColTBox = New Collection
For Each Ctrl In Me.Controls
    If TypeOf Ctrl Is MSForms.TextBox Then
    If Val(Replace(Ctrl.Name, "TextBox", "")) > 10 Then Exit Sub
        Set MyCtrl = New TxtBox
        Set MyCtrl.TBox = Ctrl
        ColTBox.Add MyCtrl
    End If
Next Ctrl
End Sub
 

jeanba

XLDnaute Occasionnel
Bonjour Bruno, bonjour le fil,

Merci pour ta réponse.
Cependant, cette solution génère le message d'erreur suivant:

upload_2018-10-8_19-26-39.png


Lorsque je clique sur Débogage, voici la procédure qu'il surligne:

upload_2018-10-8_19-27-41.png


Car, j'ai dans l'USF des frames et à la Frame 7, j'ai besoin de calculer des choses et afficher les résultats dans des labels (en suivant le conseil de Dranreb..).

upload_2018-10-8_19-24-20.png


J'en ai de ces Private Sub xx_Change autant de fois que de TextBox concernés (à savoir 13).

Du coup, sais plus quoi faire..

Merci par avance.

Jeanba
 

jeanba

XLDnaute Occasionnel
Bonsoir.
Information: Il y a déjà une TBx_KeyPress dans le module de classe TBxNum proposé dans l'autre discussion. Elle transforme seulement le point du pavé numérique en virgule.

C'est tout à fait vrai, sauf que je vous y disais ne pas être en mesure de n'appliquer ce traitement qu'à certains TextBox.
J'ai essayé et j'ai perdu quasiment une journée dessus sans succès.
Chaque fois c'est des messages du genre incompatibilité de type et ça finit par prendre un peu la tête...
 

Dranreb

XLDnaute Barbatruc
Seulement à certaines TextBox ajoutées à l'objet CollectionTBxNum ?
Si j'ai appelé ces objets TBxNum c'est parce qu'il sont dédiés au TextBox destinées aux infos numériques. Il ne faut donc pas faire de Add pour des TextBox servant à autre chose.
On pourrait envisager plein d'améliorations, ajouter des propriétés supplémentaires à l'objet TBxNum, reporter d'autres évènements des TextBox en évènements de l'objet CollectionTBxNum si vous voulez, pour que ce soit l'UserForm qui puisse les traiter.
 
Dernière édition:

jeanba

XLDnaute Occasionnel
Si j'ai appelé ces objets TBxNum c'est parce qu'il sont dédiés au TextBox destinées aux infos numériques.

Là est justement mon souci, car l'USF contient d'autres TextBox avec des valeurs numeriques comme les codes postaux tél...mais qui ne sont pas à inclure dans mes paramètres de calculs.

J'ai actuellement ceci (ça fonctionne mais c'est lourd et puis le Total ne se met pas à jour en événement Change avec les TextBox):

VB:
rivate Sub UserForm_Initialize()

' CONCERNCE : Procédure de Chargement du formulaire

' ********************************************
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationAutomatic
' Désactiver le formulaire à l'ouverture
' --------------------------------------------------
'    For i = 1 To 4
'        Me.Controls("Frame" & i).Enabled = False
'    Next
   
'    For i = 6 To 7
'        Me.Controls("Frame" & i).Enabled = False
'    Next

'    ENREGISTRER.Enabled = False
'    Me.Frame8.Enabled = False
'    Me.Frame9.Enabled = False

' Titre du Formulaire et informations clé de base
' ---------------------------------------------------------

' FRAME N° 1 : Des informations juridiques par défaut sur le dossier
' --------------------------------------------------------------------------------
   
' FRAME N°2 : Des informations comptables et fiscales par défaut
' ----------------------------------------------------------------------------------------
    
' FRAME N°3 : Autres info administratives sur le dossier
' ----------------------------------------------------------------------------------
    
' FRAME N°4 : Des visas et sécurités des clôtures
' -----------------------------------------------------------------
   
' FRAME N°7 : De l'Inventaire N-1
' --------------------------------------------
    USF18_TextBox1.Value = [INV_NbB10000].Value
    USF18_TextBox2.Value = [INV_NbB5000].Value
    USF18_TextBox3.Value = [INV_NbB2000].Value
    USF18_TextBox4.Value = [INV_NbB1000].Value
    USF18_TextBox5.Value = [INV_NbB500].Value
    USF18_TextBox6.Value = [INV_NbP500].Value
    USF18_TextBox7.Value = [INV_NbP100].Value
    USF18_TextBox8.Value = [INV_NbP50].Value
    USF18_TextBox9.Value = [INV_NbP25].Value
    USF18_TextBox10.Value = [INV_NbP10].Value
    USF18_TextBox11.Value = [INV_NbP5].Value
    USF18_TextBox12.Value = [INV_NbP2].Value
    USF18_TextBox13.Value = [INV_NbP1].Value
'   -------------------------------------------------------------'
'   Format pièces                                                '
'   -------------------------------------------------------------'
    Label192.Caption = Format(CDbl(USF18_TextBox1.Value * 10000), "### ### ##0  ")
    Label193.Caption = Format(CDbl(USF18_TextBox2.Value * 5000), "### ### ##0  ")
    Label194.Caption = Format(USF18_TextBox3.Value * 2000, "### ### ##0  ")
    Label195.Caption = Format(USF18_TextBox4.Value * 1000, "### ### ##0  ")
    Label196.Caption = Format(USF18_TextBox5.Value * 500, "### ### ##0  ")
    Label197.Caption = Format(USF18_TextBox6.Value * 500, "### ### ##0  ")
    Label198.Caption = Format(USF18_TextBox7.Value * 100, "### ### ##0  ")
    Label199.Caption = Format(USF18_TextBox8.Value * 50, "### ### ##0  ")
    Label200.Caption = Format(USF18_TextBox9.Value * 25, "### ### ##0  ")
    Label201.Caption = Format(USF18_TextBox10.Value * 10, "### ### ##0  ")
    Label202.Caption = Format(USF18_TextBox11.Value * 5, "### ### ##0  ")
    Label203.Caption = Format(USF18_TextBox12.Value * 2, "### ### ##0  ")
    Label204.Caption = Format(USF18_TextBox13.Value * 1, "### ### ##0  ")
   
    Label205.Caption = Format((CDbl(Label192.Caption) + _
    CDbl(Label193.Caption) + CDbl(Label194.Caption) + _
    CDbl(Label195.Caption) + CDbl(Label196.Caption) + _
    CDbl(Label197.Caption) + CDbl(Label198.Caption) + _
    CDbl(Label199.Caption) + CDbl(Label200.Caption) + _
    CDbl(Label201.Caption) + CDbl(Label202.Caption) + _
    CDbl(Label203.Caption) + CDbl(Label204.Caption)), "### ### ##0  ")


' FRAME N°8 : Des Droits d'utilisation / Licence
' ---------------------------------------------------------------
    Application.Calculation = xlManual   
    Application.DisplayAlerts = False
    Application.ScreenUpdating = True
End Sub

Private Sub USF18_TextBox1_Change()
If Not IsNumeric(Me.USF18_TextBox1) Then
    USF18_TextBox1.Value = ""
Else
    Label192.Caption = Format(CDbl(USF18_TextBox1.Value * 10000), "# ### ###")
End If

End Sub

Private Sub USF18_TextBox2_Change()
If Not IsNumeric(Me.USF18_TextBox2) Then
    USF18_TextBox2.Value = ""
Else
Label193.Caption = Format(CDbl(USF18_TextBox2.Value * 5000), "# ### ###")
End If
End Sub

Private Sub USF18_TextBox3_Change()
If Not IsNumeric(Me.USF18_TextBox3) Then
    USF18_TextBox3.Value = ""
Else
Label194.Caption = Format(CDbl(USF18_TextBox3.Value * 2000), "# ### ###")
End If
End Sub

Private Sub USF18_TextBox4_Change()
If Not IsNumeric(Me.USF18_TextBox4) Then
    USF18_TextBox4.Value = ""
Else
Label195.Caption = Format(CDbl(USF18_TextBox4.Value * 1000), "# ### ###")
End If
End Sub

Private Sub USF18_TextBox5_Change()
If Not IsNumeric(Me.USF18_TextBox5) Then
    USF18_TextBox5.Value = ""
Else
Label196.Caption = Format(CDbl(USF18_TextBox5.Value * 500), "# ### ###")
End If
End Sub

Private Sub USF18_TextBox6_Change()
If Not IsNumeric(Me.USF18_TextBox6) Then
    USF18_TextBox6.Value = ""
Else
Label197.Caption = Format(CDbl(USF18_TextBox6.Value * 500), "# ### ###")
End If
End Sub

Private Sub USF18_TextBox7_Change()
If Not IsNumeric(Me.USF18_TextBox7) Then
    USF18_TextBox7.Value = ""
Else
Label198.Caption = Format(CDbl(USF18_TextBox7.Value * 100), "# ### ###")
End If
End Sub

Private Sub USF18_TextBox8_Change()
If Not IsNumeric(Me.USF18_TextBox8) Then
    USF18_TextBox8.Value = ""
Else
Label199.Caption = Format(CDbl(USF18_TextBox8.Value * 50), "# ### ###")
End If
End Sub

Private Sub USF18_TextBox9_Change()
If Not IsNumeric(Me.USF18_TextBox9) Then
    USF18_TextBox9.Value = ""
Else
Label200.Caption = Format(CDbl(USF18_TextBox9.Value * 25), "# ### ###")
End If
End Sub
Private Sub USF18_TextBox10_Change()
If Not IsNumeric(Me.USF18_TextBox10) Then
    USF18_TextBox10.Value = ""
Else
Label201.Caption = Format(CDbl(USF18_TextBox10.Value * 10), "# ### ###")
End If
End Sub

Private Sub USF18_TextBox11_Change()
If Not IsNumeric(Me.USF18_TextBox11) Then
    USF18_TextBox11.Value = ""
Else
Label202.Caption = Format(CDbl(USF18_TextBox11.Value * 5), "# ### ###")
End If
End Sub

Private Sub USF18_TextBox12_Change()
If Not IsNumeric(Me.USF18_TextBox12) Then
    USF18_TextBox12.Value = ""
Else
Label203.Caption = Format(CDbl(USF18_TextBox12.Value * 2), "# ### ###")
End If
End Sub

Private Sub USF18_TextBox13_Change()
If Not IsNumeric(Me.USF18_TextBox13) Then
    USF18_TextBox13.Value = ""
Else
Label204.Caption = Format(CDbl(USF18_TextBox13.Value * 1), "# ### ###")
End If
End Sub
Private Sub Ville_Change()
    Ville.Value = Application.WorksheetFunction.Proper(Ville)
End Sub
Private Sub Adresse_Change()
    Adresse.Value = Application.WorksheetFunction.Proper(Adresse)
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode = 0 Then Cancel = 1
End Sub

' Je formule 3 souhaits:
' 1° qu'il me soit possible de réduire en une seule procédure, tous les événements TextBox_Change() des TextBox allant de USF18_TextBox1 à  USF18_TextBox13
' 2° que la valeur de USF18.Label205.Caption en soit affectée automatiquement
' 3° qu'il eut été possible de réduire également par un code magique la formule-ci:
 '   Label205.Caption = Format((CDbl(Label192.Caption) + _
 '   CDbl(Label193.Caption) + CDbl(Label194.Caption) + _
 '   CDbl(Label195.Caption) + CDbl(Label196.Caption) + _
 '   CDbl(Label197.Caption) + CDbl(Label198.Caption) + _
 '   CDbl(Label199.Caption) + CDbl(Label200.Caption) + _
 '   CDbl(Label201.Caption) + CDbl(Label202.Caption) + _
 '   CDbl(Label203.Caption) + CDbl(Label204.Caption)), "### ### ##0  ")

Merci par avance

Jeanba
 

Dranreb

XLDnaute Barbatruc
Remarquez, je suis en train d'écrire deux modules de classe TextBoxLiées et TextBoxMmbr qui permettraient de spécifier toutes les TextBox.
L'évènement KeyPress est retransmis à l'UserForm pour qu'il le traite lui même. C'est écrit dans le même esprit et conçu pour fonctionner en collaboration avec un objet ComboBoxLiées. Avez vous tapé ce mot dans la zone Rechercher… ?
 

Pièces jointes

  • TBxL.xlsm
    29.1 KB · Affichages: 55

jeanba

XLDnaute Occasionnel
Colossal!

Je vois toute l'utilité d'avoirder le dev à partir des fondamentaux..
C'est promis, je vais à l'école, car j'ai pas compris grand chose.

Comment exploiter ce chef d'oeuvre pour le "connecter" à mon USF ?
Comment en tirer le meilleur profit?

Je vois que j'ai du TAF!!

Merci beaucoup Dranreb pour ce précieux partage!

Jeanba
 

Dranreb

XLDnaute Barbatruc
Ben du coup, avec les modules de classe pour les ComboBox et pour les TextBox, dans l'UserForm il n'y aura plus grand chose. Le plus gros sera dans l'UserForm_Initialise. Le tableau à mettre à jour sera détenu par le ComboBoxLiées. Il faudra donc un CL.Plage QelqueChose pour l'en informer.
Si sa plage aura été mises sous forme de tableau Excel, les titres des colonnes pourront être spécifiés en guise de colonnes aux CL.Add ComboBoxX, Colonne comme aux TL.Add TextBoxY, Colonne.
Déclarez en variables globales Private WithEvents CL as ComboBoxLiées, WithEvents TL As TextBoxLiées, LCou As Long, TVL()
LCou servira à contenir le numéro de la ligne en cours de mise à jour, TVL sera le tableau des valeurs de cellules de cette ligne.
Le plus fastidieux à faire ce sont les Add. Surtout si les contrôles n'ont pas de noms mnémoniques.
Le reste ne sera plus qu'une série de minuscules procédures que je veux bien faire.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour.
Une fois que vous aurez fait juste la série des .Add que je n'ai pas envie de faire, re-joignez le classeur. Je mettrai autour tout ce qu'il faut pour que ça marche.
Mettez des ComboBox pour toutes les colonnes sur lesquelles, en plus d'y saisir de nouvelles informations, vous voulez pouvoir rechercher une fiche existante, et ajoutez les au ComboBoxLiées. Leur combinaison dans une ligne sera garantie unique dans toute la base, mais on ne pourra plus en modifier un élément, sauf exigence de votre part impliquant un bouton supplémentaire pour désactiver la recherche.
J'aurais toutefois un souci avec une info qui devrait rester unique à elle seule dans toute une colonne, si elle doit être imposée non numérique à la création d'une fiche, et qu'on ne peut donc pas appliquer automatiquement, à la création, le numéro existant le plus élevé augmenté de 1.
Dites moi donc bien si c'est le cas, parce que ça interdirait de taper un nouveau truc ailleurs que d'abord dans la ComboBox de cet identifiant.
 

Discussions similaires

Réponses
20
Affichages
1 K

Statistiques des forums

Discussions
312 215
Messages
2 086 330
Membres
103 188
dernier inscrit
evebar