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

VB.NET Discussion :

Créer une DLL bibliothèque pour VBA [Débutant]


Sujet :

VB.NET

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2010
    Messages : 252
    Points : 145
    Points
    145
    Par défaut Créer une DLL bibliothèque pour VBA
    Bonjour à tous,

    Je tente de créer une bibliothèque de fonctions sous VB.net (VS2015) afin de l’utiliser dans des projets Access VBA.
    J’ai créé un projet DLL VB.net très simple constitué d’une classe déclarée publique exposant deux fonctions élémentaires et publiques également (l’une portant sur une chaine de texte, l’autre sur un nombre réel).

    Après une première compilation j’ai constaté que la DLL n’apparaissait pas dans la liste des références que je pouvais associer à un projet Access ; Ceci était probablement dû au fait qu’aucun fichier .tlb n’avait été généré.
    J’ai complété mon projet VB.net en y ajoutant une Interface implémentée par ma classe. Après une nouvelle compilation la DLL apparait dans la liste des références associables à mon projet VBA, OK.

    Côté VBA maintenant, pour utiliser l’une ou l’autre des deux fonctions exposées par ma DLL VB.net je suis obligé de créer une instance de la classe publique dont elles font partie et ça m’embête beaucoup car le but est de transposer dans cette bibliothèque VB.net un ensemble de fonctions utilitaires actuellement incorporées aux projets VBA qui les utilisent sans préfixer leurs noms d’un nom d’objet.

    Lorsque je crée des DLL VB6 destinées à ce genre d’usage je crée des classes avec la propriété d’instanciation « GlobalMultiUse » et je n’ai pas à instancier un objet correspondant dans les applications clientes. Est-il possible de faire la même chose avec une DLL créée sous VB.net et, si oui, comment ?

    Merci pour votre aide et joyeux Noël,

  2. #2
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7

  3. #3
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2010
    Messages : 252
    Points : 145
    Points
    145
    Par défaut
    Merci Wallace1 pour ta réponse rapide.

    J'ai lu avec intérêt l'article que tu m'as proposé et je regrette de ne pas l'avoir lu plus tôt car comme le dit son auteur, j'aurais évité quelques heures de mal de crâne!

    Bon, le problème c'est que cet article ne décrit rien de plus que ce que je fais déjà si ce n'est qu'il ne déclare pas d'interface mais comme il est écrit en C# ceci explique peut-être cela; toujours est-il qu'il ne répond pas à la question qui est "peut-on invoquer des procédures de la DLL dans VBA sans avoir à créer d'objet?"

  4. #4
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Citation Envoyé par Depite Voir le message
    Merci Wallace1 pour ta réponse rapide.

    J'ai lu avec intérêt l'article que tu m'as proposé et je regrette de ne pas l'avoir lu plus tôt car comme le dit son auteur, j'aurais évité quelques heures de mal de crâne!

    Bon, le problème c'est que cet article ne décrit rien de plus que ce que je fais déjà si ce n'est qu'il ne déclare pas d'interface mais comme il est écrit en C# ceci explique peut-être cela; toujours est-il qu'il ne répond pas à la question qui est "peut-on invoquer des procédures de la DLL dans VBA sans avoir à créer d'objet?"
    Es-tu certain d'avoir configuré ton projet type DLL en COM Visible ?

    "[I]peut-on invoquer des procédures de la DLL dans VBA [U]sans avoir à créer d'objet?
    C'est sure que si tu as créés une DLL qui contient de l'instanciation qu'il faudra instancier ensuite dans ton Interop !!!!! Donc montres le contenu de ta DLL qu'on soit certain de parler le même langage stp....
    Si tu veux pas d'instanciation alors tu codes des méthodes publiques partagées dans ta DLL et le problème est réglé

  5. #5
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2010
    Messages : 252
    Points : 145
    Points
    145
    Par défaut
    J'ai bien coché les options "Rendre l'assembly visible par COM" et "inscrire pour COM Interop"

    Voici ma première approche (sans interface), tout appel d'une des fonctions est rejeté à la compilation du projet VBA:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Public Class ClasseTest
        Public Shared Function Test() As String 
            Return "Test réussi"
        End Function
        Public Shared Function Ajouter(Nombre1 As Single, nombre2 As Single) As Single
            Return Nombre1 + nombre2
        End Function
    End Class
    Voici l'approche avec Interface; rend mes fonctions visibles dans l'explorateur d'objets de VBA mais nécessite d'instancier un objet:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Public Interface IClasseTest
        Function Test() As String
        Function Addition(Num1 As Single, Num2 As Single) As Single
    End Interface
    Public Class ClasseTest
        Implements IClasseTest
        Public Function Test() As String Implements IClasseTest.Test
            Return "Test réussi"
        End Function
        Public Function Ajouter(Nombre1 As Single, nombre2 As Single) As Single Implements IClasseTest.Addition
            Return Nombre1 + nombre2
        End Function
    End Class

  6. #6
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Citation Envoyé par Depite Voir le message
    Bonjour à tous,


    Lorsque je crée des DLL VB6 destinées à ce genre d’usage je crée des classes avec la propriété d’instanciation « GlobalMultiUse » et je n’ai pas à instancier un objet correspondant dans les applications clientes. Est-il possible de faire la même chose avec une DLL créée sous VB.net et, si oui, comment ?

    Merci pour votre aide et joyeux Noël,
    Je ne pense pas. VBA n'est pas VB6; surtout que VBA n'est pas un langage compilé. Ceci dit, je ne connais pas VBA Access. Mais il faudrait que MS ait prévu le cas uniquement pour Access, ce dont je doute. Encore que ce soit possible avec un ActiveX.

    Et quand on travaille en Late Binding, il faut absolument que l'objet externe soit instancié avant de vouloir l'utiliser.
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  7. #7
    Invité
    Invité(e)
    Par défaut
    bonjour,
    vas dans les références de ton projet et importe le manifeste de ta DLL.

    Nom : Sans titre.png
Affichages : 1310
Taille : 25,8 Ko

  8. #8
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2010
    Messages : 252
    Points : 145
    Points
    145
    Par défaut
    Merci pour ta réponse dysorthographie,

    C'est bien ce que j'ai fait et ma bibliothèque fonctionne mais uniquement lorsque je déclare un objet de la classe de ma DLL qui fournit les méthodes distribuées.

    Je précise:

    dans mon projet DLL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public class clOutils
      public function Addition(byval A as long, byval B as long) as long
        return A + B
      end function
    end class
    Dans mon code VBA
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    dim x as long 
    x = Addition(1,1)  ' ERREUR
    dim Obj as new clOutils
    x = Obj.Addition(1,1)  '  Fonctionne
    Bien sûr je peux déclarer globalement un objet unique et y faire référence à chaque appel de chaque fonction mais lorsqu'il s'agit de remplacer les fonctions globales actuellement fournies par un module intégré dans le projet VBA ça fait beaucoup de lignes à modifier pour préfixer les noms des fonctions par le nom de l'objet.

    Si ce n'est pas possible je concentrerai les appels aux fonctions de la bibliothèque dans un module VBA ce qui me permettra de conserver le code initial tel quel tout en permettant le partage et l'évolution entre différents projets.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    'VBA
    Module Bibliothèque
      dim Obj as clOutils
      public function Addition(X as long, Y as long) as long
        return Obj.Addition(X,y)
      end function
    end module

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 16/08/2013, 13h14
  2. Débutant : créer une DLL en C# pour LabVIEW
    Par julienAu dans le forum C#
    Réponses: 9
    Dernier message: 11/03/2011, 10h27
  3. créer une dll pour utiliser l'ASIO
    Par ccinfonews dans le forum Bibliothèques, systèmes et outils
    Réponses: 2
    Dernier message: 22/09/2010, 11h50
  4. [C++] Besoin d'aide pour créer une dll.
    Par Vince dans le forum Débuter
    Réponses: 3
    Dernier message: 15/03/2010, 13h55
  5. La bonne méthode pour créer une DLL ?
    Par tintin72 dans le forum Windows
    Réponses: 2
    Dernier message: 18/05/2008, 11h26

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