dans le cadre d'un stage je développe un programme qui a été commencé par un précédent stagiaire, donc je dois me plonger dedans... et je rencontre un soucis !
Ca se fait sous la forme d'une macro excel.
J'ai tout un tas de textbox qui sont crées dynamiquement dans une userform de cette façon :
Set obj = frm_saisie_entrainement_joueurs.Add("forms.multipage.1")
With obj
.Name = "multipage_entrain_joueur"
...
End With
Set obj = Controls("multipage_entrain_joueur").Pages(1).Add("forms.textbox.1")
With obj
.Name = "txt_joueur_FCabso_" & i
...
End With
Premièrement, s'agit-il réellement d'un groupe de contrôles ? je n'ai pas l'impression. dans mes souvenis, un groupe de contrôles, c'était qq chose du genre txtBox(i) avec i l'indice pour accéder aux différentes textbox du groupe.
Pourtant pour accéder au contenu d'une des textbox, j'utilise ceci :
Controls("txt_joueur_RPE_" & i).value
Bref, ma question est la suivante :
Je souhaite écrire du code se déclenchant à l'événement KeyPress pour toutes ces textbox (pour empêcher la saisie de lettre dans ces txtxbox).
Seulement je ne sais pas comment je dois nommer la procédure...
La chose est possible sous VBA (en faisant une classe). Elle n'est toutefois réellement rentable que si le groupe doit contenir un nombre assez important de contrôles ainsi indexés.
Si ce nombre n'est pas vraiment élevé, il vaut mieux utiliser la collection Controls comme tu le fais et faire une sub paramétrée vers laquelle tu renvoies.Une ligne par évènement et par textbox suffit alors, en passant un "indice" (le dernier caractère/numéro du nom de la textbox) en paramètre de la procédure.
____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
Je pense avoir été clair, pourtant
Mais s'il te faut un exemple :
Private Sub Command1_Click()
toto 1
End Sub
Private Sub Command2_Click()
toto 2
End Sub
Private Sub toto(indice As Integer)
MsgBox Controls("Command" & indice).Name
End Sub
Est-ce clair ?
Et encore plus clair, puisque tu as un objet dans ta sub :
Private Sub Command1_Click()
toto 1
End Sub
Private Sub Command2_Click()
toto 2
End Sub
Private Sub toto(indice As Integer)
Dim titi As Object
Set titi = Controls("Command" & indice)
MsgBox titi.Name
End Sub
Voilà !
____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
Je suis vraiment désolé que tu ne "saisisses pas le truc" !
Il sera le même, avec l'évènement keypress.
Et c'est tout le sens de ce que j'ai écrit plus haut :
Pour mémoire :
Une ligne par évènement et par textbox suffit alors, en passant un "indice" (le dernier caractère/numéro du nom de la textbox) en paramètre de la procédure.
Je pense réellement avoir été très clair sur ce point et que les exemples donnés n'étaient même pas nécessaires.
Si tu ne comprends pas ce genre de mécanisme, je ne veux même pas tenter de t'exposer celui, bien plus complexe, de la création d'évènements dans une classe.
Bonne chance
____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
Bon (je me calme un peu).
Je vais faire une dernière tentative pour solliciter ton intelligence.
Sur un UserForm : 3 textboxes nommées TextBox1, TextBox2 et TextBox3 et ce code :
Private Sub TextBox1_KeyPress(ByVal keyascii As MSForms.ReturnInteger)
forcer_numerique 1, keyascii
End Sub
Private Sub TextBox2_KeyPress(ByVal keyascii As MSForms.ReturnInteger)
forcer_numerique 2, keyascii
End Sub
Private Sub TextBox3_KeyPress(ByVal keyascii As MSForms.ReturnInteger)
forcer_numerique 3, keyascii
End Sub
Private Sub forcer_numerique(indice As Integer, keyascii As MSForms.ReturnInteger)
If Not IsNumeric(Chr(keyascii)) Then keyascii = 0
End Sub
une seule ligne sur chaque évènement keypress de chaque textbox et une sub valable pour les 3.
Essaye donc de frapper un caractère non numérique dans l'une quelconque des 3 textBoxes. Tu n'y arriveras pas.
Comprends-tu maintenant ce genre de mécanisme et son intérêt ?
Je l'espère vraiment de tout mon coeur pour toi, sinon ce serait désespérant.
____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
Je pense qu'il y a un problème de communication entre nous deux, peut-être est-ce de ma faute si j'ai mal formulé mon problème.
Je te cite : Sur un UserForm : 3 textboxes nommées TextBox1, TextBox2 et TextBox3
Mon problème c'est que ce n'est pas si simple puisque mes textbox sont désignées par ceci : Controls("txt_joueur_RPE_" & i), avec i variant, pour donner des choses du genre :
Donc je ne peux pas du tout écrire une sub comme cela :
Private Sub Controls("txt_joueur_RPE_1")_KeyPress(ByVal keyascii As MSForms.ReturnInteger)
...
End Sub
Merci pour ton aide, même si je dois t'admettre que je trouve certaines de tes remarques à la limite de la condescendance ("sinon ce serait désespérant...").
Oui, tu as raison : il y a un problème de communication entre nous.
Bonne journée.
____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
Bon...
Je viens de tout relire et re-relire.
Il me semble (et je ne l'avais pas bien vu) que ta difficulté est finalement surtout celle de créer un évènement pour un groupe de textboxes pseudo indexées.
Si c'est ceci, voici un petit exemple (à améliorer) de ce que tu dois faire.
Sur un userform nommé userform1 (sans rien dessus) :
Private Sub UserForm_Activate()
Dim nb As Integer, obj As Control, i As Integer
Me.Move 0, 0, 500, 400
Dim boitetexte As MSForms.Control
On Error Resume Next
For i = 0 To 2
Set boitetexte = Me.Controls("" & i)
If boitetexte Is Nothing Then
Set boitetexte = Me.Controls.Add("Forms.TextBox.1", "toto(" & i & ")", True)
With boitetexte
.Caption = "Ma textbox" & i
.Top = 20 * i
.Left = 100 * i
.Height = 20
.Width = 100
End With
Else
MsgBox "existe déjà !"
End If
Set boitetexte = Nothing
Next
For Each obj In Me.Controls
If obj.Name Like "toto*" Then
nb = nb + 1
ReDim Preserve mesTextBoxes(1 To nb)
Set mesTextBoxes(nb).TextBoxEvents = obj
End If
Next obj
Set obj = Nothing
End Sub
dans un module de classe appelé classe1
Option Explicit
Public WithEvents TextBoxEvents As MSForms.TextBox
Private Sub TextBoxEvents_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Dim index As Integer, qui As String
qui = UserForm1.ActiveControl.Name
index = Val(Mid(qui, InStr(qui, "(") + 1))
Select Case index
Case 0
If KeyAscii <> 8 And Not IsNumeric(Chr(KeyAscii)) Then
KeyAscii = 0
End If
Case 1
If IsNumeric(Chr(KeyAscii)) And KeyAscii <> 8 Then
KeyAscii = 0
End If
Case 2
KeyAscii = Asc(UCase(Chr(KeyAscii)))
End Select
End Sub
Ce code :
ajoute et place dynamiquement, sur ton userform, 3 textboxes nommées toto(0), tgoto(1) et toto(2)
toto(0), en haut et à gauche, n'acceptera que des numériques
toto(1), au centre, refusera tout numérique
toto(2), en bas, mettra toutes tes frappes en majuscules.
Voilà donc un exemple (si c'est cela que tu cherches)
Il devrait te permettre, après analyse, d'adapter à tes besoins.
____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
Pour ceux qui visiteraient la présente discussion :
Je viens de m'apercevoir de l'oubli d'un point très important.
Le code ci-dessus nécessite l'ajout d'un module (insertion ===>> module) contenant cette déclaration :
Public mestextboxes() As New Classe1
sans laquelle il ne saurait bien évidemment fonctionner, mestextboxes étant inconnu à l'activation de l'userform
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne intallée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Bonsoir ucfoutu,
Merci d'avoir complété tes explications
Quoi qu'il en soit, ce post à été abandonné par le demandeur sans remontées de résultats, surement sans même avoir été analysé et testé, et bien sûr sans remerciements comme 80% des posts
Quelle époque
Misère...