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 :

[MVSE 2008 - VBA 2007] - Créer une DLL VBNet et l'utiliser dans une macro VBA


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de Golard
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 288
    Par défaut [MVSE 2008 - VBA 2007] - Créer une DLL VBNet et l'utiliser dans une macro VBA
    Bonjour à tous,

    Je suis déjà intervenu dans plusieurs posts à ce sujet, et vous m'avez donné différentes

    pistes que j'ai étudié.

    Aujourd'hui, je passe à la mise en pratique et comme je n'arrive toujours pas à réaliser le

    Set de ma classe, je me permets de créer ce sujet en espérant bientôt le marquer comme Résolu

    grâce à votre aide

    La solution que je tente de mettre en oeuvre est basée sur les interventions de rv26t dans ce

    post: http://www.developpez.net/forums/d13...cutables-lier/
    et sur l'article de Eric Vernié suivant : http://msdn.microsoft.com/fr-fr/library/bb727303.aspx.



    1ère étape: Création de la DLL sous Microsoft Visual Basic 2008 Express

    Edition


    Je lance l'environnement en tant qu'administrateur, et je créé un projet de type bibliothèque

    de classe.

    Le code est le suivant:

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    ''' <summary>L'interface représente un Wrapper de la classe Alarme pour les programmes exe vb6.</summary>
    ''' <remarks>Sera exportée dans la bibliothéque de type créé dans l'assembly.</remarks>
    Public Interface IAlarmes
        Property Nom() As String
        Sub GestAlarme()
    End Interface
     
    ''' <summary>La classe alarme visible.</summary>
    ''' <remarks>Les éléments public seront visible. 
    ''' Bien implémenter toutes les définitions de l'interface.</remarks>
    <ComClass(Alarme.ClassId, Alarme.InterfaceId, Alarme.EventsId)> _
    Public Class Alarme
     
        Implements IAlarmes ' contrat entre classe et interface.
     
    #Region "COM GUIDs"
        ' These  GUIDs provide the COM identity for this class 
        ' and its COM interfaces. If you change them, existing 
        ' clients will no longer be able to access the class.
        Public Const ClassId As String = "4a0e43b3-c03d-4a5e-a236-f2c5494e5325"
        Public Const InterfaceId As String = "19990bbb-65e8-4726-b01e-b1df1b120540"
        Public Const EventsId As String = "6e86907a-52d3-4087-8af6-c341a64a76eb"
    #End Region
     
        Private mNom As String
     
        ''' <summary>Une propriété pour exemple</summary>
        ''' <value>La nouvelle valeur de la propriété.</value>
        ''' <returns>La valeur de la propriété.</returns>
        ''' <remarks>Bien implémenter l'interface.</remarks>
        Public Property Nom() As String _
        Implements IAlarmes.Nom ' implémentation de la propriété définie dans l'interface
            Get
                Return mNom
            End Get
            Set(ByVal value As String)
                mNom = value
            End Set
        End Property
     
        Public Sub New()
            'MyBase.New()
        End Sub
     
        ''' <summary>Une procedure de test.</summary>
        ''' <remarks>Bien implémenter l'interface.</remarks>
        Public Sub GestAlarme() _
        Implements IAlarmes.GestAlarme ' implémentation de la procédure définie dans l'interface
            MsgBox("alarme")
            MsgBox("Mon nom est " & mNom)
        End Sub
     
    End Class
    Dans les propriétés du projet, onglet Application, bouton Assembly Information, je coche

    "Make Assembly code visible":

    Nom : 2-References_Test03_GuidIndependantDuCodeDeLaClass.png
Affichages : 1415
Taille : 22,0 Ko

    Je compile via le menu Build et j'obtiens le fichier Alarmes.dll



    2ème étape: Création du fichier .tlb

    A présent que je dispose du fichier Alarmes.dll, il faut construire la bibiothèque de type

    Alarmes.tlb (car celle-ci ne peut pas être générée automatiquement avec la version Express)

    Pour cela, j'ai testé 2 solutions qui donnent (à priori) le même résultat:

    a) En utilisant Regasm

    Je place Regasm.exe dans le même répertoire que Alarmes.dll
    J'ouvre la console "invite de commandes" en tant qu'administrateur
    Je tape la commande:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Regasm Alarmes.dll /tlb
    b) En utilisant l'outil mis à disposition par Eric Vernié (cf référence de l'article plus

    haut)

    Dans les 2 cas j'obtiens le fichier Alarmes.tlb



    3ème étape: Ecriture de la macro sous Excel Office 2007


    J'ajoute la référence à la DLL en utilisant le fichier Alarmes.tlb
    Dans un module VBA, je tape 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
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    Option Explicit
     
    Private monAlarme As Alarmes.Alarme ' la classe vb.net
    Private monAlInt As Alarmes.IAlarmes ' l'interface pour vb6
     
    ' programmation classique (miracle)
    Sub Bouton2_Clic()
    '
    ' Bouton2_Clic Macro
    '
    Set monAlarme = New Alarmes.Alarme ' implémente la classe alarme (nous avons un objet alarme)
    Set monAlInt = monAlarme ' récupère l'interface à partir de l'objet alarme (permet d'avoir 
     
    l'Intellisense ce qui est très pratique)
     
    MsgBox "clic sur le bouton"
    monAlInt.Nom = "alarme1" ' attribue un nom
    Call monAlInt.GestAlarme ' appele la sub
    'Call GestAlarme ' appele la sub
     
    Set monAlarme = Nothing
    Set monAlInt = Nothing
     
    End Sub
    Le code est donc déclenché par l'appui sur un bouton (Bouton2).

    Malheureusement, ça ne fonctionne pas.

    J'obtiens l'erreur suivante:

    Nom : 5a-Erreur_test03_AppelDepuisVBA.png
Affichages : 1251
Taille : 14,8 Ko

    L'erreur survient au Set de la classe:

    Nom : 5b-Erreur_test03_AppelDepuisVBA.png
Affichages : 1570
Taille : 109,3 Ko



    J'ai vraiment besoin de votre aide !!!

    Pour commencer, je ne comprends pas à quoi correspond le numéro GUID présent sur la fenêtre "Assembly Information" (cf image jointe), car il n'en est pas question dans les articles en référence. En y mettant le même numéro que celui de la ClassId du code de la classe, je n'arrive plus à générer le fichier .tlb

    Je tourne en rond depuis plusieurs jours et je compte sur vos lumières !



    (PS: Si l'emplacement de ce post est plutôt dans la section Office VBA, n'hésitez pas à me

    le signaler ou à le déplacer)

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Par défaut
    Bonjour,

    En .net ton assembly s'appele Alarmes ?
    [Edit] Tes liens sont incorrects.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  3. #3
    Membre éclairé
    Avatar de Golard
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 288
    Par défaut
    Citation Envoyé par rv26t Voir le message
    Bonjour,

    En .net ton assembly s'appele Alarmes ?
    Oui, voici la copie d'écran de l'onglet Application :

    Nom : 2b-OngletApplication_Test03.png
Affichages : 1349
Taille : 110,0 Ko

    Dans le code VBA, l'implémentation fonctionne correctement :

    Nom : 5c-implementationCorrecteAlarmesAlarme_test03.png
Affichages : 1124
Taille : 2,5 Ko

  4. #4
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Par défaut
    Je ne vois pas le souci.
    Je viens de tester la ligne qui te pose problème passe chez moi, mais cela plante la ligne d'après pour l'interface, mais comme j'ai tout modifié dans la dll vb.net, il faut que je regarde.

    [Edit]J'ai corrigé par rapport à mes modif et cela fonctionne. (j'ouvre même un formulaire vb.net), j'ai lancé le code direct en debug, pas à travers un bouton.
    Note : dans mon projet, l'espace de noms racine s'appele aussi Alarmes

    [Edit2] L'erreur est bizarre et laisse penser à un problème d'accès fichier. ???
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  5. #5
    Inactif  

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

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    As-tu ajouté la référence à Alarmes.dll dans le projet VBA ? (Outils-Références)

    Dans ce cas, sauf horreur de ma part, il faut ajouter la référence, comme pour toute autre bibliothèque COM externe


    Oupss! À la relecture il semblerait que la référence est bien là.

    Je laisse quand même le message au cas où...

  6. #6
    Membre éclairé
    Avatar de Golard
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 288
    Par défaut
    Tout d'abord, merci de vous pencher sur mon problème, j'espère qu'on va y arriver

    Citation Envoyé par rv26t Voir le message
    [Edit]J'ai corrigé par rapport à mes modif et cela fonctionne. (j'ouvre même un formulaire vb.net), j'ai lancé le code direct en debug, pas à travers un bouton.
    Note : dans mon projet, l'espace de noms racine s'appele aussi Alarmes
    J'ai renommé mon espace de noms racine Alarmes comme toi:
    Assembly name = Alarmes
    Root namespace = Alarmes (au lieu de ClassLibrary1)

    ça ne change rien, même erreur (même en lançant le code direct en debug)

    Citation Envoyé par rv26t Voir le message
    [Edit2] L'erreur est bizarre et laisse penser à un problème d'accès fichier. ???
    J'ai ouvert Excel en administrateur, ça ne change rien

    Citation Envoyé par clementmarcotte Voir le message
    As-tu ajouté la référence à Alarmes.dll dans le projet VBA ? (Outils-Références)
    Oui, voici les références du projet VBA:

    Nom : 5c-References-VBAProject_test04.png
Affichages : 1394
Taille : 37,0 Ko

    Manquerait-il une référence nécessaire au fonctionnement de l'interopérabilité COM ?

    Sinon, que pensez-vous du fait qu'il y ait 4 GUIDs différents dans mon projet vbnet ? est-ce pareil chez vous ?

  7. #7
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Par défaut
    Je n'ai pas de GUId dans le code.
    Par contre j'ai un fichier de signature (propriété du projet, onglet signature), je ne sais pas si cela a un impact, mais j'ai vu que c'était conseillé. (je ne me souvient plus comment je l'avais généré, mais on doit pouvoir le retrouver)
    Je ne peux pas voir les autres points pour l'instant, je reprend cela plus tard.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

Discussions similaires

  1. [GSL] Utilisation dans une DLL
    Par guillaumeFLAM dans le forum Bibliothèques
    Réponses: 1
    Dernier message: 07/08/2013, 16h19
  2. [MySQL] recuperer une valeur dans une liste deroulante pour l'utiliser dans une seconde liste
    Par tortue_22 dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 12/05/2010, 11h50
  3. Réponses: 4
    Dernier message: 04/07/2008, 10h34
  4. Réponses: 4
    Dernier message: 07/05/2007, 21h38
  5. Réponses: 16
    Dernier message: 06/08/2006, 23h45

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