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 :

Comment créer un module standard en VBA ?


Sujet :

VBA Access

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    janvier 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : janvier 2006
    Messages : 106
    Points : 135
    Points
    135
    Par défaut Comment créer un module standard en VBA ?
    Bonjour,

    je cherche, à partir de VBA, à créer un nouveau module standard dans ma base de données.
    J'ai trouvé toutes les commandes pour modifier les lignes, les créer, les supprimer, mais je n'ai pas trouvé la commande de création du module...

    Application.Modules.Add --> n'existe pas
    Application.CreateModule --> n'existe pas

    Un petit coup de main serait le bienvenu car là, je sèche...

    Merci d'avance.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour
    Alt + F11 pour arriver dans la fenêtre Vba

    Menu Insertion
    Module

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    janvier 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : janvier 2006
    Messages : 106
    Points : 135
    Points
    135
    Par défaut
    Bonjour,

    merci de votre réponse, mais je parlais de créer le module via du code VBA, pas de le faire manuellement.

    Pour vous donner un exemple plus précis, voici un bout de code qui ajoute des lignes dans un module existant appelé "Moduletest". Ma question serait dans ce cas : quelles instructions dois-je ajouter pour créer ce "Moduletest" dans ce code ?

    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
     
    Private Sub test()
     
        Dim mdl As Module, NbLignes As Long
     
        Set mdl = Application.Modules("ModuleTest")
        NbLignes = mdl.CountOfLines
        mdl.InsertLines NbLignes + 1, ""
        mdl.InsertLines NbLignes + 2, "Private sub test_2()"
        mdl.InsertLines NbLignes + 3, ""
        mdl.InsertLines NbLignes + 4, "Msgbox ""Blabla"""
        mdl.InsertLines NbLignes + 5, ""
        mdl.InsertLines NbLignes + 6, "end sub"
     
    End Sub

  4. #4
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    juillet 2007
    Messages
    14 513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : juillet 2007
    Messages : 14 513
    Points : 33 968
    Points
    33 968
    Par défaut
    Salut,
    regarde du cote de
    et
    pour Excel

    et cote Access,
    tu peux utiliser l'objet VBE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    VBE.ActiveVBProject.VBComponents.Add vbext_ct_StdModule
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    janvier 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : janvier 2006
    Messages : 106
    Points : 135
    Points
    135
    Par défaut
    Je viens de tester la dernière ligne et ça fonctionne parfaitement à condition de changer la constante vbext_ct_StdModule (qui n'est pas reconnue) par le chiffre 1.
    Je regarderai plus en détail demain quand même mais ça a l'air de répondre à mon besoin.

    Merci beaucoup !

  6. #6
    Invité
    Invité(e)
    Par défaut
    Ach, désolé je n'avais pas compris le but de la manoeuvre..

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    janvier 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : janvier 2006
    Messages : 106
    Points : 135
    Points
    135
    Par défaut
    Citation Envoyé par GAYOT Voir le message
    Ach, désolé je n'avais pas compris le but de la manoeuvre..
    Ce n'est pas grave, je reconnais que je n'avais pas été non plus très explicite.

    Je remercie jpcheck qui m'a permis de bien avancer sur ce problème. Il me reste quelques soucis toutefois. Voici le bout de code que j'ai créé.

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    Private Sub test()
    
        Dim mdl As Module, NbLignes As Long, i As Long
        
        'création du module standard
        VBE.ActiveVBProject.VBComponents.Add 1
        
        'récupération du nom du module qui sera de la forme "ModuleX" avec X un n° incrémental
        'on boucle sur le n° jusqu'à provoquer une erreur
        i = 1
        On Error GoTo suite
        Do
            Set mdl = Application.Modules("Module" & i)
            i = i + 1
        Loop
    suite:
        'On a le numéro du module et donc son nom
        Set mdl = Application.Modules("Module" & (i - 1))
        'On renomme le module
        mdl.Name = "NouveauNom"
        'On ajoute les lignes à la suite du module
        NbLignes = mdl.CountOfLines
        mdl.InsertLines NbLignes + 1, ""
        mdl.InsertLines NbLignes + 2, "Private sub test_2()"
        mdl.InsertLines NbLignes + 3, ""
        mdl.InsertLines NbLignes + 4, "Msgbox ""Blabla"""
        mdl.InsertLines NbLignes + 5, ""
        mdl.InsertLines NbLignes + 6, "end sub"
        'il faudrait sauvegarder le module afin que Access ne provoque pas d'affichage où il demande de sauvegarder le module
        mdl.Save
        Set mdl = Nothing
        'on rafraichit la fenêtre de base de données pour afficher le module
        Application.RefreshDatabaseWindow
    
    End Sub
    Les problèmes rencontrés encore sont dans les lignes en rouge :

    1) Lorsque j'essaie de renommer mon module, Access me répond que la propriété n'est qu'en lecture seule. Ce qui est en contradiction avec l'aide en ligne d'Access qui dit explicitement que la propriété Name est en lecture/écriture. Que faire pour renommer le module ?

    2) Je n'ai trouvé aucune instruction pour sauvegarder le module créé. Ce qui déclenche sous Access les messages de sauvegarde dès qu'on ferme la fenêtre des modules. Je suppose que je pourrais passer par un SetWarnings=False pour contourner le problème, mais n'y a-t'il pas une commande simple de sauvegarde ?

    3) Je veux rafraîchir ma base de données pour faire apparaître le module créé. Or la commande RefreshDatabaseWindow ne fonctionne pas. Mais si je sors de la base de données en sauvegardant le module et que je la réouvre, je vois bien le module créé. Alors, c'est peut-être dû au fait que le module n'est pas sauvegardé que la commande ne fonctionne pas.

  8. #8
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    juillet 2007
    Messages
    14 513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : juillet 2007
    Messages : 14 513
    Points : 33 968
    Points
    33 968
    Par défaut
    salut,

    essaie avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    VBE.ActiveVBProject.VBComponents("AncienModule").Name = "NouveauModule"
    pour la sauvegarde voir si
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    VBE.ActiveVBProject.SaveAs
    te conviendrait
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    janvier 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : janvier 2006
    Messages : 106
    Points : 135
    Points
    135
    Par défaut
    Citation Envoyé par jpcheck Voir le message
    salut,

    essaie avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    VBE.ActiveVBProject.VBComponents("AncienModule").Name = "NouveauModule"
    Ca, marche nickel !

    pour la sauvegarde voir si
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    VBE.ActiveVBProject.SaveAs
    te conviendrait
    Par contre, ça, ça ne fonctionne pas car ce n'est valable que pour les projets indépendants et ça permet de sauvegarder le fichier externe. Et ça ne fonctionne pas sur les modules internes. Mais j'explore la piste, je suis sûr que je vais trouver la commande.

  10. #10
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    mai 2005
    Messages
    2 813
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mai 2005
    Messages : 2 813
    Points : 4 639
    Points
    4 639
    Par défaut
    Bonjour,
    Ca devrait marcher avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ..
       ' Save and close the module.
            DoCmd.Close acModule, myModuleName, acSaveYes
    "Always look at the bright side of life." Monty Python.

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    janvier 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : janvier 2006
    Messages : 106
    Points : 135
    Points
    135
    Par défaut
    Merci à toi !
    C'est la ligne qui me manquait !

    Donc voici mon code pour créer un module standard dans Access :

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    Private Sub CreerModuleStandard()
     
        Dim mdl As Module, NbLignes As Long, i As Long
     
        'création du module standard
        VBE.ActiveVBProject.VBComponents.Add 1
     
        'récupération du nom du module qui sera de la forme "ModuleX" avec X un n° incrémental
        'on boucle sur le n° jusqu'à provoquer une erreur
        i = 1
        On Error GoTo suite
        Do
            Set mdl = Application.Modules("Module" & i)
            i = i + 1
        Loop
    suite:
        'On a le numéro du module et donc son nom
        'On renomme le module
        VBE.ActiveVBProject.VBComponents("Module" & (i - 1)).Name = "MonModuleCréé"
        Set mdl = Application.Modules("MonModuleCréé")
        'On ajoute les lignes à la suite du module
        NbLignes = mdl.CountOfLines
        mdl.InsertLines NbLignes + 1, ""
        mdl.InsertLines NbLignes + 2, "Private sub test_2()"
        mdl.InsertLines NbLignes + 3, ""
        mdl.InsertLines NbLignes + 4, "Msgbox ""Blabla"""
        mdl.InsertLines NbLignes + 5, ""
        mdl.InsertLines NbLignes + 6, "end sub"
        'On sauvegarde le module afin que Access ne provoque pas d'affichage où il demande de sauvegarder le module
        Set mdl = Nothing
        DoCmd.SetWarnings False
        DoCmd.Close acModule, "MonModuleCréé", acSaveYes
        'on rafraichit la fenêtre de base de données pour afficher le module
        Application.RefreshDatabaseWindow
     
    End Sub
    Merci à tous de votre aide !

  12. #12
    Candidat au Club
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    février 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Industrie

    Informations forums :
    Inscription : février 2015
    Messages : 2
    Points : 3
    Points
    3
    Par défaut + simple pour récup nom
    Bonjour,

    Il y a plus simple (pour récupérer le nom), je pense,
    alors ici en avec les userform / mais fonctionne aussi en mettant un "(1)" au lieu du "(3)" pour les modules de macros

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     'Création du UserForm
    Set ufTemp = ThisWorkbook.VBProject.VBComponents.Add(3)        'vbext_ct_MSForm
    ufTemp.Name = "NomDeUserform"

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

Discussions similaires

  1. [Toutes versions] une macro pour créer un module standard
    Par patricktoulon dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 29/12/2009, 17h42
  2. Comment créer un module delphi
    Par zanoubya dans le forum Débuter
    Réponses: 7
    Dernier message: 19/05/2009, 15h16
  3. Comment créer un module de contact dynamique ?
    Par Arsofts dans le forum Langage
    Réponses: 4
    Dernier message: 12/06/2008, 10h27
  4. [Joomla!] Comment créer un module
    Par magiklife dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 6
    Dernier message: 17/03/2008, 09h35
  5. Comment créer un champ numéroAuto en VBA Access
    Par nononono76 dans le forum Access
    Réponses: 4
    Dernier message: 01/01/2007, 12h19

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