Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2019 Peut-on lancer une macro (une Sub) à partir dans une cellule comme pour une fonction

p'tit vieux

XLDnaute Occasionnel
Bonjour à tous
Comme l'indique le titre (enfin je crois) je désire savoir si je peux écrire l'appel à une macro directement dans une cellule comme on le fait avec une fonction.
Est ce possible sans passer par un bouton ou autre mais en saisissant, par exemple, le nom de la Sub()?
 
Solution
Mais dans une autre discussion, vous parliez de modifier des cellules n'ayant rien à voir avec la cellule portant la formule, laquelle invoque une Function d'un classeur de macros.
Ça peut se réaliser comme ça dans un module standard de celui ci :
VB:
Option Explicit
Private Consignes As New Collection
Public Function Addition(ByVal Nb1 As Integer, ByVal Nb2 As Integer) As Double
   Addition = Nb1 + Nb2
   With Application.Caller.Worksheet
      EnDifféré(.Range("B2")) = Nb1
      EnDifféré(.Range("C2")) = Nb2
      End With
   End Function
Private Property Let EnDifféré(ByVal Rng As Range, ByVal V)
   Consignes.Add Array(Rng, V)
   End Property
Public Sub ExécuterConsignes()
   Dim TCsgn()
   Do While Consignes.Count >= 1
      TCsgn =...

Dranreb

XLDnaute Barbatruc
À moins d'une réinitialisation intempestive du projet VBA je ne vois pas pourquoi la collection Consigne aurait perdu des valeurs tant que la ExecuterConsigne n'est pas invoquée.
Quant à la variable AddressCellelle n'est pas de moi et je ne lui voit aucune utilité.
Il va de soit que la Workbook_SheetCalculate ne doit pas être dans le classeur de macros mais dans le classeur utilisateur. Dans son module ThisWorkbook pour être précis. Lui seul sait que des évaluations de formules ont été effectuées chez lui. Elle doit néanmoins invoquer la ExecuterConsignes du classeur de macros, car lui seul détient la collection Consignes.
 
Dernière édition:

p'tit vieux

XLDnaute Occasionnel
Merci,
Quant à la variable AddressCellelle n'est pas de moi et je ne lui voit aucune utilité.

En effet, la variable AddressCellelle est de moi elle est utilisé lorsque je déplace ton code dans un Add-In ((fichier externe donc) car, comme dis plus haut j'ai remarqué que l'adresse de cellule qui déclenche la fonction est perdue (ActiveCell.Adress est la cellule de droite celle suite à la validation). Donc je me suis servi de cette variable pour garder la cellule de la fonction. Le but est de pouvoir faire le test:
VB:
If InStr(1, Range("A1").Formula, "=Addition(") > 0 Then
Cela juste pour qu'elle ne soit exécutée que si nécessaire.
Il va de soit que la Workbook_SheetCalculate ne doit pas être dans le classeur de macros mais dans le classeur
Tout à fait d'accord.
Dans le cadre de mon développement c'est ce qui me gène.
Sinon votre solution fonctionne très bien si la F(Addition) est dans le même projet.

Une de vos lignes de code a attiré mon attention "Application.Caller.WorkSheet".
Je cherche et essaie de comprendre ce que cela peut apporter et comment ça marche.
Pour l'instant ce que j'ai trouvé est très très très succin. Même pas trouvé une arborescence de l'objet Application.Caller. Si vous aviez un lien vers plus d'explication je suis preneur. Merci

Je continue de fouiner et je reviens vers vous
Encore merci et à très vite
(… aprés achat d'aspirine. … c'est dur de s'y remettre après prés 20 ans d'arrêt )
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
La cellule qui invoque la fonction n'est pas perdue même si elle est dans un autre projet, qu'est ce que vous racontez. Elle est connue dans la Function comme Application.Caller.
Et la propriété Worksheet d'un objet Range représente la feuille contenant la plage que le Range représente.
 

p'tit vieux

XLDnaute Occasionnel
Encore raison LOL
Mais comme dit dans mon précédent post "encore eut il fallu que je le susse" la Function Application.Caller )
Donc, après avoir cherché, j'ai trouvé (entre autre): Function Application.Caller.Adress
Intéressante d'ailleurs.
Désolé si pour vous j'ouvre des "portes ouvertes" mais techniquement je ne suis plus à la page.
D'ailleurs c'est assez frustrant de s'apercevoir que l'on est largué.
Merci.

Cdlt
 

Dranreb

XLDnaute Barbatruc
Le nom qu'un objet porte dans une collecition, ou son adresse si c'est un Range, n'est jamais aussi intéressant que l'objet lui même. Sont-ce des adresses de cellules que je stocke dans ma collection Consignes ? Non, ce sont des objets Range qui les représentent directement !
 
Dernière édition:

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…