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:
	
| 12
 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:
	
| 12
 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)