web-dev-qa-db-fra.com

Comment appeler une macro à partir d'un bouton et passer des arguments

Je veux ajouter un bouton à ma feuille de calcul Excel qui devrait appeler une macro pouvant gérer un agument (une valeur entière). Malheureusement, lors de la création du bouton, je ne peux pas lier de macro contenant des arguments. De plus, il suffit de taper la macro et l'argument ne fonctionne pas.

Existe-t-il une solution simple pour passer un argument à une macro lorsqu'un bouton est enfoncé?

20
user3470049

Oui, vous pouvez affecter une macro à un bouton (ou à d'autres commandes/actions de menu Excel) et lui passer des arguments variables OR variables).

Dans la fenêtre "Attribuer une macro" (cliquez avec le bouton droit sur l'objet et sélectionnez "Attribuer une macro"):

  • Mettez le nom de la macro entre guillemets simples, par exemple pour passer 2 constantes: 'Button1_Click("A string!", 7)'
  • Sélectionnez "Ce classeur" pour le champ "Macros dans"
  • Si vous souhaitez passer une variable (comme la valeur d'une cellule), placez le paramètre dans Evaluate ()

Par exemple, pour transmettre la valeur de Sheet1!$A$1 à une fonction de bouton, vous auriez le texte suivant dans le champ 'Nom de la macro:':

Button1_Click(Evaluate("Sheet1!$A$1"))

Si vous n'incluez pas votre argument de variable avec une fonction "Évaluer", Excel renvoie l'erreur "La formule est trop complexe pour être affectée à un objet".

J'aurais inclus une image si cela avait été autorisé sur mon premier post.

36
QA Collective
Sub ert()
Call ert2(Cells(1,1).Value)
End Sub
7
user3819867

Appelé à partir d'un bouton régulier "formulaires" sur une feuille de calcul, vous pouvez faire quelque chose comme ceci:

Sub TestMe()
    Dim c, arr
    c = Application.Caller
    arr = Split(c, "_")
    If UBound(arr) > 0 Then MsgBox "Got " & arr(1)
End Sub

Où le bouton appelant est nommé (par exemple) "Button_3"

Ou (plus simple) faites un clic droit sur le bouton et entrez 'TestMe2 5' (Y compris les guillemets simples)

Sub TestMe2(i)
    MsgBox "Got " & i
End Sub

Voir aussi: Excel 2010 - Erreur: impossible d'exécuter la macro SelectCell à l'aide de .onAction

3
Tim Williams

Utilisez un bouton de commande de contrôle activeX et dans la méthode de clic de bouton, appelez le sous et passez l'argument:

Private Sub CommandButton_Click()

  Dim x as Integer
  x = 1
  Call SomeSub(x)

End Sub
3
314UnreadEmails

Pour appeler ce Sub à partir d'un bouton:

Public Sub TestButton(strMessage As String)
    MsgBox strMessage
End Sub

... sachez que le Sub ne sera pas répertorié dans les macros disponibles, car il a un paramètre. Tapez simplement l'appel entre guillemets simples: 'TestButton "Hello"'

2
AjV Jsy

Supposons que vous ayez un argument public sub take 1 comme ci-dessous (juste à des fins d'explication.)

Macro

Et vous insérez un bouton sur la feuille de calcul comme ci-dessous, et vous ne pouvez pas trouver le nom de la macro lorsque vous souhaitez affecter votre sous à ce bouton.

Button

Maintenant, vous pouvez saisir manuellement votre sous-nom + espace + argument entre guillemets simples, comme ci-dessous, cliquez sur OK.

Type macro name

Ensuite, vous voyez, le problème est résolu.

Result

2
AntiqueWhale

J'ai eu des problèmes avec ma version de Personal.xlsb! 'TestForXXXX ("Test Test")'. J'ai reçu une erreur en cliquant sur le bouton contenant la macro.

Cependant, j'ai pu le corriger en supprimant les "(" et ")". Ainsi, Personal.xlsb! 'TestForXXXX "Test Test"' a fonctionné (notez l'espace entre testForXXXX et "Test ...").

En fait, je n'avais pas besoin de Personal.xlsb! et a juste pu utiliser 'testForXXXX "Test Test"'.

1
Michael

J'aurais aimé commenter la réponse de QA Collective mais je n'ai pas encore assez de point de réputation. Les solutions précédentes ne fonctionnaient pas pour moi, car mes macros se trouvent dans des modules nommés dans mon projet VBA.

Avec Excel 2013, la façon de passer un paramètre à une macro à l'aide d'un bouton qui fonctionnait dans mon contexte est:

'<module name>.<macro name> <parameter>'

par exemple

'DataProcessor.disle "myText"'

ou

'DataProcessor.editWSProcess True'

(les booléens n'ont pas besoin de guillemets doubles lorsqu'ils sont passés en tant que paramètres) Veuillez noter que les guillemets simples entourent l'expression entière.

0
Pierre Massé

J'ai rencontré le même problème avec le assign button Qui n'était pas très utile jusqu'à ce que je réalise que tous les macros potentiels affichés n'étaient que ceux de mon Personal.xlsb Fichier qui prenait aucun argument. Ensuite, j'ai tapé Personal.xlsb!'macroNameWhichTakesArguments("arg1", ...)' et la feuille l'a ramassé.

C'EST À DIRE. Personal.xlsb!'testForXXXX("Test Test")'

Lorsque macro testForXXXX Prend une chaîne en entrée, la feuille fonctionne correctement.

Lorsque vous utilisez la route d'assignation de macro pour un button in Excel 2007 Au moins testForXXXX n'apparaîtra pas dans la liste des macros potentielles si elle prend des arguments.

Je soupçonne qu'Aaron C s'est aussi fait trébucher. Peut-être qu'il vaut mieux ne pas utiliser un fichier Personal.xlsb?

0
ffskitty