Je commence à croire que l'on atteint les limites de l'outil. Pourtant ce test fonctionne donc sur le principe votre code devrait
fonctionner
Sub test2() Dim a As String a = "test3" Application.Run (a) End Sub
Sub test3() Debug.Print "test3" End Sub
D'autre part si vous utilisez Access2000 ou + la fonction callbyname permet un appel dynamique de procédure. Peut-être peut elle vous aider.
Enfin, par curiosité, juste une petite question. Pourquoi parcourir tous les modules pour tester "If mdl(i).Name = MonModule"
A+
Rv
"fredooweb" a écrit dans le message de news:
Salut,
Dans une application ACCESS locale, je souhaiterais appeler dynamiquement une fonction située dans un autre module au sein de l'application courante.
Après avoir ouvert les modules, Lorsque j''exécute le code en "dur" suivant:
Set mdl = Application.Modules For i = 0 To mdl.Count - 1 If mdl(i).Name = "fredo" Then Retour = fredo.fredo() Exit For End If Next
cela fonctionne bien.
En revanche lorsque je veux parmétrer ce code, ça ne fonctionne plus:
Set mdl = Application.Modules For i = 0 To mdl.Count - 1 If mdl(i).Name = MonModule Then Retour = Run(MonModule) Exit For End If Next
J'obtiens alors le message suivant:
Erreur d'exécution '2517' Microsoft Office access ne peut pas trouver la procédure 'fredo()'
Si vous avez une idée...
Salut,
Je souhaiterais appeler dynamiquement une procédure ou un module à partir d'un autre module. Lorsque j'écris le code en "dur" suivant:
Set mdl = Application.Modules For i = 0 To mdl.Count - 1 If mdl(i).Name = "fredo" Then Retour = fredo.fredo() Exit For End If Next
cela fonctionne bien.
En revanche lorsque je veux parmétrer ce code, ça ne fonctionne plus:
Set mdl = Application.Modules For i = 0 To mdl.Count - 1 If mdl(i).Name = MonModule Then Retour = Run(MonModule) Exit For End If Next
J'obtiens alors le message suivant:
Erreur d'exécution '2517' Microsoft Office access ne peut pas trouver la procedure fredo
Si vous avez une idée...
J'ai fait plusieures tentatives en concatenant des "string" en paramétre de
Run (ex. run(MonModule & '.' Monmodule & "()), mais toujours sans succés.
Je commence à croire que l'on atteint les limites de l'outil.
En tout cas je vous remercie d avance pour votre aide.
fredooweb
Effectivement le code suggéré fonctionne bien... lorsque l'on est dans le même module. Dans mon cas je souhaite que la procédure appelée soit dans un autre module et c'est là où j'ai un problème.
Pour la boucle de recherche, c'est un moyen pour gérer une erreur lorsque je ne trouve le module (code à compléter). C'est pas très élégant, mais je ne connais pas bien access.
Peut-être est-ce aussi la raison pour laquelle je ne parviens pas non plus à utiliser la fonction CallByName: elle demande en premier argument un 'object' sur lequel doit s'appliquer la procédure et je ne parviens pas à trouver l' "object" en question J'ai essayé l'application courante, le module mais rien n'y fait. Dans les exemples fournis dans l'aide, il s'agit d'un object issu d'un formulaire. Pour ma part je ne souhaite pas appliquer la procédure à un formulaire, elle doit simplement traiter des données issues d'une table.
En tout cas, merci pour votre aide et si vous pouvez encore m'aider, je suis preneur ;-)
Effectivement le code suggéré fonctionne bien... lorsque l'on est
dans le même module.
Dans mon cas je souhaite que la procédure appelée soit dans un autre
module et c'est là où j'ai un problème.
Pour la boucle de recherche, c'est un moyen pour gérer une erreur
lorsque je ne trouve le module (code à compléter).
C'est pas très élégant, mais je ne connais pas bien access.
Peut-être est-ce aussi la raison pour laquelle je ne parviens pas non
plus à utiliser la fonction CallByName: elle demande en premier
argument un 'object' sur lequel doit s'appliquer la procédure et je ne
parviens pas à trouver l' "object" en question J'ai essayé
l'application courante, le module mais rien n'y fait.
Dans les exemples fournis dans l'aide, il s'agit d'un object issu d'un
formulaire. Pour ma part je ne souhaite pas appliquer la procédure à
un formulaire, elle doit simplement traiter des données issues d'une
table.
En tout cas, merci pour votre aide et si vous pouvez encore m'aider, je
suis preneur ;-)
Effectivement le code suggéré fonctionne bien... lorsque l'on est dans le même module. Dans mon cas je souhaite que la procédure appelée soit dans un autre module et c'est là où j'ai un problème.
Pour la boucle de recherche, c'est un moyen pour gérer une erreur lorsque je ne trouve le module (code à compléter). C'est pas très élégant, mais je ne connais pas bien access.
Peut-être est-ce aussi la raison pour laquelle je ne parviens pas non plus à utiliser la fonction CallByName: elle demande en premier argument un 'object' sur lequel doit s'appliquer la procédure et je ne parviens pas à trouver l' "object" en question J'ai essayé l'application courante, le module mais rien n'y fait. Dans les exemples fournis dans l'aide, il s'agit d'un object issu d'un formulaire. Pour ma part je ne souhaite pas appliquer la procédure à un formulaire, elle doit simplement traiter des données issues d'une table.
En tout cas, merci pour votre aide et si vous pouvez encore m'aider, je suis preneur ;-)
Rv
Salut,
Pourtant si je fais le test avec la procédure à appeler située dans un autre module cela fonctionne encore avec application.Run. La procédure appelée a t'elle une portée déclarée? Pour CallByName, dans un module de classe ça marche, mais en effet je ne vois pas comment l'utiliser avec une proc. située dans un module standard.
A+
Rv
a écrit dans le message de news: Effectivement le code suggéré fonctionne bien... lorsque l'on est dans le même module. Dans mon cas je souhaite que la procédure appelée soit dans un autre module et c'est là où j'ai un problème.
Pour la boucle de recherche, c'est un moyen pour gérer une erreur lorsque je ne trouve le module (code à compléter). C'est pas très élégant, mais je ne connais pas bien access.
Peut-être est-ce aussi la raison pour laquelle je ne parviens pas non plus à utiliser la fonction CallByName: elle demande en premier argument un 'object' sur lequel doit s'appliquer la procédure et je ne parviens pas à trouver l' "object" en question J'ai essayé l'application courante, le module mais rien n'y fait. Dans les exemples fournis dans l'aide, il s'agit d'un object issu d'un formulaire. Pour ma part je ne souhaite pas appliquer la procédure à un formulaire, elle doit simplement traiter des données issues d'une table.
En tout cas, merci pour votre aide et si vous pouvez encore m'aider, je suis preneur ;-)
Salut,
Pourtant si je fais le test avec la procédure à appeler située dans un
autre module cela fonctionne encore avec application.Run. La procédure
appelée a t'elle une portée déclarée?
Pour CallByName, dans un module de classe ça marche, mais en effet je ne
vois pas comment l'utiliser avec une proc. située dans un module standard.
A+
Rv
<fredooweb@free.fr> a écrit dans le message de
news:1128113408.497370.28910@g14g2000cwa.googlegroups.com...
Effectivement le code suggéré fonctionne bien... lorsque l'on est
dans le même module.
Dans mon cas je souhaite que la procédure appelée soit dans un autre
module et c'est là où j'ai un problème.
Pour la boucle de recherche, c'est un moyen pour gérer une erreur
lorsque je ne trouve le module (code à compléter).
C'est pas très élégant, mais je ne connais pas bien access.
Peut-être est-ce aussi la raison pour laquelle je ne parviens pas non
plus à utiliser la fonction CallByName: elle demande en premier
argument un 'object' sur lequel doit s'appliquer la procédure et je ne
parviens pas à trouver l' "object" en question J'ai essayé
l'application courante, le module mais rien n'y fait.
Dans les exemples fournis dans l'aide, il s'agit d'un object issu d'un
formulaire. Pour ma part je ne souhaite pas appliquer la procédure à
un formulaire, elle doit simplement traiter des données issues d'une
table.
En tout cas, merci pour votre aide et si vous pouvez encore m'aider, je
suis preneur ;-)
Pourtant si je fais le test avec la procédure à appeler située dans un autre module cela fonctionne encore avec application.Run. La procédure appelée a t'elle une portée déclarée? Pour CallByName, dans un module de classe ça marche, mais en effet je ne vois pas comment l'utiliser avec une proc. située dans un module standard.
A+
Rv
a écrit dans le message de news: Effectivement le code suggéré fonctionne bien... lorsque l'on est dans le même module. Dans mon cas je souhaite que la procédure appelée soit dans un autre module et c'est là où j'ai un problème.
Pour la boucle de recherche, c'est un moyen pour gérer une erreur lorsque je ne trouve le module (code à compléter). C'est pas très élégant, mais je ne connais pas bien access.
Peut-être est-ce aussi la raison pour laquelle je ne parviens pas non plus à utiliser la fonction CallByName: elle demande en premier argument un 'object' sur lequel doit s'appliquer la procédure et je ne parviens pas à trouver l' "object" en question J'ai essayé l'application courante, le module mais rien n'y fait. Dans les exemples fournis dans l'aide, il s'agit d'un object issu d'un formulaire. Pour ma part je ne souhaite pas appliquer la procédure à un formulaire, elle doit simplement traiter des données issues d'une table.
En tout cas, merci pour votre aide et si vous pouvez encore m'aider, je suis preneur ;-)
fredooweb
Euréka, vos remarques m'ont mis sur la bonne piste !!
En effet, j'ai regardé un peu plus loin au sujet des portées bien que ma procédure soit déclarée "Public".
J'ai lu ceci dans l'aide: "Modules et procédures portant le même nom Bien que cela ne soit pas recommandé, une procédure peut porter le même nom qu'un module...."
J'ai donc renommé mon module en lui donnant un nom différent de la procédure et là c'est magique, tout fonctionne !!
Au final j'ai un module principal et un second appelé "MesModules" qui contient ma procédure "fredo".
Dans mon module principal j'ai codé ceci:
DoCmd.OpenModule ("MesModules") Set mdl = Modules("MesModules") Retour = Application.Run(UnModule)
La variable contient le nom de la procédure à appeler soit sur mon test "fredo"
Dans le code du module secondaire appelé "MesModules", j'ai ceci:
Public Function fredo() As Variant fredo = "Appel Ok" End Function
Et ainsi, dans la variable "Retour" de mon module principal je récupère la valeur retournée par ma fonction soit "Appel Ok". J'ai même essayé en passant des arguments et ça fonctionne aussi. Tout réside donc dans le fait de nommer la procédure avec un nom différent du module dans laquelle est écrite.
Conclusion: l'appel dynamique de procédure fonctionne, magnifique !!
Merci pour votre aide et au plaisir d'un prochain échange ;-)
Euréka, vos remarques m'ont mis sur la bonne piste !!
En effet, j'ai regardé un peu plus loin au sujet des portées bien que ma
procédure soit déclarée "Public".
J'ai lu ceci dans l'aide:
"Modules et procédures portant le même nom
Bien que cela ne soit pas recommandé, une procédure peut porter le même nom
qu'un module...."
J'ai donc renommé mon module en lui donnant un nom différent de la procédure
et là c'est magique, tout fonctionne !!
Au final j'ai un module principal et un second appelé "MesModules" qui
contient ma procédure "fredo".
Dans mon module principal j'ai codé ceci:
DoCmd.OpenModule ("MesModules")
Set mdl = Modules("MesModules")
Retour = Application.Run(UnModule)
La variable contient le nom de la procédure à appeler soit sur mon test
"fredo"
Dans le code du module secondaire appelé "MesModules", j'ai ceci:
Public Function fredo() As Variant
fredo = "Appel Ok"
End Function
Et ainsi, dans la variable "Retour" de mon module principal je récupère la
valeur retournée par ma fonction soit "Appel Ok". J'ai même essayé en passant
des arguments et ça fonctionne aussi. Tout réside donc dans le fait de nommer
la procédure avec un nom différent du module dans laquelle est écrite.
Conclusion: l'appel dynamique de procédure fonctionne, magnifique !!
Merci pour votre aide et au plaisir d'un prochain échange ;-)
Euréka, vos remarques m'ont mis sur la bonne piste !!
En effet, j'ai regardé un peu plus loin au sujet des portées bien que ma procédure soit déclarée "Public".
J'ai lu ceci dans l'aide: "Modules et procédures portant le même nom Bien que cela ne soit pas recommandé, une procédure peut porter le même nom qu'un module...."
J'ai donc renommé mon module en lui donnant un nom différent de la procédure et là c'est magique, tout fonctionne !!
Au final j'ai un module principal et un second appelé "MesModules" qui contient ma procédure "fredo".
Dans mon module principal j'ai codé ceci:
DoCmd.OpenModule ("MesModules") Set mdl = Modules("MesModules") Retour = Application.Run(UnModule)
La variable contient le nom de la procédure à appeler soit sur mon test "fredo"
Dans le code du module secondaire appelé "MesModules", j'ai ceci:
Public Function fredo() As Variant fredo = "Appel Ok" End Function
Et ainsi, dans la variable "Retour" de mon module principal je récupère la valeur retournée par ma fonction soit "Appel Ok". J'ai même essayé en passant des arguments et ça fonctionne aussi. Tout réside donc dans le fait de nommer la procédure avec un nom différent du module dans laquelle est écrite.
Conclusion: l'appel dynamique de procédure fonctionne, magnifique !!
Merci pour votre aide et au plaisir d'un prochain échange ;-)