Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Je m'essaye en module de classe...boooff!!!

9 réponses
Avatar
elect31
Bonjour et bonnes fêtes
Sur les bons conseils de Michdenis qui m'avait fait un module de classe,
j'essaye vainement de faire fonctionner le mien.
Comme je sens que mes explications vont être vaseuses... je mets le
fichier incriminé en dépôt, pour celui qui aura le temps d'y jeter un
coup d'oeil.
http://www.cijoint.fr/cjlink.php?file=cj200912/cij6uEeDST.xls

Les données:
Un userForm qui contient 6 frames, qui contiennent chacun 24 combobox.
Chaque frame est nommé d'une des feuilles du classeur.
1- Chaque combo doit être capable de "lire" les données de la cellule
(propriété "Rowsource"). C'est fait (+ ou moins bien...mais ça
fonctionne) dans la sub ListBxClasse_Click.

2- On doit pouvoir choisir dans la liste de chaque combo la valeur que
l'on veut et qui doit s'inscrire automatiquement au bon endroit dans la
bonne feuille (celle qui correspond au nom du frame), sur la bonne ligne
(celle qui correspond au nom choisi dans la listBox) et sur la bonne
colonne (les variables lignes et col font ça très bien et elles sont
publiques).Cela revient à utiliser la propriété "ControlSource" de
chaque combo.

Mon problème:
est d'écrire au bon endroit sans me faire 144* le nombre d'élèves de
la liste, procédures évènementielles...
ComboBox0 doit avoir son ControlSource sur D5 de la feuille(2)si le 1°
nom est choisi, sur D6 si c'est le 2° nom de la liste qui est choisi.

ComboBox1 doit avoir son ControlSource sur E5 de la feuille(2)...
ComboBox24 doit avoir son ControlSource sur E5 de la feuille(3),
toujours avec la même condition de nom choisi au départ.

J'ai donc attaqué les modules de classe, puisqu'il faut en passer par là.
Vous verrez, si vous ouvrez le fichier joint, que je n'arrive pas à
attribuer au combo sollicité sa propriété "ControlSource" sans perdre la
valeur choisie dans mon combo.

Bon voilà! J'ai relu et je me suis compris, mais c'est vrai que j'ai le
fichier sous les yeux.
NB: sorry! On active le Userform en cliquant sur un nom de la liste et
j'ai désactivé mon essai de module de classe en commentant l'intérieur
des 2 proc que j'ai créées.
Merci et encore bonnes fêtes

9 réponses

Avatar
michdenis
Bonjour,

Dans la frame no3, tes combobox ne sont pas placés
en ordre croissant... je n'ai pas vérifié pour les frames 4, 5 ,6

J'ai fait disparaître quelques lignes de code des modules feuilles.
Tu peux les rajouter... (ce n'était que pour mes tests.)

http://www.cijoint.fr/cjlink.php?file=cj200912/cijRzqsVzI.zip



"elect31" a écrit dans le message de groupe de discussion :

Bonjour et bonnes fêtes
Sur les bons conseils de Michdenis qui m'avait fait un module de classe,
j'essaye vainement de faire fonctionner le mien.
Comme je sens que mes explications vont être vaseuses... je mets le
fichier incriminé en dépôt, pour celui qui aura le temps d'y jeter un
coup d'oeil.
http://www.cijoint.fr/cjlink.php?file=cj200912/cij6uEeDST.xls

Les données:
Un userForm qui contient 6 frames, qui contiennent chacun 24 combobox.
Chaque frame est nommé d'une des feuilles du classeur.
1- Chaque combo doit être capable de "lire" les données de la cellule
(propriété "Rowsource"). C'est fait (+ ou moins bien...mais ça
fonctionne) dans la sub ListBxClasse_Click.

2- On doit pouvoir choisir dans la liste de chaque combo la valeur que
l'on veut et qui doit s'inscrire automatiquement au bon endroit dans la
bonne feuille (celle qui correspond au nom du frame), sur la bonne ligne
(celle qui correspond au nom choisi dans la listBox) et sur la bonne
colonne (les variables lignes et col font ça très bien et elles sont
publiques).Cela revient à utiliser la propriété "ControlSource" de
chaque combo.

Mon problème:
est d'écrire au bon endroit sans me faire 144* le nombre d'élèves de
la liste, procédures évènementielles...
ComboBox0 doit avoir son ControlSource sur D5 de la feuille(2)si le 1°
nom est choisi, sur D6 si c'est le 2° nom de la liste qui est choisi.

ComboBox1 doit avoir son ControlSource sur E5 de la feuille(2)...
ComboBox24 doit avoir son ControlSource sur E5 de la feuille(3),
toujours avec la même condition de nom choisi au départ.

J'ai donc attaqué les modules de classe, puisqu'il faut en passer par là.
Vous verrez, si vous ouvrez le fichier joint, que je n'arrive pas à
attribuer au combo sollicité sa propriété "ControlSource" sans perdre la
valeur choisie dans mon combo.

Bon voilà! J'ai relu et je me suis compris, mais c'est vrai que j'ai le
fichier sous les yeux.
NB: sorry! On active le Userform en cliquant sur un nom de la liste et
j'ai désactivé mon essai de module de classe en commentant l'intérieur
des 2 proc que j'ai créées.
Merci et encore bonnes fêtes
Avatar
michdenis
Il reste quelques trucs à fignoler...de quoi t'amuser !

http://www.cijoint.fr/cjlink.php?file=cj200912/cijRzqsVzI.zip" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://www.cijoint.fr/cjlink.php?file=cj200912/cijRzqsVzI.zip



"michdenis" a écrit dans le message de groupe de discussion :

Bonjour,

Dans la frame no3, tes combobox ne sont pas placés
en ordre croissant... je n'ai pas vérifié pour les frames 4, 5 ,6

J'ai fait disparaître quelques lignes de code des modules feuilles.
Tu peux les rajouter... (ce n'était que pour mes tests.)

http://www.cijoint.fr/cjlink.php?file=cj200912/cijRzqsVzI.zip" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://www.cijoint.fr/cjlink.php?file=cj200912/cijRzqsVzI.zip



"elect31" a écrit dans le message de groupe de discussion :

Bonjour et bonnes fêtes
Sur les bons conseils de Michdenis qui m'avait fait un module de classe,
j'essaye vainement de faire fonctionner le mien.
Comme je sens que mes explications vont être vaseuses... je mets le
fichier incriminé en dépôt, pour celui qui aura le temps d'y jeter un
coup d'oeil.
http://www.cijoint.fr/cjlink.php?file=cj200912/cij6uEeDST.xls

Les données:
Un userForm qui contient 6 frames, qui contiennent chacun 24 combobox.
Chaque frame est nommé d'une des feuilles du classeur.
1- Chaque combo doit être capable de "lire" les données de la cellule
(propriété "Rowsource"). C'est fait (+ ou moins bien...mais ça
fonctionne) dans la sub ListBxClasse_Click.

2- On doit pouvoir choisir dans la liste de chaque combo la valeur que
l'on veut et qui doit s'inscrire automatiquement au bon endroit dans la
bonne feuille (celle qui correspond au nom du frame), sur la bonne ligne
(celle qui correspond au nom choisi dans la listBox) et sur la bonne
colonne (les variables lignes et col font ça très bien et elles sont
publiques).Cela revient à utiliser la propriété "ControlSource" de
chaque combo.

Mon problème:
est d'écrire au bon endroit sans me faire 144* le nombre d'élèves de
la liste, procédures évènementielles...
ComboBox0 doit avoir son ControlSource sur D5 de la feuille(2)si le 1°
nom est choisi, sur D6 si c'est le 2° nom de la liste qui est choisi.

ComboBox1 doit avoir son ControlSource sur E5 de la feuille(2)...
ComboBox24 doit avoir son ControlSource sur E5 de la feuille(3),
toujours avec la même condition de nom choisi au départ.

J'ai donc attaqué les modules de classe, puisqu'il faut en passer par là.
Vous verrez, si vous ouvrez le fichier joint, que je n'arrive pas à
attribuer au combo sollicité sa propriété "ControlSource" sans perdre la
valeur choisie dans mon combo.

Bon voilà! J'ai relu et je me suis compris, mais c'est vrai que j'ai le
fichier sous les yeux.
NB: sorry! On active le Userform en cliquant sur un nom de la liste et
j'ai désactivé mon essai de module de classe en commentant l'intérieur
des 2 proc que j'ai créées.
Merci et encore bonnes fêtes
Avatar
michdenis
Avatar
elect31
Salut Michdenis
Tout d'abord, j'espère que tu as passé un bon Noël. Je n'avais pas
ouvert mon ordi depuis le 24, et je vois que tu es énormément occupé ces
derniers temps. Je te remercie pour ça.
Je n'ai ouvert, pour l'instant que le dernier fichier de ton dernier
post. J'ai lu tes commentaires, remarques et suggestions dans la zone de
texte, puis j'ai essayé d'ouvrir le formulaire par le nouveau bouton que
tu as placé.
Mauvaise nouvelle: le formulaire s'affiche, mais j'ai de suite une
"erreur d'exécution 1004 : l'accès par programme au projet Visual Basic
n'est pas fiable."
Si je passe en débogage, je tombe sur la "Function
Equivalent_Nom_Feuille(NomFrame As String)" qui me surligne
l'intégralité de son contenu.
Je ne peux pas aller voir plus loin dans la démonstration, mais j'ai vu
et apprécier les simplifications et améliorations apportées à mes
procédures.
Voilà! Je ne sais pourquoi le projet pourrait ne pas être fiable. Peut
être une question de référence?
Celles qui sont cochées chez moi:
Visual Basic For Application
Microsoft Excel 12.0 Object Library
OLE Automation
Microsoft Office 12.0 Object Library
Microsoft Forms 2.0 Object Library
Microsoft Windows Common Controls 6.0 (SP6)
Ref Edit Control
Microsoft Calendar control 2007
Microsoft Windows Common Controls-2 6.0 (SP6)
Si tu as une solution???


michdenis a écrit :
Une version plus aboutie du fichier :

http://www.cijoint.fr/cjlink.php?file=cj200912/cijBWMSDCq.zip





Avatar
michdenis
Version Excel 2007,

Si l'onglet "Développeur" du "Ruban" est affiché
il s'agit d'aller dans la section "Code", de cliquer
sur la commande "Sécurité des macros" ...
section de gauche : "Paramètres des macros"
et dans la section de droite, tu coches :
"Accès approuvé au modèle d'objet du projet VBA"

On peut aussi passer par le gros boutons "office" dans
le coin supérieur gauche de l'application... Options Excel...

Excel 2003, barre des menus / outils / macros / sécurités /
onglets "éditeurs approuvés" et tu coches les 2 cases à cocher
dans le bas de la fenêtre.



"elect31" a écrit dans le message de groupe de discussion :

Salut Michdenis
Tout d'abord, j'espère que tu as passé un bon Noël. Je n'avais pas
ouvert mon ordi depuis le 24, et je vois que tu es énormément occupé ces
derniers temps. Je te remercie pour ça.
Je n'ai ouvert, pour l'instant que le dernier fichier de ton dernier
post. J'ai lu tes commentaires, remarques et suggestions dans la zone de
texte, puis j'ai essayé d'ouvrir le formulaire par le nouveau bouton que
tu as placé.
Mauvaise nouvelle: le formulaire s'affiche, mais j'ai de suite une
"erreur d'exécution 1004 : l'accès par programme au projet Visual Basic
n'est pas fiable."
Si je passe en débogage, je tombe sur la "Function
Equivalent_Nom_Feuille(NomFrame As String)" qui me surligne
l'intégralité de son contenu.
Je ne peux pas aller voir plus loin dans la démonstration, mais j'ai vu
et apprécier les simplifications et améliorations apportées à mes
procédures.
Voilà! Je ne sais pourquoi le projet pourrait ne pas être fiable. Peut
être une question de référence?
Celles qui sont cochées chez moi:
Visual Basic For Application
Microsoft Excel 12.0 Object Library
OLE Automation
Microsoft Office 12.0 Object Library
Microsoft Forms 2.0 Object Library
Microsoft Windows Common Controls 6.0 (SP6)
Ref Edit Control
Microsoft Calendar control 2007
Microsoft Windows Common Controls-2 6.0 (SP6)
Si tu as une solution???


michdenis a écrit :
Une version plus aboutie du fichier :

http://www.cijoint.fr/cjlink.php?file=cj200912/cijBWMSDCq.zip





Avatar
elect31
Je ne connaissais pas cet élément de la sécurité. J'ai pu tester le
classeur et tout semble fonctionner. Je te remercie et je continue
d'améliorer mon projet.
Grace à toi, j'aurais appris quelques trucs en plus.
elect


michdenis a écrit :
Version Excel 2007,

Si l'onglet "Développeur" du "Ruban" est affiché
il s'agit d'aller dans la section "Code", de cliquer
sur la commande "Sécurité des macros" ...
section de gauche : "Paramètres des macros"
et dans la section de droite, tu coches :
"Accès approuvé au modèle d'objet du projet VBA"

On peut aussi passer par le gros boutons "office" dans
le coin supérieur gauche de l'application... Options Excel...

Excel 2003, barre des menus / outils / macros / sécurités /
onglets "éditeurs approuvés" et tu coches les 2 cases à cocher
dans le bas de la fenêtre.



"elect31" a écrit dans le message de groupe de discussion :

Salut Michdenis
Tout d'abord, j'espère que tu as passé un bon Noël. Je n'avais pas
ouvert mon ordi depuis le 24, et je vois que tu es énormément occupé ces
derniers temps. Je te remercie pour ça.
Je n'ai ouvert, pour l'instant que le dernier fichier de ton dernier
post. J'ai lu tes commentaires, remarques et suggestions dans la zone de
texte, puis j'ai essayé d'ouvrir le formulaire par le nouveau bouton que
tu as placé.
Mauvaise nouvelle: le formulaire s'affiche, mais j'ai de suite une
"erreur d'exécution 1004 : l'accès par programme au projet Visual Basic
n'est pas fiable."
Si je passe en débogage, je tombe sur la "Function
Equivalent_Nom_Feuille(NomFrame As String)" qui me surligne
l'intégralité de son contenu.
Je ne peux pas aller voir plus loin dans la démonstration, mais j'ai vu
et apprécier les simplifications et améliorations apportées à mes
procédures.
Voilà! Je ne sais pourquoi le projet pourrait ne pas être fiable. Peut
être une question de référence?
Celles qui sont cochées chez moi:
Visual Basic For Application
Microsoft Excel 12.0 Object Library
OLE Automation
Microsoft Office 12.0 Object Library
Microsoft Forms 2.0 Object Library
Microsoft Windows Common Controls 6.0 (SP6)
Ref Edit Control
Microsoft Calendar control 2007
Microsoft Windows Common Controls-2 6.0 (SP6)
Si tu as une solution???


michdenis a écrit :
Une version plus aboutie du fichier :

http://www.cijoint.fr/cjlink.php?file=cj200912/cijBWMSDCq.zip







Avatar
michdenis
Pour ton information et pour ceux qui auraient télécharger
le fichier exemple, j'ai commis un impair dans la procédure
Sub Initialer_La_Classe() dans le module du formulaire.

La procédure devrait se lire comme suit :
'-------------------------------------
Sub Initialer_La_Classe()
Dim C As Control, A As Integer
Dim Nb As Integer, i As Integer, X As Integer

For A = 1 To 6 'représente le nombre de "Frame"
With UFrmProfilEleve.Controls("FrameSeance" & CStr(A))
For Each C In .Controls
If TypeOf C Is ComboBox Then
X = Split(C.Name, "x")(1)
Select Case X Mod 3
Case 0
C.RowSource = Names("Voies")
C.ControlTipText = "N° de voie"
Case 1
C.RowSource = Names("Difficultes")
C.ControlTipText = "Difficulté de la voie"
Case 2
C.RowSource = Names("Hauteurs")
C.ControlTipText = "Hauteur atteinte"
End Select
i = i + 1
ReDim Preserve DMCombobox(1 To i)
Set DMCombobox(i).MonCombobox = C
End If
Next
End With
Next
End Sub
'-------------------------------------

Ce bout de code permet d'initialer la propriété "RowSource"
et la propriété : "ControlTipText" de chaque combobox au
moment d'ouvrir le formulaire... Il n'est pas nécessaire et tu peux
l'enlever si tu le désires... car tu as pris le temps de les renseigner
manuellement au moment de la création des combobox.

Cependant, il est possible d'automatiser cela et si tu décidais
de conserver ce bout de code, aussi bien qu'il soit correcte !

X = Split(C.Name, "x")(1)
Select Case X Mod 3
Case 0
C.RowSource = Names("Voies")
C.ControlTipText = "N° de voie"
Case 1
C.RowSource = Names("Difficultes")
C.ControlTipText = "Difficulté de la voie"
Case 2
C.RowSource = Names("Hauteurs")
C.ControlTipText = "Hauteur atteinte"
End Select
Avatar
elect31
Bonjour Denis
Avant, j'avais ça, qui me donnait le résultat attendu, à savoir remplir
chaque combo de sa liste...
>Select Case i Mod 3
> Case 1
> C.ControlSource = Voies
> Case 2
> C.ControlSource = Difficultes
> Case 3
> C.ControlSource = Hauteurs
>End Select
et maintenant j'ai ça qui semble me donner la même chose, puisque chaque
combo a encore sa liste...
>Select Case X Mod 3
> Case 0
> C.RowSource = Names("Voies")
> C.ControlTipText = "N° de voie"
> Case 1
> C.RowSource = Names("Difficultes")
> C.ControlTipText = "Difficulté de la voie"
> Case 2
> C.RowSource = Names("Hauteurs")
> C.ControlTipText = "Hauteur atteinte"
> End Select
autrement dit, ControlSource et RowSource semblent avoir le même
effet.??? alors que je pensais que seul RowSource permettait d'alimenter
la liste de chaque combo...
Dans tous les cas, les 2 fonctionnent.

En ce moment je suis en train de travailler à la coloration des 3 combo
par frame représentant la meilleure ascension.

Encore merci de ces modifs.
elect


michdenis a écrit :
Pour ton information et pour ceux qui auraient télécharger
le fichier exemple, j'ai commis un impair dans la procédure
Sub Initialer_La_Classe() dans le module du formulaire.

La procédure devrait se lire comme suit :
'-------------------------------------
Sub Initialer_La_Classe()
Dim C As Control, A As Integer
Dim Nb As Integer, i As Integer, X As Integer

For A = 1 To 6 'représente le nombre de "Frame"
With UFrmProfilEleve.Controls("FrameSeance" & CStr(A))
For Each C In .Controls
If TypeOf C Is ComboBox Then
X = Split(C.Name, "x")(1)
Select Case X Mod 3
Case 0
C.RowSource = Names("Voies")
C.ControlTipText = "N° de voie"
Case 1
C.RowSource = Names("Difficultes")
C.ControlTipText = "Difficulté de la voie"
Case 2
C.RowSource = Names("Hauteurs")
C.ControlTipText = "Hauteur atteinte"
End Select
i = i + 1
ReDim Preserve DMCombobox(1 To i)
Set DMCombobox(i).MonCombobox = C
End If
Next
End With
Next
End Sub
'-------------------------------------

Ce bout de code permet d'initialer la propriété "RowSource"
et la propriété : "ControlTipText" de chaque combobox au
moment d'ouvrir le formulaire... Il n'est pas nécessaire et tu peux
l'enlever si tu le désires... car tu as pris le temps de les renseigner
manuellement au moment de la création des combobox.

Cependant, il est possible d'automatiser cela et si tu décidais
de conserver ce bout de code, aussi bien qu'il soit correcte !

X = Split(C.Name, "x")(1)
Select Case X Mod 3
Case 0
C.RowSource = Names("Voies")
C.ControlTipText = "N° de voie"
Case 1
C.RowSource = Names("Difficultes")
C.ControlTipText = "Difficulté de la voie"
Case 2
C.RowSource = Names("Hauteurs")
C.ControlTipText = "Hauteur atteinte"
End Select






Avatar
michdenis
| autrement dit, ControlSource et RowSource semblent
| avoir le même effet.???

Absolument pas. Le code original utilisant ceci
C.ControlSource = Voies n'avait aucun effet sur les combobox
et était erroné. Les combobox utilisait la valeur des propriétés
que tu as définies en dur lors de la création des combobox.
Donc, ces lignes ne code n'étaient pas nécessaire.

Je les ai ajoutées pour montrer que ces propriétés pouvaient être
défini au moment de charger le formulaire. C'est ce pourquoi j'ai
apporté le correctif -> pour ne pas laisser les gens qui ont vu
le contenu du fichier avec une mauvaise information.