Evenement sur groupe de contrôles...

clements42 Messages postés 16 Date d'inscription mardi 21 octobre 2008 Statut Membre Dernière intervention 20 juillet 2011 - 7 juin 2011 à 19:20
 Utilisateur anonyme - 31 août 2011 à 22:12
Bonjour,

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...

Merci d'avance !!

11 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
7 juin 2011 à 20:03
Bonjour,

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
0
clements42 Messages postés 16 Date d'inscription mardi 21 octobre 2008 Statut Membre Dernière intervention 20 juillet 2011
7 juin 2011 à 20:13
qu'entends tu par "une sub paramétrée vers laquelle tu renvoies", ou alors ta phrase est incomplète ;)

J'ai environ une vingtaine de textbox...
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
7 juin 2011 à 20:27
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
0
clements42 Messages postés 16 Date d'inscription mardi 21 octobre 2008 Statut Membre Dernière intervention 20 juillet 2011
7 juin 2011 à 20:42
je saisi pas le truc
quel est l'intérêt de la fonction toto ?

et comment faire le lien ensuite avec ce que je veux faire (event keypress) ?

merci à toi en tout cas ;)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
7 juin 2011 à 21:22
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
7 juin 2011 à 21:54
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
0
clements42 Messages postés 16 Date d'inscription mardi 21 octobre 2008 Statut Membre Dernière intervention 20 juillet 2011
8 juin 2011 à 02:49
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 :

Controls("txt_joueur_RPE_1")
Controls("txt_joueur_RPE_2")

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...").
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
8 juin 2011 à 07:26
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
8 juin 2011 à 11:31
Re

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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
31 août 2011 à 16:52
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
0
Utilisateur anonyme
31 août 2011 à 22:12
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...
0
Rejoignez-nous