IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Access Discussion :

Appel dynamique de procédure en dehors du module courant ?


Sujet :

Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2004
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 13
    Par défaut Appel dynamique de procédure en dehors du module courant ?
    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...

    Nb: je suis dans la même base/application et j ai ouvert tous les modules

    merci d avance pour votre aide

  2. #2
    Membre éclairé
    Inscrit en
    Mars 2004
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 66
    Par défaut
    je n'ai pas l'habitude de ce genre de code mais à tout hasard ->

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    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

  3. #3
    Membre averti
    Inscrit en
    Novembre 2004
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 13
    Par défaut
    Merci mais, non ça ne fonctionne pas plus

    Pas beaucoup de challenger sur le défi...Serait-ce impossible ?

  4. #4
    Expert confirmé
    Avatar de cafeine
    Inscrit en
    Juin 2002
    Messages
    3 904
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 3 904
    Par défaut
    Essaie de passer par la fonction Eval()

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    retour = Eval(mdl(i).Name & ".fredo()")
    Il est à noter que cette utile fonction Eval() n'existe pas dans VB6.

  5. #5
    Membre averti
    Inscrit en
    Novembre 2004
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 13
    Par défaut
    Avec la fonction eval pour:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Eval (mdl.Name & "." & mdl.Name & "()")
    J'obtiens le msg suivant:

    Erreur 2482 - Impossible de trouver le nom 'fredo' entré dans l'expression


    Pour le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Eval (mdl.Name & "()")
    J'obtiens le msg:

    Erreur 2425 - L'expression entrée comporte un nom de fonction introuvable


    C'est mieux: il détecte qu'il s'agit d'une fonction
    Mais bon, ça ne fonctionne tjrs pas

    Nb:
    1)Ma fonction se trouve dans un module appelé 'fredo' et s'appelle 'fredo()' sans les quotes bien sûr.

    2) Dans le même ordre d'idée j'essaie également avec la fonction CallByName mais là je ne parviens pas à trouver l' "object" à mettre en premier paramètre. J'ai essayé avec le nom du module, le nom de l'application mais non, ça ne fonctionne pas. J'ai l'impression à lire les exemples de l'aide que ça ne s'applique qu'a des "objects" de "forms".

    Donc, un grand merci pour ton aide et encore plus si tu es prêt à poursuivre le challenge...

  6. #6
    Membre émérite
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Par défaut
    Perso je ne vois pas de solution, à part bien entendu nommer différement les fonctions de tes modules, ce qui est tout à fait possible pour un bon développeur.

  7. #7
    Membre averti
    Inscrit en
    Novembre 2004
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 13
    Par défaut
    J'ai bien une solution avec un select case mais elle oblige à revenir sur le code à chaque nouveau module, hors c'est ce que je voulais éviter:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Select case mdl.name
       case "fredo"
               fredo()
       case else
              msgbox = "module inconnu"
    end select
    En revanche, tu peux expliciter ta suggestion: c'est vrai que je suis loin d'être un expert du dév. ACCESS.
    Un module nommé "Modules" et comprenant la fonction "fredo" ?

    Merci pour ton aide

  8. #8
    Membre averti
    Inscrit en
    Novembre 2004
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 13
    Par défaut
    Euréka, en essayant de comprendre la remarque de FRED.G et grâce à des échanges complémentaires sur le newsgroup Access de Microsoft avec RV, ici:

    http://www.microsoft.com/france/comm...access&lang=fr

    j'ai finalement la solution.


    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é "M_fredo" qui
    contient ma procédure "fredo".

    Dans mon module principal j'ai codé ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
               DoCmd.OpenModule ("M_" & UnModule)       'la variable UnModule contient le nom de la procédure à appeler
               Set mdl = Modules("M_" & UnModule)
               Retour = Application.Run(UnModule)            'ajouter des arguments si nécessaire
    Dans mon test la variable "UnModule" contient la valeur "fredo".

    Dans le code du module secondaire appelé "M_fredo" en l'occurence, j'ai ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    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, en respectant une normalisation peu contraignante, avec ce code je peux faire de l'appel dynamique de procédure.
    Il me suffit de faire varier le contenu de la variable "UnModule" et de créer un module qui commence par "M_" puis le nom de la fonction.

    C'est exactement ce que je voulais, je n'ai donc pas atteint les limites d'ACCESS

    Merci pour votre aide et au plaisir d'un prochain échange ;-)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Appeler dynamiquement des procédures stockées
    Par riadhhwajdii dans le forum PL/SQL
    Réponses: 18
    Dernier message: 23/09/2010, 11h45
  2. [Pro*C] Appel dynamique à une procédure stockée
    Par wedgeantilles dans le forum Interfaces de programmation
    Réponses: 3
    Dernier message: 22/10/2008, 09h19
  3. Appel dynamique de procédure et fonction
    Par QAYS dans le forum Langage
    Réponses: 16
    Dernier message: 27/07/2007, 19h30
  4. Appeler dynamiquement une procédure stockée
    Par Mark531 dans le forum Access
    Réponses: 1
    Dernier message: 05/09/2006, 17h49
  5. appel d'un evenement en dehors d'un module
    Par pschmidtke dans le forum Access
    Réponses: 2
    Dernier message: 23/06/2006, 09h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo