Problème code module de classe

Résolu
snekkar Messages postés 21 Date d'inscription jeudi 21 avril 2011 Statut Membre Dernière intervention 25 octobre 2014 - 3 avril 2014 à 10:59
snekkar Messages postés 21 Date d'inscription jeudi 21 avril 2011 Statut Membre Dernière intervention 25 octobre 2014 - 4 avril 2014 à 18:50
Bonjour,

Je débute en VBA excel, et j'avoue ne pas tout comprendre malgré mes recherches perso et sur les forums. Quelqu'un pourrait-il m'aider sur le problème suivant ?
J'ai crée plusieurs USF comprenant chacun 280 textbox et je souhaitais obliger l'utilisateur à saisir uniquement des nombres J'ai donc passé le code ci-après. Celui-ci fonctionne seulement pour l'Usf2 lorsque je n'intègre pas le code des Usf 3 & 4; dès que j'intègre le code sur les 3 Usf, il ne fonctionne plus, pourtant je fais bien référence à des textbox différents, j'ai déclaré mes variables et j'ai bien codifié le module de classe.
Pouvez vous me dire d'où vient le problème car je ne trouve pas la solution ?
Avec mes Remerciements

`Code Module de classe
Public WithEvents txtBox As MSForms.TextBox
Private Sub txtBox_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If InStr("0123456789", Chr(KeyAscii)) = 0 Then
KeyAscii = 0
MsgBox "Vous devez saisir un nombre !"
End If
End Sub

` Code Userform 2
Dim i As Integer
Dim txtBox(1 To 280) As New Classe1 'Pour 280 TextBox
Private Sub UserForm2_Initialize()
Dim n, x As Integer
Dim ctrl As Control
'Rentrer un nombre pour les 280 premières Textbox
For Each ctrl In Controls
For n = 1 To 280
If ctrl.Name = "TextBox" & n Then
x = x + 1
Set txtBox(x).txtBox = ctrl
End If
Next n
Next

` Code Userform 3
Dim i As Integer
Dim txtBox(281 To 560) As New Classe1 'Pour 280 TextBox
Private Sub UserForm3_Initialize()
Dim n, x As Integer
Dim ctrl As Control
'Rentrer un nombre pour les 281 à 560 premières Textbox
For Each ctrl In Controls
For n = 281 To 560
If ctrl.Name = "TextBox" & n Then
x = x + 1
Set txtBox(x).txtBox = ctrl
End If
Next n
Next

` Code Userform 4
Dim i As Integer
Dim txtBox(561 To 840) As New Classe1 'Pour 280 TextBox
Private Sub UserForm4_Initialize()
Dim n, x As Integer
Dim ctrl As Control
'Rentrer un nombre pour les 561 à 840 premières Textbox
For Each ctrl In Controls
For n = 561 To 840
If ctrl.Name = "TextBox" & n Then
x = x + 1
Set txtBox(x).txtBox = ctrl
End If
Next n
Next

8 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
3 avril 2014 à 11:22
Bonjour,
Veux-tu bien t'efforcer de :
1) montrer ton vrai code (copié/collé). Celui que tu nous montres ne risque pas d'être un copié/collé rigoureux du tien.
2) présenter ton code entre balises code (dernière icône à droite)
0
snekkar Messages postés 21 Date d'inscription jeudi 21 avril 2011 Statut Membre Dernière intervention 25 octobre 2014
3 avril 2014 à 12:27
Bonjour UCFOUTU,
Excuse moi pour la présentation, je ne suis pas très doué.
J'espère que ce que j'ai fait ci-après te conviendra:
1. Code du Module de classe :
Public WithEvents txtBox As MSForms.TextBox
Private Sub txtBox_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If InStr("0123456789", Chr(KeyAscii)) = 0 Then
KeyAscii = 0 
MsgBox "Vous devez saisir un nombre !"
End If     
End Sub>


2.Code du Userform2
Dim i As Integer
Dim txtBox(1 To 280) As New Classe1 'Pour 280 TextBox

Private Sub UserForm2_Initialize()
    Dim n, x As Integer
    Dim ctrl As Control
    'Rentrer un nombre pour les 280 premières Textbox
    For Each ctrl In Controls
        For n = 1 To 280
            If ctrl.Name = "TextBox" & n Then
                x = x + 1
                Set txtBox(x).txtBox = ctrl
            End If
        Next n
    Next


3. Code du Userform3:
Dim i As Integer
Dim txtBox(281 To 560) As New Classe1 'Pour 280 TextBox

Private Sub UserForm3_Initialize()
    Dim n, x As Integer
    Dim ctrl As Control
    'Rentrer un nombre pour les 281 à 560 premières Textbox
    For Each ctrl In Controls
        For n = 281 To 560
            If ctrl.Name = "TextBox" & n Then
                x = x + 1
                Set txtBox(x).txtBox = ctrl
            End If
        Next n
    Next


4.Code du Userform4:
Dim i As Integer
Dim txtBox(561 To 840) As New Classe1 'Pour 280 TextBox
Private Sub UserForm4_Initialize()
    Dim n, x As Integer
    Dim ctrl As Control
    'Rentrer un nombre pour les 561 à 840 premières Textbox
    For Each ctrl In Controls
        For n = 561 To 840
            If ctrl.Name = "TextBox" & n Then
                x = x + 1
                Set txtBox(x).txtBox = ctrl
            End If
        Next n
    Next
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 3/04/2014 à 12:34
Je t'ai demandé plus haut de présenter ton vrai code (par copié/collé du tien).
Tu ne l'as pas fait !
Exemple :
Private Sub UserForm2_Initialize()
cet évènement (tel que rigoureusement écrit) ne saurait exister sous VBA.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
0
snekkar Messages postés 21 Date d'inscription jeudi 21 avril 2011 Statut Membre Dernière intervention 25 octobre 2014
3 avril 2014 à 12:59
Mais c'est mon vrai code que je suis allé chercher en faisant un "copier/coller".
C'est peut-être pour cela que ça ne fonctionne pas ?
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
3 avril 2014 à 13:03
Pas uniquement pour "cela", mais au moins pour "cela", hein ...
0

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

Posez votre question
snekkar Messages postés 21 Date d'inscription jeudi 21 avril 2011 Statut Membre Dernière intervention 25 octobre 2014
3 avril 2014 à 13:17
Mais maintenant je ne suis pas plus avancé car je ne sais pas ce qui ne va pas dans ce code, c'est bien pour cette raison que je suis venu sur ce forum.
Si tu souhaites d'autres informations, je te les transmettrai volontiers
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 3/04/2014 à 14:01
Commence s'il te plait par ne pas "inventer" des procédures évènementielles. Si elles n'existent pas, elles ne se déclenchent tout simplement pas ! Les procédures évènementielles constatent des évènements (ceux de VBA) et sont définies par VBA.
La procédure "UserForm2_Initialize" n'existe pas. Et tu t'en serais rendu compte en y mettant un simple msgbox "coucou" ("coucou" ne se serait jamais affiché !).
Les procédures évènementielles de VBA sont prédéfinies par VBA et figurent (dans l'éditeur VBA) dans la colonne de droite de l'objet sélectionné (toujours dans l'éditeur VBA) dans la colonne de gauche.
Mais il s'agit là bien plus de l'apprentissage des bases de l'IDE (apprentissage indispensable) que du développement fait ensuite sur ces bases indispensables.
Ce que tu as écrit n'a pas le moindre effet de plus que celui qu'aurait cette "procédure évènementielle" inexistante et inventée de toutes pièces :
Private Sub ABRACADABRA_Initialize()

MsgBox "COUCOU"

End Sub

Et pour cause : elle ne correspondrait à aucun évènement !

EDIT :
Je note par ailleurs ce que tu as écrit plus haut :
"Celui-ci fonctionne seulement pour l'Usf2"
Une chose est pour moi alors très claire : ===>>>
ce n'est certes pas ce "faux" évènement :
Private Sub UserForm2_Initialize() 
qui fait que cela a marché pour l'USF2, mais un autre évènement, hein ...


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
0
snekkar Messages postés 21 Date d'inscription jeudi 21 avril 2011 Statut Membre Dernière intervention 25 octobre 2014
3 avril 2014 à 14:26
Ah oui, je n'avais pas remarqué que j'avais involontairement intégré le code dans la procédure qui remplit mes combobox.

J'essaye de corriger le code et je reviens vers toi pour te préciser où j'en suis
0
snekkar Messages postés 21 Date d'inscription jeudi 21 avril 2011 Statut Membre Dernière intervention 25 octobre 2014
4 avril 2014 à 18:50
Bonjour,

Je ne sais pas si mon résultat est très "professionnel" mais j'ai trouvé une solution qui fonctionne et qui correspond à ce que je voulais faire, Je donne le code si ça peut intéresser quelqu'un:
1. j'ai supprimé mon module de classe
2. j'ai intégré le code suivant dans les 3 Usf concernés:

'pour obliger à saisir dans toutes les textbox uniquement numériques
Private Sub Cmd7_click()
    For i = 1 To 280 n MsgBox "Case" & i & "vide" & vbNewLine & "si vide mettre un 0": Exit Sub
    Next i
    Const T = 280
    For n = 1 To 280
        With Me.Controls("TextBox" & n)
            If .Value > "" And .Value <> Abs(Fix(Val(.Value))) Then
            MsgBox "Vous avez par erreur saisi du texte dans certaines cases dédiées aux nombres, Veuillez Vérifier, Corriger et Valider après correction !!!", vbOKOnly, "ATTENTION, ERREUR !!!"
            Exit For
            End If
        End With
    Next
    If n > T Then


Merci à toi UCFOUTU
0
Rejoignez-nous