Créer sa propre classe de bouton

Bonjour,

Je commence en VBA et je cherche à créer ma propre classe de bouton. Cependant les conseils que j'ai trouvé ne concerne que les boutons appliqués à des users forms et non des commandbutton simplement posés sur une feuille.

Option Explicit

Public WithEvents Cmd As MSForms.CommandButton

Private Sub Cmd_Click()
    MsgBox Cmd.name
End Sub

Je cherche donc le type que je dois mettre pour ma classe dans le "As" pour que la commande en dessous puisse être exécutée :

Set newButton = .Worksheets("Test").OLEObjects.Add(ClassType:="Forms.CommandButton.1", Link:=False, DisplayAsIcon:=False, Left:=i, Top:=i, Width:=i, Height:=i)
With newButton
                         .name = "test" 'btnType + TexteSansEspaces(title) le nom du bouton lui même en tant qu'objet"
                         .Object.caption = "test" 'title 'ce qui est afficher sur le bouton
                         .Visible = True

                     End With
                     With newButton.Object
                         .BackColor = StringToRgb("255, 255, 255")
                         .FontSize = "15"
                         .FontName = "Arial"
                         .ForeColor = StringToRgb("0, 0, 0")

                    End With

J'ai utilisée la collection OLEobjects dans beaucoup d'autres méthodes c'est pourquoi j'aimerai faire marcher la commande set (qui bloque au niveau du ClassType).

Merci d'avance,

KiraWashi

Bonjour,

Je donne ici un exemple : Il n'a qu'un seul inconvénient il ne marche pas !

Cet exemple à néanmoins un avantage il est basique et ne provoque pas d'erreur :

Les boutons se créent bien mais les évènements ne fonctionnent pas.

Si quelqu'un veut bien se lancer dans des explications sans compliquer le problème ça serait déjà un bon début.

Le plus compliqué c'est de faire et d'expliquer simplement. Pour les complications : on s'en chargera ultérieurement !

Merci !

35wsclbtn.xlsm (75.85 Ko)

EDIT :

En cherchant bien, on arrive à trouver un exemple sur Google : Malheureusement il est trop complexe pour en tirer l'essentiel.

Pour résumer, l'intervenant utilisait une Collection pour faire fonctionner son système, et de plus il semble qu'il fallait passer par un évènement Activate pour relancer le processus. Ce qui me semble bien lourd pour une si petite chose...

Quelqu'un saura-t'il s'y coller sans noyer le poisson ?

Merci pour ta réponse et ton temps,

Le soucis ne se trouve pas ici :

 Set Obj = ActiveSheet.OLEObjects.Add("Forms.CommandButton.1")
 Set CBtns(i).CBtns = Obj.Object
Public WithEvents CBtns As MSForms.CommandButton

Ce n'est pas parce que tu initialise un objet MSForms.CommandButton avec un objet Forms.CommandButton.1 ?

Ca me semble étrange.

KiraWashi

Bonsoir,

celui-ci est guère plus compliqué et il fonctionne :

59classbtn.xlsm (51.24 Ko)

@ bientôt

LouReeD

Mais surtout à quoi va servir tous ces boutons ? Faut-il qu'ils soient sous forme de "bouton formulaire" ou "ActiveX" ? Avec de simple forme et Application.Caller vous pouvez très bien gérer une multitude de boutons ayant "la même action" sans avoir recours aux modules de class !

@ bientôt

LouReeD

36boutons-bis-1.xlsm (16.02 Ko)

C'est terrible cette propension à répondre aux questions qu'on ne se pose pas...

On retrouve ça très souvent chez certain voisin ! ... Mais ça ne fait pas avancer le schmilblick de 1 mm.

Personnellement je sais créer tout type d'objet sur une Feuille et les faire fonctionner comme prévu. J'en ai d'ailleurs semé de nombreux exemples au fil du temps sur ce forum (et pas que...)

Ce qui est demandé ici c'est de les créer de manière dynamique comme si c'était un mini calendrier par exemple...

Il semble que soit vraiment compliqué ! Même la doc de Microsoft habituellement très claire semble absconse sur ce sujet.

A+

Bonjour,

Excusez moi de ne pas comprendre votre première phrase...

J'ai fourni un fichier qui fonctionne comme vous le demandiez, je sais qu'il n'a pas la création des boutons, mais par comparaison il peut faire avancer le problème. Ensuite je demande la "vrai" nécessité de passer par ces boutons car des "shapes" sont plus compatibles et on peut faire de jolies choses, à voir le calendrier par shape fourni en téléchargement par Stellson.

Mais bon je ne vais pas me formaliser de tout, depuis peu je trouvais vos intrrvention un peu "sec", aujourd'hui c'est moi qui prend...

Et en effet, de mon côté je ne sais pas gérer tout ceci sous Excel et VBA, mais j'arrive souvent à faire ce dont j'ai envie, certe sans prendre les chemins les plus courts, sans formules ou autre.

Bref.

@ bientôt

LouReeD

Je ne m'étendrai pas plus sur le relationnel ressenti ici ou là par les uns et les autres... Je suis un vieux (et même un dinosaure ou un ours comme vous voudrez) par rapport à la plupart d'entre vous, et mon vocabulaire est bien suffisant pour appeler un chat : un chat. Je n'irai donc pas plus loin dans mes explications. Comprenne qui pourra...

Je ne suis intervenu sur ce sujet que parce qu'il parlait d'un sujet peu traité si j'en crois mes recherches sur Google. Comme les explications de Microsoft sur ce sujet sont clairement... ésotériques, j'espérai qu'un pédago dans l'âme y apporterait une solution. Malheureusement...

Ce que je crois : Les OleObjects ne font pas partie de la classe d'Objects natifs d'Excel implémentés dans le noyau dur au tréfond du code d'Excel.

Ainsi il n'ont pas la plupart des propriétés d'objets ordinaires. Il en va ainsi de la propriété Caption mais aussi des nombreuses autres qu'on trouve dans la fenêtre des propriétés. Aussi toute tentative de déclarer un obj as Objet dans le code se solde par un message d'erreur puisque OleObject est un type d'object particulier.

Il en va de même si l'on déclare obj as OleObject, le plantage ne se produit pas au même endroit mais le résultat est le même.

La solution est donc de ne pas typer obj et de laisser VBA arbitrer à sa guise. D'aucuns appelleraient ça mettre la poussière sous le tapis, mébon...

Clairement le problème est dans la création d'Event. Il est probable qu'on puisse remplacer la création d'une collection par un Array de Shapes, cependant je n'ai pas eu le temps de m'y essayer... Toutefois, il ne me semble pas certain que le module de classe puisse gérer l'évènement Click comme pour les TextBox peut-être qu'une approche via MouseDown et GotFocus est nécessaire. Par ailleurs je crois comprendre que des objets ainsi créés pourraient nécessiter une nouvelle instanciation à chaque activation, désactivation de la feuille ?

Bref c'est tout sauf simple et il faut effectivement une bonne dose de motivation pour persister dans cette voie... A chaque fois que c'est possible, la récupération d'objet préconstruits semble effectivement préférable... comme le suggère LouReed est préférable.

Pijaku si tu passes par là, tu aurais surement des choses intéressantes à dire !

A+

EDIT : J'ai fini par retrouver la référence qui parle de ce sujet (en piève jointe)

20ajouter-btn-ws.zip (80.93 Ko)

Bonsoir KiraWashi, Le Forum,

Ci-dessous un fichier réalisé présentant les deux cas de figure.

La première par le biais de boutons de formulaire.

La deuxième qui t'intéresse plus, par le biais de boutons sur la feuille du classeur.

Voir notes en rouge sur la premier Onglet et l'ensemble des macros sur Workbook, Feuille, Module et Module de Classe.

Le formulaire comme la feuille n'a pas de code VBA pour les boutons.

Puisque c'est le Module de Classe qui gère le clic (Formulaire et Feuille) et le double-clic (Feuille).

Merci X Cellus c'est exactement ce que je cherchais à faire.

J'ai une question par rapport à la création des boutons, comment je peux faire pour passer en paramètre leur width, height, top, left, couleur, taille et type de police en utilisant la classe btnClasse qu'on a crée ?

J'ai fait une macro qui génère des boutons avec tous ses paramètres et j'aimerai pouvoir l'adapter au nouveau type de bouton que tu as faites.

KiraWashi

A nouveau,

Voici un exemple, voir la partie droite de la première feuille.

Ainsi que les lignes de code ajoutées dans le module Main, macro Essai.

Bonsoir,

ci-joint un exemple de classe associée aux 2 boutons de commande de la feuille Feuil1. Tout est géré dans le code de la feuille Feuil1 : construction des instances de la classe et événement Clic

Bonsoir @ tous !

Que ce soit le fichier que j'ai fourni "guère plus compliqué", celui de X Cellus ou bien celui de thev, ce qui manque par rapport à la demande, que galopin01 a bien repris : "Ce qui est demandé ici c'est de les créer de manière dynamique comme si c'était un mini calendrier par exemple..."
J'attends donc les propositions suivantes

Comme cela j'apprendrais encore un peu... Mais mon gros soucis c'est de ne pas retenir...

@ bientôt

LouReeD

Suite,

Ce qui est demandé ici c'est de les créer de manière dynamique

Soit les boutons sont déjà présents sur la feuille. Et ceux-ci sont activés soit par le Workbook_Open, soit par l'Activate de la feuille ou par clic sur un contrôle ou une cellule de la feuille (pourquoi pas).

Soit ces boutons ne sont pas présents sur la feuille. Mais ils sont ajoutés par un Add et le type de Contrôle (objet désiré).

Cela ne change rien au fonctionnement du module de Classe. Sauf qu'il faudra attendre que tous les boutons ou autres contrôles soient ajoutés.

Avant de pouvoir les instancier par la Classe.

On ne peut faire dans une feuille les deux en même temps. L'ajout de contrôle (Add) et aussitôt l'application de la Classe sur ces objets Activex.

Contrairement aux Activex dans les formulaires.

Donc en reprenant le code de galopin01, on boucle une première fois pour créer les boutons de façon dynamique et en fonction d'un nombre aléatoire par exemple, on garde en mémoire ces créations afin de les reprendre pour leur attribuer l'instance ? Je commence à comprendre... si tant est que j'y comprenne un seul truc !

Merci pour ces précision, et donc une fois ceci fait les boutons sont opérationnels ou faut il les "réactiver" ?

@ bientôt

LouReeD

Bonsoir,

Pour répondre à LouReed, ci-joint exemple de création dynamique des boutons de commande avec la classe associée.

mode opératoire : basculer sur Feuil2 et revenir sur Feuil1. Répéter pour créer autant de boutons que souhaité.

Merci thev !

Après un bref essai : première bascule, ok, deuxième bascule = 2 boutons mais seulement le nouveau fonctionne et ainsi de suite...

@ bientôt

LouReeD

Après un bref essai : première bascule, ok, deuxième bascule = 2 boutons. Mais seulement le nouveau fonctionne et ainsi de suite...
Exact.

ci-jointe correction :

Merci à tous pour vos retours.

La méthode de XCellus me semble la plus adaptée à mon problème, merci pour les précisions sur le passage de paramètre.

Je vais essayer d'appliquer ça à mon fichier et je reviens vers vous en cas de pépin.

KiraWashi

On ne peut faire dans une feuille les deux en même temps. L'ajout de contrôle (Add) et aussitôt l'application de la Classe sur ces objets ActiveX.
J'en étais un peu arrivé à cette même constatation avec le commentaire de pijaku avant de voir le tien... mais je trouve ça frustrant !
Bon c'est vrai que en bout de course on ne voit pas bien l’intérêt de créer une avalanche de contrôles dans une feuille alors qu'on pourrait surement se contenter d'une gestion d'évenements, mébon... C'était juste pour réviser une peu mes acquisitions...
J'avoue que je n'ai pas regardé l'exemple de thev qui me semblait partir dans la même direction : L'évènement changement de feuille...

A+
Rechercher des sujets similaires à "creer propre classe bouton"