Sub WithEvent d'un module de classe ne fonctionne pas sur un multipage

Bonjour,

Débutante en programmation VBA et surtout autodidacte, je rencontre un soucis dans mon code concernant l'application d'une Procédure WithEvents présent dans un module de classe.

J'ai dans un userform plusieurs option button dans le Userform lui-même mais également dans un multipage. Mon userform final doit comporter pas loin d'une centaine de d'option button notamment dans ce multipage au travers de différentes frames d'étapes/questions. J'ai donc cherché à coder une routine unique qui s'appliquerait a l'ensemble de ces contrôles lors de leur évènement click.

En ayant descendu de nombreux postes sur le sujet ces derniers jours, j'ai réussi à progresser dans mon code.

1. J'ai appris a utiliser les modules de classes (même si j'ai encore du mal a comprendre la structure des éléments appelés) et j'ai donc réussi à créer ma classe et à instancier mes contrôles dedans.

2. J'ai réussi a programmer l'évènement click pour ces contrôles y compris avec des Options Buttons inséré dans des frames en récupérant le parent de mon contrôle grâce à une fonction

Jusque là tout fonctionne à merveille.

En revanche, quand j'ai ajouté le multipages et ai inséré mes contrôles dedans (directement ou au travers de frames), VBA me retourne une erreur "Propriété ou méthode non géré par cet objet" sur cette ligne, située dans mon module de classe : Set GetParentForm(Opt).bouton = Button_i

Private Sub Opt_Click()

Set GetParentForm(Opt).bouton = Button_i
RaiseEvent Click

End Sub

J'ai vu une ou deux réponses qui abordait le sujet directement dans les fichiers de réponses sur d'autres postes... mais je ne les ai pas compris, et n'ai donc pas réussi à les appliquer à mon code, mais il semble donc que ça soit possible. De plus : la fonction que j'ai empruntée indique bien les Page et Multipage dans les types possibles de parents, je ne comprends donc pas pourquoi cela ne fonctionne pas. (J'ai aussi essayé avec des options buttons situés dans une frame, elle même dans une autre, pensant que c'était la cascade de contrôle qui ne fonctionnait pas, mais non ça marche aussi de cette manière là.)

Est-ce que quelqu'un aurait une idée pour me débloquer, ou pourrait m'aider à comprendre ce qui ne fonctionne pas avec mon code (et surtout pourquoi) ?
J'ai testé pas mal de chose, en essayant de boucler différemment si le parent était une page ou un multipage, en essayant de combiner une fonction similaire sur le parent.parent....mais là je sèche.

Je vous remercie par avance pour le temps que vous prendrez pour m'aider dans ma quête.

PS : Ci-dessous les codes complets des modules et du userform de mon fichier de test.

image 2024 06 20 231241638

Module du userform :(dont le nom est UF1 si jamais)

Public WithEvents bouton As Cl_Opt

Private Sub bouton_Click()
If Me.Controls(bouton.name) = True Then Me.Controls(bouton.name).ForeColor = RGB(255, 0, 0)
End Sub

Private Sub UserForm_Initialize()
Dim OB As Object
Dim i As Integer

On Error Resume Next
For i = 1 To 5
    Set OB = Me.Controls.Item("OptionButton" & i)
    If Not OB Is Nothing Then
    Dim Opt As Object
    Set Opt = New Cl_Opt
    Set Opt.init(Opt) = OB
    End If
Next
End Sub

Module de classe nommé : Cl_Opt

Option Explicit
Public Button_i As Object
Public Event Click()

Public WithEvents Opt As MSForms.OptionButton

Public Property Set init(ByVal instance As Object, ByVal contrôle As Object)
    Set Button_i = instance
    Set Opt = contrôle
End Property

Public Property Get name() As String
name = Opt.name
End Property

Private Sub Opt_Click()
Set GetParentForm(Opt).bouton = Button_i
RaiseEvent Click

End Sub

Private Function GetParentForm(pControl As Control) As Object
    If TypeOf pControl.Parent Is Frame Or TypeOf pControl.Parent Is Page Or TypeOf pControl.Parent Is MultiPage Then
        Set GetParentForm = GetParentForm(pControl.Parent)
    Else
        Set GetParentForm = pControl.Parent
    End If

End Function

Bonjour Tomiii,

Un fichier représentatif est essentiel afin de tester d'éventuelles solutions.

Bizz

Bonjour Bizarre,

Désolée j'avais lu au détour de certain post que ce n'était pas très apprécié de fournir un fichier avec macro dès le 1er post (surtout sur le forum tout court) malgré la charte d'utilisation, c'est pourquoi j'avais fait des un screen et copié les codes . Mais ça doit dépendre des personnes je pense.

Je joins le fichier sans soucis.

Il s'agit d'un fichier de test que j'utilise en perso (le formulaire étant pour du pro) pour tester les fonctionnalité des codes avant de les insérer dans mon fichier final

7test.xlsm (20.51 Ko)

Merci pour ton aide

Bonjour à tous,

je ne pratique pas vraiment les modules de classe mais j'ai quand même fait un pas à pas.

Private Sub Opt_Click()
Set GetParentForm(Opt).bouton = Button_i
RaiseEvent Click

c'est quoi cette propriété .bouton ?
GetParentForm(Opt) retourne un objet, par exemple Page, qui n'a pas cette propriété.
Il faudrait sans doute la créer dans le module de classe.
Sinon (presque) tous les objets possèdent la propriété Tag à ta dispo pour mettre une chaine.
Tu pourrais t'en servir pour passer une info. Moins beau que de la créer mais si ça peut dépanner...
eric

PS : créer une propriété https://tissotemmanuel.developpez.com/articles/vba/modules-de-classe/#LIV-A-2

Pour rebondir sur ce que dit Eric, il semble en effet que tu ais fait une typo sur ta propriété ".bouton" qui est en minuscule donc non incluse de base dans les propriétés d'un UF.

Ci-après je me suis permis de simplifier un peu ta fonction GetParentForm, qui je suppose doit te renvoyer ton UserForm.

Comme on peut le voir dans l'espion, les propriétés de l'objet retourné ne comprennent pas de "bouton". Tu as bien une propriété bouton, mais que doit-elle contenir ?

La chose s'en rapprochant le plus étant les "OptionButtonX". Je ne sais pas exactement ce que tu souhaites faire mais je te conseille de regarder de ce coté.

image

Le code :

Private Function GetParentForm(pControl As Control) As Object
    If TypeOf pControl.Parent Is MSForms.UserForm Then
        Set GetParentForm = pControl.Parent
    Else
        Set GetParentForm = GetParentForm(pControl.Parent)
    End If

End Function

Ah, je viens de comprendre le .bouton réfère a l'attribut bouton que tu as ajouté a ton UF1, de type de ta classe custom… Et tu veux lui attribuer la valeur "Button_i" qui est un objet… Un des boutons que je mentionnais ?

C'est assez confus ton code, on voit que tu débutes avec la programmation orientée objet (c'est bien !) mais de fait il est vraiment difficile de comprendre ce que tu veux faire.

Peux tu détailler le processus que tu comptes accomplir et je vais essayer de t'aider à écrire ta classe correctement.

Edit : si tu retires le "set" dans

Private Sub Opt_Click()
GetParentForm(Opt).bouton = Button_i
RaiseEvent Click

tu n'as plus d'erreur.

Bonjour Eriiic et Saboh

Merci pour vos retours,

Oui, Saboh, c'est ce que j'avais compris en effet, mais j'avoue que j'ai beaucoup de mal a comprendre la structure de ces modules, j'ai abordé ces points il y a quelques jours seulement avec les forums et un ou deux bouquins. Donc je suis preneuse pour les explications !

Et aussi merci pour la simplification de la fonction !

Pour ce ".bouton" je me suis appuyé sur l'exemple qui a été donné sur le forum dans ce post là : https://forum.excel-pratique.com/excel/module-de-classe-un-sub-pour-plusieurs-boutons-122100

Mon projet final est de réaliser un outil avec plusieurs Userforms différents selon l'activité ainsi qu'un userform de pilotage. En gros un pseudo Workflow : un outil de travail au travers d'un formulaire de suivi et de sélection des dossiers a traiter (ça c'est bon, je m'en suis sortie !) d'une part. D'autres part deux formulaires (deux activités, donc un formulaire chacun, mais qui sont assez similaires dans la réalisation) qui sont des outils de réalisation en mode guideline.

Ces formulaire comprennent une partie "descriptive" avec des contrôles a même le Userforms (ou je n'ai pas de soucis) et une partie "Guide des points a réaliser" qui se déroule au travers d'un multipage avec 6 pages selon des thématiques (index 0 à 5). Sur chacune des pages, j'ai plusieurs questions (qui sont matérialisé par des frames ~25/30) et plusieurs solutions, matérialisé par des Optionsbuttons. (entre 2 et 6 par question soit plus d'une centaines au total)

en clair : ça donnerait en simplifié ça, sachant que je n'ai aucun Optionbutton dans les Pages en direct, et chaque Page peut avoir un nombre de question différentes et chaque question un nombre de réponses différentes. (J'ai aussi d'autre type de contrôle dans mes frames, mais où je n'applique aucune routine, donc qui m'importe peu) (je rejoins le fichier avec la structure, mais je n'ai pas touché au code(ni au nom, j'ai modifié les captions)

image 2024 06 21 120353082

La finalité, c'est de pouvoir avoir une meilleure visibilité, car sur le projet finale les questions et les réponses peuvent être longues et le nombre de question par thème donne parfois un aspect très serrés. Pour ça j'ai voulu

- Rendre visible le frame suivant (avec une logique d'appellation continue dans le nom de chacune d'elle ex : FR_23, Fr_24 etc...) après le click d'un bouton

- Mettre l'option choisie en vert pour que les choix ressortent plus, et remettre en noir les autres options. (Il y a possibilité de revenir dessus plusieurs fois et de changer les réponses selon l'avancé des dossiers, donc j'ai aussi une BDD que j'alimente après validation, pour que les choix soient sauvegardé quand l'utilisateur réouvrira ce dossier dans le userform)

Ce que je cherche a obtenir fonctionne sans soucis si je mets les procédures dans chacun des évènements click des optionsbuttons, mais c'est légèrement illisible a la fin au vu du nombre a initier.

Je suis désolée si ce n'est pas très clair, n'hésite pas si tu as besoin de plus de détail. Le sujet est assez lourd même pour moi car il ne cesse d'évoluer. (la demande initiale était un simple formulaire de saisie pour transmettre une information ... on en est loin, mais ça me permet aussi d'apprendre !)

Si c'est nécessaire je pourrais faire ce week-end un modèle type sans détail sur mon ordinateur perso.

@eriiic : je ne connaissais pas la propriété tag, j'ai un peu cherché, mais ça ne semble pas fonctionner sur multipage non plus : https://forum.excel-pratique.com/excel/role-du-tag-137165

J'ai aussi lu ton lien, j'ai a peu près compris les propriétés Get et Let (Set dans le cadre des objets). Concernant le Page qui n'est pas un "objet" j'avais essayé de faire une condition dans la fonction si le parent était Page ou Multipage, mais ça ne m'a mené à rien ... si c'est possible, je ne sais pas comment la faire passer. Je maîtrise assez mal les fonctions également.

Encore mille merci pour votre aide, et je m'accroche pour comprendre tout ça

Edit : @saboh12617 je viens de voir ton Edit. As-tu retiré autre chose peut-être ? J'ai enlevé le Set et cette fois c'est une autre erreur qui s'applique : "Variable objet ou variable de bloc With non définie " (même pour les contrôles a même le userform). Le pas à pas fait tourner la fonction mais tous les objets passent dans le premier argument, y compris ceux dans les Frames

 If TypeOf pControl.Parent Is MSForms.UserForm Then
        Set GetParentForm = pControl.Parent

Edit 2 : Je précise, peut-être que ça changera la donne : la routine a appliquer ne concerne par ailleurs que des contrôles de type optionbuttons dans des frames situé sur ce multipage (l'encadré rouge de mon image). si la spécification peut aider a trouver un autre chemin ..

3test.xlsm (22.10 Ko)

En complément :

J'ai refais tourner le code avec le Set enlevé de

Private Sub Opt_Click()
GetParentForm(Opt).bouton = Button_i
RaiseEvent Click

Dans tous les cas une erreur persiste.

Si je coche un option Button dans le userform j'ai l'erreur : "Variable objet ou variable de bloc With non définie "

Si je coche un option Button dans tout autre cas, j'ai l'erreur initiale : "Propriété ou méthode non géré par cet objet"

Dans les deux cas, en pas à pas, la fonction passe par le premier évènement donc pControl.Parent is UserForm

Bonjour,

Ton fichier est clairement insuffisant. 90 % voire plus des demandeurs postes des fichiers professionnels : Il suffit de les anonymiser un peu et pour le reste on s'en fiche que tu vendes des nougats ou des lessiveuses nucléaires.

Pas de nom ou des noms bidons.

Pas de N° de Téléphone ou d'adresse mails

Pas de carte bleu ni de mot de passe pour le compte en banque.

Pas de logo ni de N° Siret et en principe pour le reste ça pose pas de problème.

Connaitre le parent n'offre à priori aucun intérêt. Quant au multipage ou aux frames, ils n'offrent qu'un intérêt secondaire (esthétique)

Tout le secret est dans le nommage de tes objets. Pour un si petit nombre d'objets un codage très simple consiste à nommer tes objets sous la forme

Ob001 (ou Ob0001),Ob002, Ob003...

Ensuite il y a plusieurs modes de gestion possibles selon le nombre de séries différentes et les quantités d'objets dans chaque série, Il peut également y avoir des groupes de séries. et certains autres qui n'appartiendrons à aucune série et aucun groupe...

Donc il faut prévoir dès la construction la hiérarchie de tes "Ob" Ceux qui sont gérés dans le module de classe seront gérés avec le préfixe "Ob" Les autres s'il y en a reste, garderont leur nom natif ou autre peu importe...

Tous les autres pourraient être gérés simplement par leur N° d'ordre, sachant que les groupes de série (la page du multipage) pourrait être gérés par le premier digit :

Ob1001, Ob1002, Ob2001... en supposant que le nombre de page n'excède pas 10...

Pour les séries (Frames) S'il n'y en a jamais plus de 10 par pages le 2 ème digit peut convenir.

Quand aux Ob eux même s'ils sont plus nombreux, on peut leur accorder 2 Digits.

On le voit beaucoup de chose dépendent de la hiérarchisation de ces "Ob" Si les regroupements peuvent devenir plus nombreux on peut accorder 2 digits aux séries par exemple... et seulement 1 au dernier rang. D'autres combinaisons peuvent être envisagées avec une numérotation plus complexe.

Enfin on peut encore affiner la gestion avec le Tag de chaque "Ob"

La gestion de cette hiérarchie est rendue très simple simple par l'examen du nom du "Ob" :

Si Mid(NomOb,3,1) = 0 alors on est sur la première pas du multipage,

Si Mid(NomOb,4,1) = 0 alors on est sur la première frame de cette page,

Mais cela ne peut se faire sans un bon aperçu de la hiérarchie de choix... C'est pour cela qu'un classeur un peu documenté est plus important que le travail que tu as déjà effectué sur ce multipage...

Enfin il n'est pas nécessaire que chaque groupe ou sous-groupe soient connu d'avance : il suffit que -pour chacun- on ait un très bon ordre d'idée du nombre maximum d'item potentiel pour chaque groupe d'objet en particulier si l'un d'eux peux excéder 10.

Il faut aussi connaitre avec précision quel sera l'argument décisionnel utilisé une fois que l'élément est identifié. Est-ce que ce sera une table, un Array, un dictionnaire, est-ce que cela sera géré par un Tag ?

Il faut enfin savoir dès le début si le nombre d "Ob" est appelé à évoluer fréquemment ou si on contraire il est très figé.

Ya que toi et le classeur que tu nous joindras qui puisse nous aider à concevoir quelque chose de fonctionnel...

Cela suppose clairement que tous tes Ob soient documentées dans une Table qui doit permettre de les répartir en page / Frame / et Nb d'options de choix s'il y en a plusieurs.

L'exemple joint gère un mini multipage et une dizaine de "Ob" mais ça ne serait pas différent s'il y en avait 80 ou 150 avec de nombreuses pages et de nombreux frames.

Après la hiérarchisations des uns et des autres c'est juste pour le confort d'exploitation après : Comment et ou on récupère les résultats.

Dans cet exemple simpliste on n'a même pas renommé les boutons aussi on se contente de lire leur n° Mid(ObName,9) cela suffit largement pour savoir ce qu'on veut et prendre une décision…

A+

Bonjour galopin,

Je me doute que le fichier est superficiel, et mon souci n'était pas un problème de confidentialité. Je travaille moi-même sur des bases test avec données fictives.

Mon point d'impossibilité a fournir le fichier total et surtout que je ne peux pas sortir le fichier depuis mon PC de travail, même sur mon perso.

J'ai a peu près compris ton message sur les différents points, je ne connaissais pas Mid, qui peut en effet permettre une autre hiérarchisation. A côté j'utilise déjà pas mal l'appellation de mes objets pour que je puisse boucler facilement.

Après je l'utilise surement mal. Pour donner un exemple rapide : j'ai 25 frames répartis a travers tout mon multipage, et chacune des réponses notée de 1 à x selon la question. J'ai géré mon appellation de la manière suivante : FR_23 > FR_23_OB_1, FR_23_OB_2 ... / FR_24 > FR_24_OB_1 ...

Démarrer au FR_23 n'est pas anodin car la réponse du FR_23 soit FR_23_OB_1 ou FR_23_OB_2 ou FR_23_OB_x ira inscrire dans ma base de donnée en colonne 23 le numéro de de la réponse 1, 2 ou x. ( Pour ce point j'utilise une boucle de type :

On error resume next
For i = 29 to 53
          For j = 1 to 6
                    if Me.Controls("FR_" & i & "_OB_" & j) = True then wb.sheets("BDD").cells (lg,i).value = j
          next
next

Et une autre pour récupérer ma donnée en cas de retour sur mon dossier :

On error resume next
For i = 29 to 53
           j = wb.sheets("BDD").cells (lg,i).value
           Me.Controls("FR_" & i & "_OB_" & j) = True 
           Me.Controls("FR_" & i & "_OB_" & j).ForeColor = RGB(0,160,0)
next

Mais je comprends parfaitement, je vais essayer de recréer l'ensemble du module rapidement sur mon perso pour pouvoir vous l'envoyer (je ne pense pas avant la moitié du week-end), et je pense possiblement pouvoir passer avec la méthode Digit / Mid pour mes appellations tout en gardant le numero de la Frame correspondant à ma cellule.

J'imagine un type de nom avec ctrl (pour mutualiser Frame et OB) ctrl10231 (> Multipage 1 > Frame 023 (avec 3 digit pour la frame ? mon 2e userform arrive en colonne 100 et quelques)> OB1), tu penses que ça serait possible ?

Je vais créer un répliquât sur mon perso et vous l'envoi dès que possible.

Encore merci à tous, je reviens vers vous très vite

Comprend moi bien : Pour un petit nombre d'Ob (100 est un petit nombre) Une numérotation simple Ob1, Ob2, Ob82 est la plupart du temps bien suffisante.

Après le multipage et les Frame c'est du cosmétique (pour l'utilisateur)

Après pour la programmation on a besoin de savoir exactement ce qu'on programme : Pour organiser le traitement du retour d'info. Dans bien des cas cette numérotation simple peut être suffisante il suffit de créer une fonction "décodeur" qui traitera de la même manière les Ob entre 20 et 30 qui ont le Tag "A" c'est juste un problème de sélect cas NumRetour... Tu as vu dans mon exemple que les Frame et le multipage étaient ignorés.

Pas de blabla, juste un organigramme qui associe quelque chose ou un traitement à chaque "Ob" Si des regroupements peuvent être faits selon les pages, très bien mais limite on s'en fout du moment qu'on sait à quelle question répond chaque "ObNum" et comment on affecte chaque coche à une action, un prix, une valeur... vers une cible" (la plupart du temps un tableau ou une BD)

Ah , alors oui en effet, je rentre bien dans ton cadre de petit nombre d'Ob.

Pour les frames, j'ai bien vu que tu n'en tenais pas rigueur, et je comprends l'aspect cosmétique, je pourrais aussi les regrouper pour pouvoir limiter les sélections à une question. Mais dans mon cas, le nom de ma frame me permet de situer la colonne où va se référencer la réponse.

Cependant avec ces parties, j'ai une petite idée.

traitera de la même manière les Ob entre 20 et 30 qui ont le Tag "A"

du moment qu'on sait à quelle question répond chaque "ObNum" et comment on affecte chaque coche à une action, un prix, une valeur... vers une cible" (la plupart du temps un tableau ou une BD)

Est-ce qu'il serait possible de ressortir le tag que j'attribuerai pour situer ma colonne de réception des informations ?

un truc du genre :

For Each ctrl in Me.controls

If Typeof ctrl is MSForms.OptionButton & ctrl = true then
BDD.Sheets("BDD").cells(lg,ctrl.tag).Value = mid(ctrl.name,3,)
end if 

next

et pour récupérer les données (je tente un truc ...)

For i = 29 to 53
    j = BDD.Sheets("BDD").Cells(lg,i).value
For each ctrl in Me.controls
     If TypeOf ctrl is MSForms.Optionbutton & ctrl.tag = i then
     Me.Controls("OB" & j) = True
     End if
Next
Next

je n'ai pas encore la possibilité de faire l'essai, mais selon toi est-ce que ça serait une possibilité ? Et dans ce cas, je pourrais passer les boutons déclarés de 1 à X pour la classe. Ca me ferait un beau contournement <3 !

Je ne pourrais faire le test qu'a partir de lundi sur mon poste Pro, sachant qu'il me faudra le temps de tout renommer .

En tout cas j'ai appris de nouveaux trucs : je ne connaissais ni le mid, ni le tag ... je me débrouille grâce à mes recherches sur ce forum notamment, alors un grand merci déjà pour toute ces informations.

Je ne sais pas votre blabla est bien peu parlant pour moi. D'autant que je suis assez convaincu que vous regardez le problème par le petit bout de la lorgnette...

C'est un problème qu'on retrouve souvent chez les débutants qui affectionne beaucoup le couplage colonnes / boutons soit pour les masquer ou les démasquer soit pour y établir des relations de valeur.

N'utilisez pas de boucle utilisez quand c'est possible des fonctions directes : Avec des tags "lettres" il est possibles d'adresser facilement 26 colonnes : Chaque lettre ayant une valeur "Asc" de 65 à 90 (pour les majuscules) il est facile de traduire cette valeur avec un décalage quelconque... Il existe même des algo capables de gérer plus de colonne (650) avec 2 lettres... Mais on en reparlera quand on en saura un peu plus sur ce classeur.

Il est aussi possible de stocker des valeur multiples dans un tag... et de les lire avec Mid !

En résumé ne vous souciez pas du UserForm pour l'instant. Préparez une table BD suffisamment hiérarchisée pour concevoir le Userform en groupes, séries et autres sous-divisions si nécessaire et une arborescence décisionnelle (qui indique clairement quel type de retour vous attendez pour chaque groupe de questions :

Oui/non, Vrai/Faux, F/M

Une valeur parmi plusieurs proposées.

Une ou plusieurs réponses parmi une liste

Une évaluation de certains choix parmi une liste

Autres...

En clair présentez plutôt la problématique que la manière compliqué ou vous envisagez de la résoudre.

Ayez à l'esprit l'idée que avec votre présentation j'en viens même à douter que vous ayez réellement besoin d'un UserForm !

A+

Bonjour à tous,

J'ai fini par avoir l'autorisation de sortir le fichier que je joins donc. Le fichier comme indiqué, englobe bien plus de point que celui que j'ai abordé dans ma demande initiale.

Quelques informations complémentaires :

- Ce fichier doit être utilisé par plusieurs utilisateurs de différent types, un premier type n'aura besoin que de la BDD et du UF1 sur des actions ponctuelles, l'autre type utilisera principalement les autres userforms mais comme outil de travail, de fait le tableau de BDD sera a terme isolé avec le UF1 et appellera un fichiers "formulaires" préparé pour chacun des utilisateurs (repéré avec son Username) avec les autres userforms. Mais cela ne changera pas la structure de fonds des codes hormis la localisation de lecture ou d'écriture des données.

- Initialement le UF2 est à ouvrir impérativement en 1er avant de passer sur les autres, mais pour ce test et aller droit au but, j'ai inséré un bouton directement dans la BDD pour ouvrir l'UF4 et l'ai programmé pour récupérer les données de la première ligne uniquement.

- Le point initial de ma demande se trouve sur les UF4 et UF5 (même fonctionnement questions différentes, selon le motif indiqué dans la BDD, je n'ai pas encore attaqué le code pour le UF5).

- Les données de l'UF4 doivent avec s'intégrer dans les colonnes de la BDD de AC à BD pour les options buttons (selon la question) et les CheckBox dans les colonnes BB à CD. (la suite des colonnes correspondent à la même chose sur l'UF5)

Je reste disponible pour toute interrogation sur le fichier, car il est assez long. (Certaine macro ont été écrite dans des modules, mais encore non associé à son élément à ce stade) et je n'ai aucun doute sur le fait qu'il soit mal écrit : je n'ai jamais nié être débutante, et la programmation n'est pas mon coeur de métier...

Je n'ai pas fait de modification sur les noms des objets sur le fichier transmis comme évoqué auparavant.

Je reconfirme que la routine que je souhaite appliquer a ces boutons est bien d'ordre cosmétique ! L'idée est que ce formulaire soit plus lisible et userfriendly. La routine fonctionne sans soucis si j'insère les insère dans chaque évènement click. Mais le code étant déjà lourd et mal écrit... ça ne ferait qu'empirer les choses.

Concernant ta réponse à galopin, tu m'as totalement perdue sur ce morceaux :

N'utilisez pas de boucle utilisez quand c'est possible des fonctions directes : Avec des tags "lettres" il est possibles d'adresser facilement 26 colonnes : Chaque lettre ayant une valeur "Asc" de 65 à 90 (pour les majuscules) il est facile de traduire cette valeur avec un décalage quelconque... Il existe même des algo capables de gérer plus de colonne (650) avec 2 lettres... Mais on en reparlera quand on en saura un peu plus sur ce classeur.

Bonne journée à tous,

Bonjour,

Ton projet est bien trop avancé à mon gout aussi je préfère passer la main.

Si quelqu'un d'autre veut se lancer la place est chaude !

Bonne continuation.

A+

Bonjour galopin, merci de ton retour.

C'est pour ça que je voulais juste en apprendre plus sur cette fonctionnalité certe a des fins purement esthétique mais qui pourrait bien aider mes utilisateurs.. et que je n'ai joins qu'un fichier de test initialement... Pour comprendre le processus et l'adapter par la suite.

Je vais tenter lundi avec les éléments que tu m'as apporté sur les précédents postes avec le tag, même si pour toi c'est une mauvaise idée de boucler aussi simplement, je ne sais pas comment le faire autrement pour le moment.Le reste fonctionne et c'est le dernier point que je souhaite rajouter.

Merci encore pour tes conseils.

2test.xlsm (26.62 Ko)

Bonsoir à tous,

Suite au divers point aborder, j'ai fini pas trouver une solution. Elle n'est surement pas parfaite (voire même horrible !) mais ça fonctionne.

Je n'ai pas du tout compris ce que galopin a dit dans son post concernant les valeurs "Asc" et le fait de gérer plusieurs colonne avec une lettre dans le Tag. Peut-être une prochaine fois.

Je tenais a vous remercier a tous pour votre aide et votre réactivité.

Je remets ci-dessous mon fichier de test pour ceux que ça pourrait aider, malgré tout.

- Pour la gestion de l'évènement click je suis partie sur la méthode de Galopin. A savoir définir et renommer tout mes option buttons de 1 à X et les définir ainsi dans l'appelle de la classe.

- Cela me faisant perdre la localisation de la colonne dans le nom de mes option buttons, j'ai choisi de maintenir les Frames avec le numéro de mes colonnes cibles composé de 3 digit (2 dans mon test. Colone 1 > Fr001). Cela me fait conserver une donnée de localisation pour l'écriture puis pour la lecture en passant par la fonction .parent de mon option button. avec ce code :

Ecriture : (sur un bouton pour valider la saisie).

Private Sub CommandButton1_Click()
Dim OB As Object 'validation
Dim x As Integer

For Each OB In Me.Controls

If TypeOf OB Is MSForms.OptionButton Then
If OB = True And TypeOf OB.Parent Is Frame Then
x = Right(OB.Parent.name, 2)
Workbooks("Test.xlsm").Sheets("Feuil1").Cells(3, x).Value = Mid(OB.name, 4)
End If
End If

Next
End Sub

Lecture :

For i = 1 To 3 ' récupérer les données
 If Workbooks("Test.xlsm").Sheets("Feuil1").Cells(3, i) <> "" Then
 j = Workbooks("Test.xlsm").Sheets("Feuil1").Cells(3, i).Value
 Me.Controls("Opt" & j) = True
 End If
Next

Encore merci, et bon courage à ceux qui se lance dans de nouvelles aventures Excelienne

Bonne continuation

Rechercher des sujets similaires à "sub withevent module classe fonctionne pas multipage"