Lancer une macro en cliquant sur un bouton ou une image



Commencez par écrire une macro simple dans un nouveau module, par exemple :
Sub mess()
Msgbox "Bonjour"
End Sub


Insérer ensuite une image dans la page Excel :
Insertion / Image / A partir du fichier... puis sélectionnez la plus belle photo de vos vacances.
Vous pouvez aussi copier une image n'importe où (sur le net par exemple) et la coller dans votre page Excel.

Cliquez avec le bouton droit de la souris sur l'image, puis sur "affecter une macro..." dans le menu contextuel qui apparait, et cliquez sur le nom de votre macro (mess).
La macro "mess" est affectée à l'image.

Il suffit maintenant de cliquer sur l'image pour qu'elle vous dise bonjour.



Au lieu d'une image, vous pouvez utiliser un bouton.

Cliquez sur Affichage / barres d'outils / puis cochez "Commandes" pour afficher la barre d'outils correspondante.

Dans cette barre d'outils, sélectionnez le bouton. Le pointeur de la souris se transforme en croix et vous permet de dessiner la forme du bouton sur la page Excel.

Reste à lui affecter une macro :
Double cliquez sur le bouton, vous arrivez dans la page de code associée à la page contenant votre bouton. Le squelette de la macro associée au bouton est déjà inscrit :
Private Sub CommandButton1_Click()
End Sub

Il suffit d'y ajouter les instructions souhaitées, par exemple :
Private Sub CommandButton1_Click()
MsgBox "bonjour"
End Sub

Le message "bonjour" est associé au bouton.

Reste encore à désactiver le mode "création" en cliquant sur l'icone en forme d'équerre de la barre d'outils "Commandes".

Remarque :
ma macro, qui fonctionne correctement quand elle est lancée directement, ne fonctionne plus quand elle est lancée par un bouton !
Si les lignes VBA qui doivent être lancées par clic sur le bouton nécessitent la manipulation de cellules Excel, on peut rencontrer une erreur. Par exemple, si vous essayez de lancer la copie de A1 en B3 par action sur le bouton :
Private Sub CommandButton1_Click()
Range("A1").Copy Range("B3")
End Sub

...vous aurez une erreur "La méthode Copy de la classe Range a échoué"
Alors que la macro suivante lancée manuellement se déroule sans problème :
Sub copie()
Range("A1").Copy Range("B3")
End Sub

L'explication vient du fait que après le clic sur le bouton, ce dernier reste sélectionné et la macro ne peut plus accéder aux cellules de la page Excel.
Une solution simple consiste à sélectionner une cellule au début de la macro (le bouton perd ainsi le focus) :
Private Sub CommandButton1_Click()
Cells(1).Select
Range("A1").Copy Range("B3")
End Sub

Si le fait de modifier la cellule active est gênant, vous pouvez aussi modifier les propriétés du bouton pour lui interdire de prendre le focus :
En mode création, double cliquez sur le bouton pour accéder au code associé au bouton.
Affichage / Fenetre Propriétés permet d'afficher (si ce n'est déjà fait) les propriétés du bouton.
Il suffit de passer à False la propriété TakeFocusOnClick du bouton.



Le bouton que nous avons utilisé ci-dessus est un bouton VBA. C'est celui qui offre le plus de posibilités (voir la longue liste de ses propriétés).
Il existe dans Excel un autre type de bouton, celui de la barre d'outils "Formulaires".
Bouton moins sophistiqué, mais peut-être plus simple à utiliser :

Cliquez sur Affichage / barres d'outils / puis cochez "Formulaires" pour afficher la barre d'outils correspondante.

Dans cette barre d'outils, sélectionnez le bouton. Le pointeur de la souris se transforme en croix et vous permet de dessiner la forme du bouton sur la page Excel.

Dès que vous avez défini la taille et la position du bouton, une boite de dialogue s'affiche pour vous demander à quelle macro vous voulez affecter la bouton.
Sélectionnez votre macro et cliquez sur OK.
(Pour modifier les paramètres clic droit sur le bouton puis "affecter une macro..." ou "Format de la forme").