VBA: Créer un boutton dynamiquement

focdagosu Messages postés 6 Date d'inscription lundi 20 novembre 2006 Statut Membre Dernière intervention 20 novembre 2008 - 14 nov. 2008 à 20:59
focdagosu Messages postés 6 Date d'inscription lundi 20 novembre 2006 Statut Membre Dernière intervention 20 novembre 2008 - 20 nov. 2008 à 23:06
Bonjour,

J'ai un problème qui doit certainement être tout simple, mais même après avoir épluché tous les codes sources que j'ai pu trouvé, je n'ai pas réussi à le résoudre.

Je veux simple créer un bouton, pour ensuite lui associer une fonction pré-existante. Le problème est que je veux créer ce bouton dans une feuille excel que je viens de créer dynamiquement. Si je veux le créer dans ma feuille interface (celle qui contient le code), pas de problème, le code suivant fonctionne:

Public Sub CreateButtonTest1(nomClient)
    ActiveSheet.Buttons.Add(199.5, 300, 81, 36).Select
    Selection.Name = nomClient
    Selection.OnAction = "test2"
End Sub

Par contre, quand j'essaie de passer en argument mon objet WorkSheet, ca ne fonctionne pas:

(newSheet est du type Worksheet, créé à partir d'un nouveau WorkBook
et nomClient est de type string).

Public Sub CreateButtonTest2(newSheet, nomClient)
    newSheet.Buttons.Add(199.5, 300, 81, 36).Select
    Selection.Name = nomClient
    Selection.OnAction = "test2"
End Sub

L'erreur est: "438"
Propriété ou méthode non géré par cet objet
et le débuggeur bug à la ligne Selection.OnAction = "test2"

A noter que le bouton est bien créé la ou je veux (dans mon newSheet), mais inutilisable car pas de lien vers une fonction.

Si quelqu'un a une idée d'ou peut venir le problème, je lui serai vraiment reconnaissant !
Une autre solution serait de changer le ActiveSheet, mais je n'ai pas réussi (pourtant ca doit être possible et facile).

Merci d'avance,
Maxence

10 réponses

cs_Orohena Messages postés 577 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 20 novembre 2010 4
14 nov. 2008 à 21:59
Bonjour focdagosu


J'ai simulé ta situation et j'ai rencontré la même erreur. En fait, la macro test2, qui est dans ta feuille interface, n'est pas "visible" dans ton newSheet. Si tu peux la mettre dans un module, ça résoudra ton problème.

Si tu ne peux pas la déplacer, tu peux créer une macro intermédiaire dans un module :

sub test2
   worksheets("interface").test2
end sub

J'espère avoir répondu à ta question

Amicalement
focdagosu Messages postés 6 Date d'inscription lundi 20 novembre 2006 Statut Membre Dernière intervention 20 novembre 2008
14 nov. 2008 à 23:41
Salut,

Merci d'essayer de résoudre mon problème !

Par contre test2 est déja dans un module:

Public Sub test2()
    MsgBox ("yeah")
End Sub

Donc je ne pense pas que ce soit le problème.

Bye,
Maxence
cs_Orohena Messages postés 577 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 20 novembre 2010 4
15 nov. 2008 à 00:22
Sorry, Maxence, je n'étais basé sur ta phrase dans ma feuille interface (celle qui contient le code)

@+
focdagosu Messages postés 6 Date d'inscription lundi 20 novembre 2006 Statut Membre Dernière intervention 20 novembre 2008
19 nov. 2008 à 05:26
salut,

J'ai du mal m'exprimer. En faite, la feuille interface est celle qui lance les fonctions (des boutons créés avec l'éditeur d'objet). Les fonctions sont placées dans des modules, mais il reste que la feuille "référence" est la feuille interface.

Moi je voudrais créer mes nouveaux boutons sur une feuille créée dans un nouveaux workbook. Ca ne doit pas être très compliqué, mais quelque chose doit m'échaper.

Si quelqu'un à une idée... merci d'avance !

Bye
Maxence

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

Posez votre question
cs_Orohena Messages postés 577 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 20 novembre 2010 4
19 nov. 2008 à 17:03
Bonjour,

Est-ce que les fonctions sont disponibles dans le nouveau workbook ou uniquement dans l'ancien ?

cdlt
focdagosu Messages postés 6 Date d'inscription lundi 20 novembre 2006 Statut Membre Dernière intervention 20 novembre 2008
20 nov. 2008 à 15:48
Bonjour,

J'aimerais bien pouvoir vous répondre, mais je ne sais pas vraiment comment tester cela.

En faite j'ai ma feuil1 de mon fichier Excel (que j'ouvre en tant que page de démarrage du programme). Celui ci contient juste des boutons, qui renvoie vers des fonctions contenues dans des modules. Ce sont ces fonctions qui créent le nouveau Workbook et font les calculs.

Après je ne sais pas comment je pourrais tester si ce nouveau Workbook peut accéder aux fonctions (enfin aux SUB plutot, qui sont toutes en PUBLIC).

Si tu as une idée de comment je peux tester ca, je suis preneur !

Salutations,
Maxence
cs_Orohena Messages postés 577 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 20 novembre 2010 4
20 nov. 2008 à 19:37
Bonjour focdagosu


Compte tenu des explications que tu as données, je pense qu'il faut modifier ta propriété OnAction pour spécifier que la macro test2 se trouve dans le classeur Actuel :

Public Sub CreateButtonTest1(nomClient)
    ActiveSheet.Buttons.Add(199.5, 300, 81, 36).Select
    Selection.Name = nomClient
    Selection.OnAction = "Actuel!test2"
End Sub

Cordialement
cs_Orohena Messages postés 577 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 20 novembre 2010 4
20 nov. 2008 à 19:41
Je pense que tu as compris que le classeur "Actuel" est celui qui contient ta feuille de démarrage et ta macro test2.
focdagosu Messages postés 6 Date d'inscription lundi 20 novembre 2006 Statut Membre Dernière intervention 20 novembre 2008
20 nov. 2008 à 23:06
Bonjour,

Mon fichier Excel s'appelle "interfaceCNH.xlsm" et ma feuille (avec les boutons qui lancent mon programme) s'appelle "Programme". J'ai essayé avec:

Selection.OnAction = " interfaceCNH!test2 "

puis avec

"interfaceCNH!Programme!test2"

et enfin avec

"Programme!test2"

et

"Feuil1!test2"

Mais toujours "Propriété ou méthode non géré par cet objet".

Par contre  la procédure avec laquelle je veux travailler est:

Public Sub CreateButtonTest2(newSheet, nomClient)

    newSheet.Buttons.Add(199.5, 300, 81, 36).Select
    Selection.Name = nomClient
    Selection.OnAction = "Feuil1!test2"
End Sub

Car celle avec ActiveSheet fonctionne (mais place les boutons dans le classeur qui lance la fonction, alors que je veux les placer dans une nouvelle feuille d'un nouveau classeur).

Bye,
Maxence
focdagosu Messages postés 6 Date d'inscription lundi 20 novembre 2006 Statut Membre Dernière intervention 20 novembre 2008
20 nov. 2008 à 23:06
Bonjour,

Mon fichier Excel s'appelle "interfaceCNH.xlsm" et ma feuille (avec les boutons qui lancent mon programme) s'appelle "Programme". J'ai essayé avec:

Selection.OnAction = " interfaceCNH!test2 "

puis avec

"interfaceCNH!Programme!test2"

et enfin avec

"Programme!test2"

et

"Feuil1!test2"

Mais toujours "Propriété ou méthode non géré par cet objet".

Par contre  la procédure avec laquelle je veux travailler est:

Public Sub CreateButtonTest2(newSheet, nomClient)

    newSheet.Buttons.Add(199.5, 300, 81, 36).Select
    Selection.Name = nomClient
    Selection.OnAction = "Feuil1!test2"
End Sub

Car celle avec ActiveSheet fonctionne (mais place les boutons dans le classeur qui lance la fonction, alors que je veux les placer dans une nouvelle feuille d'un nouveau classeur).

Bye,
Maxence
Rejoignez-nous