OVH Cloud OVH Cloud

Appel dynamique d'une procédure sous access

4 réponses
Avatar
fredooweb
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.

4 réponses

Avatar
Rv
Salut,

Plusieurs choses en réponse :

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.


Avatar
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 ;-)
Avatar
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 ;-)
Avatar
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 ;-)