[VBA] Modification .OnAction d'un bouton => erreur d'executio

Bonjour,

Je suis confronté au soucis suivant au sein d'une macro :

Contexte :

Dans workbook W1, j'ai une feuille F1 qui contient un bouton (formulaire) B1 affectée à la création du bouton à une macro M1.

W1.xlsm se trouve dans le dossier : D:\Test

Plus tard, je fais une copie de W1 (via ThisWorkbook.SaveCopyAs) sous un nouveau nom, disons W2.xlsm, et dans un autre répertoire : C:\Test

Ensuite, j'ouvre W2 à nouveau W2. Le classeur s'ouvre, pas de message pour activer les macros, elles sont activées par défaut par programmation (j'ai vérifié les niveaux de sécurité tout de même et c'est bon)

Dans la feuille F1 de W2, je souhaite modifier les caractéristiques du bouton B1, en lui donnant un nouveau nom et en lui affectant une autre macro M2.

Comme il y a eu un SaveAs pour W2, j'ai donc toutes les macros, notamment M1 et M2 dans ce classeur également.

Problème :

Lors de l'affectation de M2 au bouton B1 du W2, lorsque la macro passe sur cette ligne, Excel génère l'erreur suivante :

Erreur 1004 : Impossible d'exécuter la macro 'W1.xlsm!M2'. Il est possible qu'elle ne soit pas disponible dans ce classeur ou que toutes les macros soient désactivées.

Voici le code utilisé pour ce changement d'affectation :

With Sheets(1).Shapes("Bouton 1")
    'Modifier l'appel de la macro associé à "Bouton 1"
    'btnEnrEval() au lieu de btnSvgEval
    .OnAction = wbNewName & "!" & "btnEnrEval" 'wbNewName = Nouveau nom du workboook, W2 pour l'exemple
End With

J'ai essayé par exemple sans préfixer, me disant qu'il va par défaut associé le workbook actif et son chemin d'accès :

With Sheets(1).Shapes("Bouton 1")
    .OnAction = "btnEnrEval" 'Ne génère pas l'erreur mais affecté à W1 au de W2
End With

Même combat en préfixant par le dossier physique le nom du classeur.

Le problème est que la macro M2 est associée au chemin d'accès et au workbook initial (W1). (je vérifie en regardant dan Excel, l'option Affecter une macro au bouton B1 de W2)

Cela ne convient pas dans mon cas d'usage, car W1 pourrait être déplacé, supprimé et donc générer des problèmes de liaisons à l'ouverture de W2, qui lui a vocation à être autonome.

L'erreur n'est pas générée quand la macro reste associé au W1.

Je peux contourner le problème en créant par avance un autre bouton déjà affectée à la bonne macro et en supprimant l'ancien, ou en ayant qu'une seule fonction qui se comporte différemment en fonction d'un paramètre.

Mais je ne comprends pas la logique d'Excel sur ce coup-là, et ça me perturbe Quelque chose doit m'échapper...

Si quelqu'un peut m'éclairer en la matière, je serai assez preneur

Merci par avance !

Bonjour,

il vaudrait mieux mettre la macro M1 dans un fichier .xlsb (comme le classeur de macro perso)

associer vos bouton à la macro de ce fichier étant données que celui-ci s'ouvre automatiquement à l'ouverture d'excel.

autre solution

mettre la macro M1 dans un fichier .xlam

associer vos bouton à la macro de ce fichier et forcer l'ouverture de ce fichier (.xlam) à l'ouverture de vos fichiers.

cette solution est plus compliquer!

Bonjour,

Ensuite, j'ouvre W2 à nouveau W2. Le classeur s'ouvre, pas de message pour activer les macros, elles sont activées par défaut par programmation (j'ai vérifié les niveaux de sécurité tout de même et c'est bon)

ça, c'est impossible, Excel ne permet pas de modifier le niveau de sécurité par programmation !

Il n'y a pas de raison que ça ne marche pas et ça, qu'il y est un seul ou les deux classeurs ouverts. Le compilateur sait exactement à quelle macro OnAction fait référence.

Pour le test, tu colles le code ci-dessous dans le module standard de chaque classeur donc, tu auras le code identique dans chaque classeur. Dans la Sub "Test()" et pour un classeur tout d'abords, tu changes l'attribution de la macro à OnAction (inverses l'apostrophe). Au clic sur le bouton tu auras la sub "SUB_Originale()" qui sera déclenchée, ceci fait, tu changes à nouveau de sens l'apostrophe et tu exécute à nouveau la sub puis clic sur le bouton et là, ça sera la sub "Seconde_SUB()" qui sera déclenchée, faire de même pour le second classeur et normalement, ça devrait fonctionner :

Sub SUB_Originale()

    MsgBox "Tu es sur le classeur '" & ThisWorkbook.Name & "' !'"

End Sub

Sub Seconde_SUB()

    MsgBox "Tu as changé de macro mais tu es toujours sur le classeur '" & ThisWorkbook.Name & "' !'"

End Sub

Sub Test()

    Dim S As Shape

    Set S = ActiveSheet.Shapes(1)
    S.Name = "Mon beau bouton"
    S.OnAction = "Seconde_SUB"
    'S.OnAction = "SUB_Originale"

End Sub
Rechercher des sujets similaires à "vba modification onaction bouton erreur executio"