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

VBA Access Discussion :

Lancer un sub en utilisant une valeur recuperee dans une table comme nom de sub [AC-2010]


Sujet :

VBA Access

  1. #1
    Membre actif
    Homme Profil pro
    Manager de Projet SAP
    Inscrit en
    Mars 2009
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Pologne

    Informations professionnelles :
    Activité : Manager de Projet SAP
    Secteur : Distribution

    Informations forums :
    Inscription : Mars 2009
    Messages : 210
    Points : 238
    Points
    238
    Par défaut Lancer un sub en utilisant une valeur recuperee dans une table comme nom de sub
    Bonjour.

    J'ai actuellement un programme sous Access avec, dans un formulaire, des boutons pour faire telle ou telle action.

    Le probleme c'est qu'il peut y avoir plus de 10 boutons a disposition. Chaque bouton a son etiquette permettant de savoir ce qu'il permet d'obtenir. Lorsqu'on veut lancer quelque chose de particulier, il faut faire le tour de tous les boutons disponibles. Chaque bouton lance une procedure differente (sub).

    Pour simplifier, je souhaite faire les choses suivantes :

    - une zone de choix contiendrait les libelles des differents boutons actuels
    - a un libelle correspondrait un nom court. Une table contient le lien entre le nom court et le libelle a afficher dans la zone de choix et est la source de cette zone.
    - Lorsque l'utilisateur a clique sur l'une des lignes, je souhaite lancer une procedure qui correspond au nom court recupere
    - Je rajoute donc le nom court dans une variable declaree precedemment avec dim. Exemple variable "nom_court".
    Je ne souhaite pas utiliser des If directement dans VBA.

    Pour lancer une procedure a partir d'une autre procedure, il suffit de donner le nom de la procedure qu'on veut lancer. Sauf erreur de ma part, on peut lancer aussi en rajoutant, devant le nom de la procedure a lancer, les mots "Call" ou "Run".

    Le probleme, c'est que VBA ne semble pas accepter de lancer une procedure avec une variable. Il lui faut directement le nom de la procedure a lancer.

    Exemple de code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    dim Tb as recordset
    dim Nom_court as string
     
    sub lancement
    set tb=currentdb.opendynaset("Table_noms_cours")
    nom_court= tb!nom_court
    tb.close
     
    run nom_court
    VBA bloque sur la ligne "run nom_court".

    Message affiche : "Expected procedure, not variable".

    Est-il possible de lancer une procedure a partir d'une variable dans VBA ? Si oui, comment ?

    Merci.

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 841
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 841
    Points : 7 975
    Points
    7 975
    Par défaut
    Bonsoir,

    Moi ce que je fais,

    Je crées une table T_Procedure avec comme champs NumProcedure et le nom_court de la procédure comme vous dites.

    NumProcedure Nom_Court
    1 NomCourt_Procedure1
    2 NomCourt_Procedure2
    3 NomCourt_Procedure3

    Dans le formulaire, créer une zone de liste déroulante indépendante à partir de cette table avec ces 2 champs, la première colonne cachée.
    Colonne liée : 1

    Sur l'évènement AprèsMiseAJour de la liste déroulante,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub ZoneDeListe_AfterUpDate()
    SELECT CASE ZonedeDeListe
         Case 1
              Call Procedure1 'Mettre le nom du module
         Case 2
              Call Procedure2
         Case 3
                 ......
         Case ELSE
     
    End SELECT
    End Sub
    Cordialement,

  3. #3
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 017
    Points : 24 553
    Points
    24 553
    Par défaut
    Bonjour,

    Pour exécuter une procédure (et qu'une procédure, ça ne fonctionne pas avec une fonction) voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Sub testtest()
    Dim toto As String
    toto = "nomcomplement"
    Application.Run toto
     
    End Sub
    Si vous avez un message d'erreur vérifier que le contenu de la variable soit un nom valide.

    Le Call ne permet pas de lancer des noms de procédures contenues dans une variable.

    Cordialement,

  4. #4
    Membre actif
    Homme Profil pro
    Manager de Projet SAP
    Inscrit en
    Mars 2009
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Pologne

    Informations professionnelles :
    Activité : Manager de Projet SAP
    Secteur : Distribution

    Informations forums :
    Inscription : Mars 2009
    Messages : 210
    Points : 238
    Points
    238
    Par défaut
    Bonsoir.

    Merci pour ces reponses.

    Ce qui est incroyable c'est que, dans Excel, ce type de chose fonctionne sans probleme. Exemple avec le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Dim Nomproc As String
     
    Sub lancement()
        Range("a1").Select
        Nomproc = ActiveCell
        Application.Run "" & Nomproc & ""
    End Sub
     
    Sub test()
        MsgBox "coucou"
    End Sub
    La cellule A1 de la feuille active contient la valeur "test".
    Lorsque je lance la procedure "lancement", le message "coucou" s'affiche.

    Par contre, le code ci-dessous ne fonctionne pas dans Access au niveau de la ligne Application.Run "Test" alors que test n'est pas une variable mais le nom de la procedure a lancer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Dim tb As Recordset
    Dim Nomprocedure As String
     
    Private Sub Commande0_Click()
        Set tb = CurrentDb.OpenRecordset("procedures_a_lancer", dbOpenDynaset)
        Nomprocedure = tb!Nom_procedure
        Application.Run "Test"
    End Sub
     
    Public Sub Test()
        MsgBox "coucou"
    End Sub
    Seul fonctionne la chose suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Application.Run Test
    Du coup, je ne peux pas jouer avec les doubles guillemets du type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    Application.Run "" & Nomprocedure & ""
    comme j'ai reussi a le faire dans Excel.

    Par contre, j'ai essaye a l'instant, dans Access, la chose suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
     
    Dim tb As Recordset
    Dim Nomprocedure As String
     
    Private Sub Commande0_Click()
        Set tb = CurrentDb.OpenRecordset("procedures_a_lancer", dbOpenDynaset)
        'Nomprocedure = tb!Nom_procedure
        Nomprocedure = "Test"
        Application.Run Nomprocedure
    End Sub
     
    Public Sub Test()
        MsgBox "coucou"
    End Sub
    Que ce soit avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Nomprocedure = tb!Nom_procedure
    ou avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Nomprocedure = "Test"
    Le programme m'affiche le message suivant : Microsoft Access ne peut pas trouver la procedure "Test".

    J'ai enfin remplace la valeur contenue dans la variable Nomprocedure par coucou (au lieu de test) au cas ou le mot test soit considere comme un mot reserve. C'est le meme resultat.

    Cdlt

  5. #5
    Membre éprouvé

    Homme Profil pro
    Inscrit en
    Octobre 2009
    Messages
    789
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 789
    Points : 1 266
    Points
    1 266
    Par défaut
    Bonsoir,

    Je viens de tester le code suivant et cela focntionne très bien.
    J'ai créé une table nommée "Table1" qui contient un nom de champ quelconque.
    Dans ce champ, j'ai ajouté les valeurs "Test10" et "Test11" (sans les guillemets).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    Private Sub TestOrigine()
    Dim db As DAO.Database
    Dim rst As DAO.Recordset
    Dim NomProcess As String
        Set db = CurrentDb
        Set rst = db.OpenRecordset("Table1", dbOpenDynaset)
        rst.MoveFirst
        Do Until rst.EOF
            NomProcess = rst.Fields(0)
            Application.Run NomProcess
            'Va sur l'enregistrement suivant
            rst.MoveNext
        Loop
     
    'Ferme le recorset
    Set rst = Nothing
    End Sub
     
    Public Sub Test10()
        MsgBox "coucou 10"
    End Sub
     
    Public Sub Test11()
        MsgBox "coucou 11"
    End Sub

  6. #6
    Membre actif
    Homme Profil pro
    Manager de Projet SAP
    Inscrit en
    Mars 2009
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Pologne

    Informations professionnelles :
    Activité : Manager de Projet SAP
    Secteur : Distribution

    Informations forums :
    Inscription : Mars 2009
    Messages : 210
    Points : 238
    Points
    238
    Par défaut
    Bonjour.

    Merci pour toutes vos reponses.

    Ca fonctionne.

    Mais ca ne semble fonctionner que si la procedure se trouve dans un module et non dans le formulaire directement.

    Merci a tous pour votre aide.

    Cdlt

  7. #7
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 017
    Points : 24 553
    Points
    24 553
    Par défaut
    Il n'y a rien d'incroyable la dedans.
    Le module d'un formulaire ou d'un état est un module de Classe. Il bénéficie donc des mêmes règles qu'une classe.

    instanciation, accès au procédure/fonction publique...

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 05/04/2011, 08h06
  2. Réponses: 82
    Dernier message: 05/02/2011, 14h34
  3. Utiliser une valeur insérée dans une ComboBox
    Par Conico113 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 04/11/2008, 10h06
  4. Réponses: 3
    Dernier message: 26/03/2008, 15h23
  5. Réponses: 5
    Dernier message: 05/10/2006, 10h18

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