XL 2019 Format numérique sur plusieurs TextBox

pitufo2804

XLDnaute Junior
Bonjour,

Je suis en train de développer un formulaire sur un UserForm multipage contenant des CheckBox et des TextBox.

A l'activation de l'userform, je désactive toutes les coches existantes et cache toutes les textbox.

Je souhaite ensuite afficher une textbox en face de chaque checkbox cochée et verrouiller son contenu en format numérique.
Est-il possible de le faire sur tous les control en meme temps ou faut-il le faire sur chaque checkbox et textbox indépendamment ?

Je joins le fichier pour visualiser.

Merci de vos réponses.
 

Pièces jointes

  • Programmes.xlsm
    358.7 KB · Affichages: 11

D.D.

XLDnaute Impliqué
Est-il possible de le faire sur tous les control en meme temps ou faut-il le faire sur chaque checkbox et textbox indépendamment ?
Oups, j'ai mal lu la demande.

J'ai modifié un peu le code:

VB:
Private Sub Elec_0_Click()
    Call TextBoxOnOff(Elec_0, Elec_T_0)
End Sub

Private Sub Elec_1_Click()
    Call TextBoxOnOff(Elec_1, Elec_T_1)
End Sub

Sub TextBoxOnOff(Nom As String, Nom_T As Object)
    Nom_T.Visible = False
    If Nom = True Then Nom_T.Visible = True
End Sub
Je pense que c'est ok pour ce que tu veux.
il faudra donc reproduire le Call TextBoxOnOff(X, Y) pour tous les textBox
 

Pièces jointes

  • Programmes.xlsm
    341.5 KB · Affichages: 7

D.D.

XLDnaute Impliqué
L’événement UserForm_Click ne se déclenche pas si tu es dans un MultiPage voir même sur un contrôle.
et je ne vois pas d’événement qui se déclencherai au moindre click ou keyPress partout sur le formulaire → je pense donc qu'il faut le faire individuellement.

Ceci dit, on peut simplifier de
VB:
Private Sub Elec_1_Click()
    Call TextBoxOnOff(Elec_1, Elec_T_1)
End Sub

Sub TextBoxOnOff(Nom As String, Nom_T As Object)
    Nom_T.Visible = False
    If Nom = True Then Nom_T.Visible = True
End Sub
en
Code:
Private Sub Elec_1_Click()
    Elec_T_1.Visible = False: If Elec_1 = True Then Elec_T_1.Visible = True
End Sub
1 ligne pour chaque contrôle.
 

pitufo2804

XLDnaute Junior
L’événement UserForm_Click ne se déclenche pas si tu es dans un MultiPage voir même sur un contrôle.
et je ne vois pas d’événement qui se déclencherai au moindre click ou keyPress partout sur le formulaire → je pense donc qu'il faut le faire individuellement.

Ceci dit, on peut simplifier de
VB:
Private Sub Elec_1_Click()
    Call TextBoxOnOff(Elec_1, Elec_T_1)
End Sub

Sub TextBoxOnOff(Nom As String, Nom_T As Object)
    Nom_T.Visible = False
    If Nom = True Then Nom_T.Visible = True
End Sub
en
Code:
Private Sub Elec_1_Click()
    Elec_T_1.Visible = False: If Elec_1 = True Then Elec_T_1.Visible = True
End Sub
1 ligne pour chaque contrôle.
ouep je comprends bien... après chaque page contient ses propres box du coup je le ferai pour chaque en espérant ne pas devoir en rajouter régulièrement... Merci beaucoup pour tes réponses !
 

ChTi160

XLDnaute Barbatruc
Bonjour pitufo2804
Bonjour le Fil ,le Forum
ou en passant par un module de Classe
lors de la Boucle tu mets le Nom du Control TextBox correspondant dans le .tag du CheckBox
et mettre un truc du genre
VB:
Public Sub ObjChck_Click()
Set ObjTxtB=.Controls(ObjChck.Tag)
  With Me
        ObjTxtB.Visible = IIf(ObjChck, True, False)
  End With
End Sub
Pas trop le temps lol
mais je regarde le fil!
jean marie
 
Dernière édition:

ChTi160

XLDnaute Barbatruc
Bonjour
un exemple perfectible
je n'ai laissé que deux Pages au Multipage
j'ai renommé les CheckBox et TextBox (affichage pour voir correspondance)
voir correspondance de ces Noms avec le Nom de la Page(Idx) du Multipage.
s'il devait y avoir plus de 99 CheckBox et TextBox sur une page , il faudrait alors renommer les CheckBox et ChecBox en concéquence
soit format Elec_001 et Elec_T_001
n'hésite pas si besoin
jean marie
 

Pièces jointes

  • Programmes-Test DD.xlsm
    344.1 KB · Affichages: 14

patricktoulon

XLDnaute Barbatruc
bonjour
pour le coté numerique
VB:
Public WithEvents txtB As MSForms.TextBox
Dim cls() As New UserForm1 'nom du userform

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

Private Sub UserForm_Activate()
Dim ctrl as object ,x as long
For Each ctrl In Me.Controls
If TypeName(ctrl) = "TextBox" Then x = x + 1: ReDim Preserve cls(1 To x): Set cls(x).txtB = ctrl
Next
End Sub

tout tes textboxs ou qu'il soient dans l'userform ne contiendrons désormais que des chiffres et le point en séparateur decimal
il te sera impossible de taper autre chose
;)
 
Dernière édition:

ChTi160

XLDnaute Barbatruc
Bonsoir Patrick
pas évident sans plus d'indication!
question :
Pourquoi ?
VB:
Dim cls() As New UserForm1 'nom du userform
et pas
VB:
Dim cls() As New Classxxxx 'nom de la Classe
tu n'as pas de module de Classe dans ton cas ?????
merci par avance
jean amrie
 

patricktoulon

XLDnaute Barbatruc
Bonjour ChTi160
re
ben en fait c'est comme tu veux ,tu peux faire la même chose avec un module classe
je répète au passage ce que j'ai dis dans une autre discussion que le module userform est a part entière lui aussi un module classe
et que faineant par nature et considérant que le recyclage est une bonne chose et que la transportabilité d'un module peut être avantageuse
et que finalement dans ce cas précis ou contexte du demandeur la chose s’arrête seulement a forcer simplement les textboxs a être numeriques
je le fait donc pour toutes ces raisons dans le userform

demain j'ai besoins de cet userform dans un autre applicatif j'exporte et j’importe l'userform et c'est tout
cé bo la vie non?
voila ;)
EDIT:

j'aurais pu même ajouter le classement en jumelage des checkboxs/textbox dont le click sur un doit faire apparaître l'autre si j'ai bien saisie la discussion dans son ensemble

comme dans cet exemple ci joint
le code en tout et pour tout

le checkbox1 et jumelé a textbox1 etc....
la visibilité du textbox = la valeur de son jumeau
VB:
Option Explicit
Public WithEvents txtB As MSForms.TextBox
Public WithEvents check As MSForms.CheckBox
Dim cls() As New UserForm1    'nom du userform

Private Sub check_Change()
txtB.Visible = check.Value
End Sub


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

Private Sub UserForm_Activate()
    Dim ctrl As Object, X As Long
    For Each ctrl In Me.Controls
        If TypeName(ctrl) = "TextBox" Then
            X = X + 1: ReDim Preserve cls(1 To X)
            ctrl.Visible = False: Set cls(X).txtB = ctrl
            Set cls(X).check = Me.Controls(Replace(ctrl.Name, "TextBox", "CheckBox"))
        End If
    Next
End Sub
 

Pièces jointes

  • exemple jumelé check tbox numeric only.xlsm
    16.3 KB · Affichages: 12
Dernière édition:

patricktoulon

XLDnaute Barbatruc
tu aurais rentré le Couple en même temps (mais comment ?)
Set cls(meme index de classe ).txtB = ctrl
Set cls(meme index de classe ).check = Me.Controls(Replace(ctrl.Name, "TextBox", "CheckBox"))

bien sur!!!! dans ce cas la il faut que les jumeaux aient le même suffixe numérique (textbox6=checkbox6)

ta méthode tag est bonne aussi
il faut penser quand même que le tag peut être un compartiment mémoire en fonctionnement dans diverses utilisations
 
Dernière édition:

Hervé

XLDnaute Barbatruc
salut :)

"ta méthode tag est bonne aussi "

j'aime le tag, il permet de boucler sur les controls facilement, en plus on peut stocker une information dedans le temps d'une procédure.

Patrick, je visionne tes messages concernant l'usf comme module de classe a part entière, très intéressant, j'avais tenté de maîtriser la bête sans grand succès, n'ayant ni la syntaxe ni de besoin, chapeau à toi

a plus
 

Discussions similaires

Statistiques des forums

Discussions
312 203
Messages
2 086 195
Membres
103 153
dernier inscrit
SamirN