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 :

Générer du code VBA à la volée contenu dans une table [AC-2013]


Sujet :

VBA Access

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 113
    Points : 124
    Points
    124
    Par défaut Générer du code VBA à la volée contenu dans une table
    Bonjour à tous,

    Mon objectif (mais je ne sais pas si c'est possible) :

    - Je voudrais stocker du code VBA dans une table T_VBA contenant 2 colonnes (IDVBA, CODEVBA)
    - Dans un temps 2, en cas de besoin, je voudrais récupérer un code via un fonction du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Function GetVBA(i as long) as string
     
    GetVBA = Dlookup("CODEVBA", "T_VBA", "[IDVBA]=" & i)
     
    End Function
    - Une fois le code extrait, je souhaiterais l'exécuter

    Cela est-il possible ?

    Pourquoi je souhaites faire cela : je voudrais héberger dans cette table une série de procédures et fonctions qui nécessitent la manipulation de fichiers dont je ne suis pas l'administrateur (des pdf, des xls, des txt...). Ces derniers changent régulièrement (nom, structure, contenu...) et cela m'amène à modifier le code.
    C'est une contrainte qui s'impose à moi et que je ne peux pas trop contrôler. En revanche, la BDD dans laquelle ce code est hébergé est utilisée par de nombreux utilisateurs, si je modifie le code VBA en dur, je dois pousser une nouvelle version de la bdd, ce qui peut être pénible, surtout s'il s'agit juste de modifier le chemin d'un doc dans une ligne de code VBA. En "streamant" le code à partir d'une table, je pourrais le modifier à loisir sans avoir à faire de nouvelle livraison.

    Merci par avance pour votre aide et à votre disposition pour de plus amples informations.

    Cdt
    el

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Tu peux peut-être t'inspirer de ce tuto : http://silkyroad.developpez.com/VBA/VisualBasicEditor/

    Mais a mon avis il faut créer un module pour interpréter le code, et cela n'est pas possible dans tous les cas, par exemple si c'est un fichier mde.

    Philippe

  3. #3
    Membre éclairé
    Homme Profil pro
    Regisseur
    Inscrit en
    Octobre 2006
    Messages
    475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Regisseur
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Octobre 2006
    Messages : 475
    Points : 850
    Points
    850
    Par défaut
    Bonjour.

    Si j'avais à faire ce genre de travail, je pense que j'essaierais d'abord avec des procédures (dans un module standart) avec des arguments.
    On peut meme mettre des tableaux comme arguments. Celà n'est pas simple à coder (avec des tableaux), mais celà pourrait etre une bonne solution.
    Cdlt

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    les déclaration Dim Variable se font sens type en VbScrypt!

    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
    Sub test()
     Set sc = CreateObject("ScriptControl")
       sc.Language = "VBScript"
       sc.AddObject "This", CurrentDb, True
       ' Ajoute un module.
       Set M = sc.Modules.Add("Module1")
       ' Ajoute du code au module.
       M.AddCode MacroName
       ' Exécute le script.
       M.Run "MacroName", "toto", "titi" 'toto et titi sont les paramètres de MacroName
    End Sub
    Function MacroName()
    MacroName = "Sub MacroName(toto,titi)" & vbCrLf
    MacroName = MacroName & "Dim TOTO2,TITI2" & vbCrLf
    MacroName = MacroName & " TOTO2=toto:TITI2=titi" & vbCrLf
    MacroName = MacroName & "Msgbox ""TOTO2 : "" & TOTO2" & vbCrLf
    MacroName = MacroName & "Msgbox ""TITI2 : "" & TITI2" & vbCrLf
    MacroName = MacroName & "Msgbox ""This.name : "" & This.name" & vbCrLf
    MacroName = MacroName & "End sub"
    End Function
    ainsi tu peux enregistre ta macro dans un champ mémo de ta table et l’exécuter!
    Dernière modification par Invité ; 26/09/2017 à 17h05.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 113
    Points : 124
    Points
    124
    Par défaut
    Merci à tous pour votre aide,

    @Philippe, je vais regarder la ressource suggérée, ça m'a l'air très intéressant et ouvre d'autres perspectives.

    @Thierry, j'y ai pensé et ça a d'ailleurs été mon premier réflexe d'essayer de passer en variables les éléments qui pouvaient changer. Mais à l'usage, ça commençait à devenir trop lourd à gérer pour moi car il y a bcp trop de cas possibles...

    @dysorthographie, a priori c'est pil poil ce que je recherche, je vais tester rapidement. 2 questions toutefois :

    - Qu'entends-tu exactement lorsque tu dis "les déclaration Dim Variable se font sens type en VbScrypt!" => pas de "as string", "as long"... dans le champ mémo de la table ? (Du coup, ne va-t-il pas tout passer en variant ?)
    - Pour supprimer le scripte une fois utiliser, la syntaxe est-elle : M.Delete "MacroName" ?

    Bien à vous tous.
    el

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par elgordopresto Voir le message
    @dysorthographie, a priori c'est pil poil ce que je recherche, je vais tester rapidement. 2 questions toutefois :

    - Qu'entends-tu exactement lorsque tu dis "les déclaration Dim Variable se font sens type en VbScrypt!" => pas
    de "as string", "as long"...

    Re: Ici on utilise un objet ScriptControl, on peut exécuter du VbScipt!
    Dim var as string produira un erreur; dim var c'est la bonne syntaxe!

    dans le champ mémo de la table ?

    Re: Tu peux faire une sorte d'enregistreur de macro et si tu la désires l'enregistre dans le champ d'une table memo est un type de champ texte sens limite de taille!

    (Du coup, ne va-t-il pas tout passer en variant ?)
    Re :Non car dim var est forcement un variant! De plus dim var as variant produira une erreur comme.précisé plus haut!

    - Pour supprimer le scripte une fois utiliser, la syntaxe est-elle : M.Delete "MacroName" ?
    Re : Set sc = Nothing : Set M=Nothing suffisent pour supprimer ScriptCont


    Bien à vous tous.
    el
    Dernière modification par Invité ; 26/09/2017 à 17h39.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 113
    Points : 124
    Points
    124
    Par défaut
    @dysorthographie : Merci beaucoup, je viens de tester et ça marche avec le code que tu m'as transmis (j'ai déclaré en Object la variable sc et j'ai du affecter le type variant à m pour que mon access accepte d'exécuter le code).

    J'ai encore quelques questions (j'essaie de comprendre le principe !) : j'ai fait des points d'arrêt dans le code pour voir ce qu'il se passait et j'ai été surpris de voir que le "Module1" n'est ajouté à aucun moment dans la collection vba de ma bdd... J'en conclu que le scripte et juste chargé en mémoire et expurgé au moment ou je le set en "Nothing"

    Je ne connais pas trop les possibilités et contraintes du Vbscript, en dehors de la déclaration des variables, y a-t-il d'autres subtilités/pièges spécifiques à cet outil ?

    Pour ce qui est de l'intégration du code vba dans une table en champ mémo : oui c'est exactement ce que je comptais faire. J'utilise déjà massivement ce procédé pour créer à la volée des requêtes dont le sql est dans une table, des fichiers html dont le code source est dans une table, des fichiers texte... Je vais juste dupliquer le mode opératoire.

    el

  8. #8
    Invité
    Invité(e)
    Par défaut
    Oui il y a des petite chose à connaitre!


    Déjà tu n'es plus dans Access, donc oui le code est encapsulé en mémoire dans ScriptControl!


    sc.AddObject "This", CurrentDb, True il n'y aurait aucun intérêt si ScriptControl faisait petit pat pond entre soit! Il faut bien qu'il interagisse avec son environnement! Le code vue en tête de chapitre permet un maping entre un non virtuel interne This et un objet externe physique CurrentDb! Ainsi il es possible d'exécuter de requête.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dim rs
    Set rs=This.OpenRecordset("select * from MyTable")
    Note également que de commande comme Dir ne font pas parti du vocabulaire! On déclinera de ce qui est connu this.application.dir("c:\*.*")

    Je pense qu'il faudra aborder les Pb au file due temps!

    Pour compléter! Vba est un dérivé de Vb6, vba est moins puissant et plus pauvre que vb6.

    Vbsript est un dérivé de vba, il est moins puisant et plus pauvre que vba!

    En d'autre terme bien que vbSript est plus étriqué que vba le codage est très approchant!
    Dernière modification par Invité ; 26/09/2017 à 22h04.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 113
    Points : 124
    Points
    124
    Par défaut
    Merci dysorthographie. J'ai tester en réel selon mon besoin précis et cela marche pas mal du tout (jusqu'à présent ). Je passe la discussion en résolue.

  10. #10
    Invité
    Invité(e)
    Par défaut
    dysorthographie

  11. #11
    Invité
    Invité(e)
    Par défaut
    bonjour et merci Philippe.

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

Discussions similaires

  1. [XL-2007] code vba permettant d'importer dans une feuille Excel
    Par bettegga dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 24/02/2016, 16h34
  2. Réponses: 1
    Dernier message: 02/04/2015, 16h46
  3. [AC-2013] Debogage: Code VBA pour afficher contenu d'une variable
    Par abdoudiaw dans le forum VBA Access
    Réponses: 1
    Dernier message: 24/09/2013, 19h43
  4. Réponses: 4
    Dernier message: 04/10/2010, 14h25
  5. Réponses: 2
    Dernier message: 09/11/2006, 09h59

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