XL 2016 Accès en VBA à la pile d'appel

elgringo123456

XLDnaute Occasionnel
Supporter XLD
Bonjour à tout le monde,

Je vous sollicite sur une vielle question et après de multiples recherches infructueuses sur internet (forum Excel-Downloads.com inclus), je constate qu'il n'est pas possible avec des codes VBA d'accéder à pile d'appel.
Est-ce toujours le cas ?
Faut-il prévoir de créer une variable globale et de la charger en mode pile d'appel ?

Cette fois-ci je ne met pas de pièce jointe (car je pense qu'il n'y en a pas besoin).
Merci de vos réponse
Bien cordialement
El gringo 123 456
 

Dranreb

XLDnaute Barbatruc
Bonsoir.
Vous pouvez toujours à tout hasard exposer les raisons pour lesquelles vous avez l'impression que vous auriez besoin de ça.
Si vous parlez de l'adresse de départ de pile pour les argument et variables locales utilisées par une Sub ou Function, VarPtr d'une variable locale déclarée au début vous renverra une adresse ayant un décalage fixe par rapport à elle.
Si ce sont des donnée que vous voulez stocker en LIFO ou FIFO, une Collection le permet.
Pour des procédures récursives de profondeur imprévisible d'appels récursifs, le plus simple c'est de transmettre en argument ByVal le niveau de profondeur, commencer par l'incrémenter dans la procédure et renoncer à un nouvel appel récursif s'il atteint un seuil déraisonnable.
 

elgringo123456

XLDnaute Occasionnel
Supporter XLD
Bonsoir Danreb,
1 000 merci d'avoir répondu.

J'aurai besoin d'utiliser la pile d'appel car je souhaite savoir quelle est la fonction ou procédure "mère" ayant été appelée.
Exemple : j'utilise une forme et je la lie à une procédure.
Forme 1 <=> Proc 1
Forme 2 <=> Proc 2

Les Proc 1 et Proc 2 font appel à des fonctions communes.
Dans ces fonctions communes, le comportement doit être spécifié en fonction de la procédure "mère" à savoir Proc 1 ou Proc 2.

En accédant à la pile d'appel je finis par savoir si la procédure principale est la 1 ou la 2.

Je voulais éviter d'utiliser des variables globales.
Cordialement.
ElGringo123456
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Je termine quelques Sub et Function de service par un argument Optional ByVal Pour As String = "LeNomDeCetteProcédure". Il y est utilisé comme 3ème argument des MsgBox susceptibles d'être émis. Ainsi je n'ai qu'à terminer l'appel par Pour:="LeNomDelAppelante" si je veux ce nom dans la barre de titre des messages.
Il n'y a pas que les MsgBox qui se terminent par ', Pour' d'ailleurs, mais aussi des appels de procédures en admettant un à la fin, ainsi le Pour transmis y est transmis à son tour.
Mais dans votre cas je soupçonne qu'il doit être possible de faire en sorte que l'opération dépendant de la procédure appelante soit effectuée par celle ci, fut-ce via une seule procédure spécialisée ayant besoin de ce nom. Transmettez lui aussi d’abord le Shape à traiter comme argument ByVal Shp As Shape.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Cet exemple crée un carré positionné aléatoirement qui lorsqu'on clique dessus crée un cercle qui, lui crée un carré, etc.
VB:
Sub CréationCarré()
   Dim Shp As Shape
   Set Shp = ActiveSheet.Shapes.AddShape(msoShapeRectangle, 500 * Rnd, 400 * Rnd, 32, 32)
   Action(Shp) = "CréationCercle"
   End Sub
Sub CréationCercle()
   Dim Shp As Shape
   Set Shp = ActiveSheet.Shapes.AddShape(msoShapeOval, 500 * Rnd, 400 * Rnd, 35, 35)
   Action(Shp) = "CréationCarré"
   End Sub
Property Let Action(ByVal Shp As Shape, ByVal NomProc As String)
   Shp.OnAction = NomProc
   End Property
 

elgringo123456

XLDnaute Occasionnel
Supporter XLD
Bonjour.
Je termine quelques Sub et Function de service par un argument Optional ByVal Pour As String = "LeNomDeCetteProcédure". Il y est utilisé comme 3ème argument des MsgBox susceptibles d'être émis. Ainsi je n'ai qu'à terminer l'appel par Pour:="LeNomDelAppelante" si je veux ce nom dans la barre de titre des messages.
Il n'y a pas que les MsgBox qui se terminent par ', Pour' d'ailleurs, mais aussi des appels de procédures en admettant un à la fin, ainsi le Pour transmis y est transmis à son tour.
Mais dans votre cas je soupçonne qu'il doit être possible de faire en sorte que l'opération dépendant de la procédure appelante soit effectuée par celle ci, fut-ce via une seule procédure spécialisée ayant besoin de ce nom. Transmettez lui aussi d’abord le Shape à traiter comme argument ByVal Shp As Shape.
Bonjour Danreb,

Je n'ai qu'un mot à dire
C'est top
Vous avez eu raison de m'indiquer la raison pour laquelle je voulais manipuler les piles d'appels
C'est ce que j'appellerai de la the solution fonctionnelle.
Merci d'avoir partagé ces astuces
 

elgringo123456

XLDnaute Occasionnel
Supporter XLD
Bonjour ElGingo
Salut @Dranreb ;)

ElGringo si tu veux jouer avec les piles 🥴
Voici un bel exemple (fait sur Access, mais transposable je pense) http://etutorials.org/Microsoft+Pro...BA/Recipe+7.2+Create+a+Global+Procedure+Stack

Perso, je n'ai pas bien compris l'intérêt alors qu'on peut appeler une fonction commune en lui indiquant qui l'appelle en paramètre 🤔
Bonjour Bruno45,
Je te remercie de ces informations.
Je vais creuser le sujet aussi de ce côté grace à toi.
Cordialement.
El Gringo 123456