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

comment detecter des objets commandbutton dans une feuille Excel?

6 réponses
Avatar
mike2050
Pour une application industrielle, je dois créer une macro qui simplifie
certaines tâches. J'ai plus de 200 boutons dans une feuille Excel 2003 qui
ont tous pour but de lancer Application.GetOpenFileName ... Mais je n'arrive
pas à faire de procédure commune puisque je ne trouve pas le moyen de
détecter tous les objets de type "CommandButton" de ma feuille Excel.
Pouvez-vous faire quelque chose pour moi?

6 réponses

Avatar
michdenis
Bonjour Mike2050,

Tu as un exemple complet là :
http://cjoint.com/?mvoMLVGB12

Il s'agit d'un module de classe nommé cmdButton dans lequel tu dois dans la procédure clic,
définir ce que tu veux que chaque bouton fasse lorsque tu cliques dessus. Chaque bouton
va réagir de la même façon.

Dans le module1, il y a instantiation de l'objet CmdButton. Attention, dans mon code
j'ai utilisé "Feuil1" la propriété "Name" du module de classe de la feuille "Feuil1"

Dans le ThisWorkbook, la gestion en mémoire de l'objet CmdBouton selon que la
Feuil1 est la feuille active ou non.


Salutations!



"mike2050" a écrit dans le message de news:

Pour une application industrielle, je dois créer une macro qui simplifie
certaines tâches. J'ai plus de 200 boutons dans une feuille Excel 2003 qui
ont tous pour but de lancer Application.GetOpenFileName ... Mais je n'arrive
pas à faire de procédure commune puisque je ne trouve pas le moyen de
détecter tous les objets de type "CommandButton" de ma feuille Excel.
Pouvez-vous faire quelque chose pour moi?
Avatar
mike2050
merci énormément michdenis!
j'avoue être super bluffé par le peu de ligne qu'on trouve dans le code!
ce geste si sypathique me retire une grosse épine du pied puisque je planche
sur le problème depuis une bonne journée de travail


Bonjour Mike2050,

Tu as un exemple complet là :
http://cjoint.com/?mvoMLVGB12

Il s'agit d'un module de classe nommé cmdButton dans lequel tu dois dans la procédure clic,
définir ce que tu veux que chaque bouton fasse lorsque tu cliques dessus. Chaque bouton
va réagir de la même façon.

Dans le module1, il y a instantiation de l'objet CmdButton. Attention, dans mon code
j'ai utilisé "Feuil1" la propriété "Name" du module de classe de la feuille "Feuil1"

Dans le ThisWorkbook, la gestion en mémoire de l'objet CmdBouton selon que la
Feuil1 est la feuille active ou non.


Salutations!



"mike2050" a écrit dans le message de news:

Pour une application industrielle, je dois créer une macro qui simplifie
certaines tâches. J'ai plus de 200 boutons dans une feuille Excel 2003 qui
ont tous pour but de lancer Application.GetOpenFileName ... Mais je n'arrive
pas à faire de procédure commune puisque je ne trouve pas le moyen de
détecter tous les objets de type "CommandButton" de ma feuille Excel.
Pouvez-vous faire quelque chose pour moi?





Avatar
michdenis
Bienvenue Mike,

Le code en module1 devrait se lire ainsi :
Déclaration des variables mieux adaptée!

Dim Bouton() As New CmdBouton

Sub GroupeBoutons()
Dim Nb As Integer, B As OLEObject
For Each B In Feuil1.OLEObjects
If TypeName(B.Object) = "CommandButton" Then
Nb = Nb + 1
ReDim Preserve Bouton(1 To Nb)
Set Bouton(Nb).ColBouton = B.Object
End If
Next
End Sub


Salutations!


"mike2050" a écrit dans le message de news:

merci énormément michdenis!
j'avoue être super bluffé par le peu de ligne qu'on trouve dans le code!
ce geste si sypathique me retire une grosse épine du pied puisque je planche
sur le problème depuis une bonne journée de travail


Bonjour Mike2050,

Tu as un exemple complet là :
http://cjoint.com/?mvoMLVGB12

Il s'agit d'un module de classe nommé cmdButton dans lequel tu dois dans la procédure clic,
définir ce que tu veux que chaque bouton fasse lorsque tu cliques dessus. Chaque bouton
va réagir de la même façon.

Dans le module1, il y a instantiation de l'objet CmdButton. Attention, dans mon code
j'ai utilisé "Feuil1" la propriété "Name" du module de classe de la feuille "Feuil1"

Dans le ThisWorkbook, la gestion en mémoire de l'objet CmdBouton selon que la
Feuil1 est la feuille active ou non.


Salutations!



"mike2050" a écrit dans le message de news:

Pour une application industrielle, je dois créer une macro qui simplifie
certaines tâches. J'ai plus de 200 boutons dans une feuille Excel 2003 qui
ont tous pour but de lancer Application.GetOpenFileName ... Mais je n'arrive
pas à faire de procédure commune puisque je ne trouve pas le moyen de
détecter tous les objets de type "CommandButton" de ma feuille Excel.
Pouvez-vous faire quelque chose pour moi?





Avatar
mike2050
ok!
si je comprend bien tu définis B comme étant un objet OLE plutôt qu'un
variant... mais ça marche quand même avec le variant!?
par contre, j'avoue que j'ai du mal à comprendre la logique de programmation
voilà comme je la comprend :

Dim Bouton() As New CmdBouton 'la variable bouton est un tableau uniligne
déclaré
'comme étant un module de
classe
'qu'est-ce qu'un module de
classe en fait?
Sub GroupeBoutons() 'déclaration d'une procédure nommée
GroupeBoutons
Dim Nb As Integer, B As OLEObject 'déclaration des variable Nb et B
For Each B In Feuil1.OLEObjects 'pour chaque objet OLE dans la
feuille 1
If TypeName(B.Object) = "CommandButton" Then 'si le nom de cet objet
est commandbutton
Nb = Nb + 1 'on
incrémente la variable Nb de 1
ReDim Preserve Bouton(1 To Nb) 'là je ne
comprend pas
Set Bouton(Nb).ColBouton = B.Object 'là non plus!
End If
Next
End Sub



Bienvenue Mike,

Le code en module1 devrait se lire ainsi :
Déclaration des variables mieux adaptée!

Dim Bouton() As New CmdBouton

Sub GroupeBoutons()
Dim Nb As Integer, B As OLEObject
For Each B In Feuil1.OLEObjects
If TypeName(B.Object) = "CommandButton" Then
Nb = Nb + 1
ReDim Preserve Bouton(1 To Nb)
Set Bouton(Nb).ColBouton = B.Object
End If
Next
End Sub


Salutations!


"mike2050" a écrit dans le message de news:

merci énormément michdenis!
j'avoue être super bluffé par le peu de ligne qu'on trouve dans le code!
ce geste si sypathique me retire une grosse épine du pied puisque je planche
sur le problème depuis une bonne journée de travail


Bonjour Mike2050,

Tu as un exemple complet là :
http://cjoint.com/?mvoMLVGB12

Il s'agit d'un module de classe nommé cmdButton dans lequel tu dois dans la procédure clic,
définir ce que tu veux que chaque bouton fasse lorsque tu cliques dessus. Chaque bouton
va réagir de la même façon.

Dans le module1, il y a instantiation de l'objet CmdButton. Attention, dans mon code
j'ai utilisé "Feuil1" la propriété "Name" du module de classe de la feuille "Feuil1"

Dans le ThisWorkbook, la gestion en mémoire de l'objet CmdBouton selon que la
Feuil1 est la feuille active ou non.


Salutations!



"mike2050" a écrit dans le message de news:

Pour une application industrielle, je dois créer une macro qui simplifie
certaines tâches. J'ai plus de 200 boutons dans une feuille Excel 2003 qui
ont tous pour but de lancer Application.GetOpenFileName ... Mais je n'arrive
pas à faire de procédure commune puisque je ne trouve pas le moyen de
détecter tous les objets de type "CommandButton" de ma feuille Excel.
Pouvez-vous faire quelque chose pour moi?










Avatar
michdenis
Mike,

Plus tu es précis dans le type de variable au moment de sa déclaration,
plus rapide et efficace sera ton code.
Le type variant est à utiliser seulement quand on ne peut faire autrement !

Le concept "module de classe" n'est pas très facile à comprendre... et je
n'essaierai pas de tout expliquer en quelque ligne, il y a des volumes entiers
seulement sur ce sujet.

Le plus simplement, le module de Classe EST une "Nouvelle Classe d'objet"
comme "Range", "shape" ... que j'ai ajoutée à la liste des objets disponibles
dans Excel. Tout le code afférent à cette classe d'objet est placé dans le
module de classe(c'est ce qu'on appelle encapsulation).

Cette nouvelle "classe d'objet" contient un objet "ColBouton"
que l'on a associé dans la déclaration à un "BoutonDeCommande"

Je dois faire comprendre à excel qu'il y a dorénavant une nouvelle
classe d'objet que je voudrais utiliser. C'est ce à quoi sert la ligne
de déclaration dans le module 1
Dim Bouton() As New CmdBouton (nouvelle classe objet)
Cette ligne de code fait référence (instantie) à la nouvelle classe d'objet que
je viens de créer.

Maintenant qu'excel a en mémoire la nouvelle classe d'objet, encore faut-il
que je lui dise comment je veux m'en servir et je le fais par la procédure
du module 1 où je fais l'association entre l'instance de la nouvelle classe d'objet,
l'objet que cette dernière contient et les boutons de commande de mon application.
Set Bouton(Nb).ColBouton = B.Object

Le processus ressemble à d'autres classes objets que tu utilises fréquemment
dim Rg as Range
Set Rg = range("A1")


Lorsque je type le point après Bouton(Nb), excel me propose
l'objet que j'y ai défini ColBouton car cet objet appartient à la
nouvelle classe l'objet "CmdBouton"

C'est probablement pas très clair ... mais c'est un début !


Salutations!





"mike2050" a écrit dans le message de news:

ok!
si je comprend bien tu définis B comme étant un objet OLE plutôt qu'un
variant... mais ça marche quand même avec le variant!?
par contre, j'avoue que j'ai du mal à comprendre la logique de programmation
voilà comme je la comprend :

Dim Bouton() As New CmdBouton 'la variable bouton est un tableau uniligne
déclaré
'comme étant un module de
classe
'qu'est-ce qu'un module de
classe en fait?
Sub GroupeBoutons() 'déclaration d'une procédure nommée
GroupeBoutons
Dim Nb As Integer, B As OLEObject 'déclaration des variable Nb et B
For Each B In Feuil1.OLEObjects 'pour chaque objet OLE dans la
feuille 1
If TypeName(B.Object) = "CommandButton" Then 'si le nom de cet objet
est commandbutton
Nb = Nb + 1 'on
incrémente la variable Nb de 1
ReDim Preserve Bouton(1 To Nb) 'là je ne
comprend pas
Set Bouton(Nb).ColBouton = B.Object 'là non plus!
End If
Next
End Sub



Bienvenue Mike,

Le code en module1 devrait se lire ainsi :
Déclaration des variables mieux adaptée!

Dim Bouton() As New CmdBouton

Sub GroupeBoutons()
Dim Nb As Integer, B As OLEObject
For Each B In Feuil1.OLEObjects
If TypeName(B.Object) = "CommandButton" Then
Nb = Nb + 1
ReDim Preserve Bouton(1 To Nb)
Set Bouton(Nb).ColBouton = B.Object
End If
Next
End Sub


Salutations!


"mike2050" a écrit dans le message de news:

merci énormément michdenis!
j'avoue être super bluffé par le peu de ligne qu'on trouve dans le code!
ce geste si sypathique me retire une grosse épine du pied puisque je planche
sur le problème depuis une bonne journée de travail


Bonjour Mike2050,

Tu as un exemple complet là :
http://cjoint.com/?mvoMLVGB12

Il s'agit d'un module de classe nommé cmdButton dans lequel tu dois dans la procédure clic,
définir ce que tu veux que chaque bouton fasse lorsque tu cliques dessus. Chaque bouton
va réagir de la même façon.

Dans le module1, il y a instantiation de l'objet CmdButton. Attention, dans mon code
j'ai utilisé "Feuil1" la propriété "Name" du module de classe de la feuille "Feuil1"

Dans le ThisWorkbook, la gestion en mémoire de l'objet CmdBouton selon que la
Feuil1 est la feuille active ou non.


Salutations!



"mike2050" a écrit dans le message de news:

Pour une application industrielle, je dois créer une macro qui simplifie
certaines tâches. J'ai plus de 200 boutons dans une feuille Excel 2003 qui
ont tous pour but de lancer Application.GetOpenFileName ... Mais je n'arrive
pas à faire de procédure commune puisque je ne trouve pas le moyen de
détecter tous les objets de type "CommandButton" de ma feuille Excel.
Pouvez-vous faire quelque chose pour moi?










Avatar
mike2050
mais si mais si! c'est assez clair en fait. seulement comme je suis débutant,
il me fallait un certain temps d'adaptation et surtout une bonne explication
comme la tienne!
mais au fait, tu es administrateur sur ce forum? Car j'ai trouver ton nom
dans beaucoup de sujets... à te lire, on a l'impression que tu as participer
très activement à la création de l'aide de VBA dans Excel voire, à VBA
lui-même!

En tout cas merci beaucoup pour les réponses que tu m'as apporté et surtout
pour ta disponibilité


Mike,

Plus tu es précis dans le type de variable au moment de sa déclaration,
plus rapide et efficace sera ton code.
Le type variant est à utiliser seulement quand on ne peut faire autrement !

Le concept "module de classe" n'est pas très facile à comprendre... et je
n'essaierai pas de tout expliquer en quelque ligne, il y a des volumes entiers
seulement sur ce sujet.

Le plus simplement, le module de Classe EST une "Nouvelle Classe d'objet"
comme "Range", "shape" ... que j'ai ajoutée à la liste des objets disponibles
dans Excel. Tout le code afférent à cette classe d'objet est placé dans le
module de classe(c'est ce qu'on appelle encapsulation).

Cette nouvelle "classe d'objet" contient un objet "ColBouton"
que l'on a associé dans la déclaration à un "BoutonDeCommande"

Je dois faire comprendre à excel qu'il y a dorénavant une nouvelle
classe d'objet que je voudrais utiliser. C'est ce à quoi sert la ligne
de déclaration dans le module 1
Dim Bouton() As New CmdBouton (nouvelle classe objet)
Cette ligne de code fait référence (instantie) à la nouvelle classe d'objet que
je viens de créer.

Maintenant qu'excel a en mémoire la nouvelle classe d'objet, encore faut-il
que je lui dise comment je veux m'en servir et je le fais par la procédure
du module 1 où je fais l'association entre l'instance de la nouvelle classe d'objet,
l'objet que cette dernière contient et les boutons de commande de mon application.
Set Bouton(Nb).ColBouton = B.Object

Le processus ressemble à d'autres classes objets que tu utilises fréquemment
dim Rg as Range
Set Rg = range("A1")


Lorsque je type le point après Bouton(Nb), excel me propose
l'objet que j'y ai défini ColBouton car cet objet appartient à la
nouvelle classe l'objet "CmdBouton"

C'est probablement pas très clair ... mais c'est un début !


Salutations!





"mike2050" a écrit dans le message de news:

ok!
si je comprend bien tu définis B comme étant un objet OLE plutôt qu'un
variant... mais ça marche quand même avec le variant!?
par contre, j'avoue que j'ai du mal à comprendre la logique de programmation
voilà comme je la comprend :

Dim Bouton() As New CmdBouton 'la variable bouton est un tableau uniligne
déclaré
'comme étant un module de
classe
'qu'est-ce qu'un module de
classe en fait?
Sub GroupeBoutons() 'déclaration d'une procédure nommée
GroupeBoutons
Dim Nb As Integer, B As OLEObject 'déclaration des variable Nb et B
For Each B In Feuil1.OLEObjects 'pour chaque objet OLE dans la
feuille 1
If TypeName(B.Object) = "CommandButton" Then 'si le nom de cet objet
est commandbutton
Nb = Nb + 1 'on
incrémente la variable Nb de 1
ReDim Preserve Bouton(1 To Nb) 'là je ne
comprend pas
Set Bouton(Nb).ColBouton = B.Object 'là non plus!
End If
Next
End Sub



Bienvenue Mike,

Le code en module1 devrait se lire ainsi :
Déclaration des variables mieux adaptée!

Dim Bouton() As New CmdBouton

Sub GroupeBoutons()
Dim Nb As Integer, B As OLEObject
For Each B In Feuil1.OLEObjects
If TypeName(B.Object) = "CommandButton" Then
Nb = Nb + 1
ReDim Preserve Bouton(1 To Nb)
Set Bouton(Nb).ColBouton = B.Object
End If
Next
End Sub


Salutations!


"mike2050" a écrit dans le message de news:

merci énormément michdenis!
j'avoue être super bluffé par le peu de ligne qu'on trouve dans le code!
ce geste si sypathique me retire une grosse épine du pied puisque je planche
sur le problème depuis une bonne journée de travail


Bonjour Mike2050,

Tu as un exemple complet là :
http://cjoint.com/?mvoMLVGB12

Il s'agit d'un module de classe nommé cmdButton dans lequel tu dois dans la procédure clic,
définir ce que tu veux que chaque bouton fasse lorsque tu cliques dessus. Chaque bouton
va réagir de la même façon.

Dans le module1, il y a instantiation de l'objet CmdButton. Attention, dans mon code
j'ai utilisé "Feuil1" la propriété "Name" du module de classe de la feuille "Feuil1"

Dans le ThisWorkbook, la gestion en mémoire de l'objet CmdBouton selon que la
Feuil1 est la feuille active ou non.


Salutations!



"mike2050" a écrit dans le message de news:

Pour une application industrielle, je dois créer une macro qui simplifie
certaines tâches. J'ai plus de 200 boutons dans une feuille Excel 2003 qui
ont tous pour but de lancer Application.GetOpenFileName ... Mais je n'arrive
pas à faire de procédure commune puisque je ne trouve pas le moyen de
détecter tous les objets de type "CommandButton" de ma feuille Excel.
Pouvez-vous faire quelque chose pour moi?