3 pièce(s) jointe(s)
[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:
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":
Pièce jointe 154242
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:
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:
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:
Pièce jointe 154247
L'erreur survient au Set de la classe:
Pièce jointe 154248
J'ai vraiment besoin de votre aide !!!
:pc: 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 :cry::cry::cry:
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)