Cration de DLL VB pour utilisation dans Excel (VBA) [Résolu]

Messages postés
7
Date d'inscription
vendredi 14 mars 2008
Statut
Membre
Dernière intervention
22 septembre 2008
- - Dernière réponse : niko168b
Messages postés
7
Date d'inscription
vendredi 14 mars 2008
Statut
Membre
Dernière intervention
22 septembre 2008
- 8 sept. 2008 à 17:40
Bonjour,

Dans le cadre de mon travail je cherche à porter sous VB des macros que j'avais écrites en VBA. C'est bien sûr pour avoir un code protégé.
Mes macros se déclenchent sur les événements du classeur (modification de cellule, double clique...) et j'ai créé une DLL dont les fonctions sont appelées par les événement de mon classeur.

J'ai créé un projet de DLL ActiveX sous VB qui ne comporte qu'un module de classe et que j'ai instancier en GlobalMultiuser (ce qui devait permettre de ne pas créer d'objet pour pouvoir utiliser les fonctions)
Il ne comporte qu'une seule fonction :
Function dllTst(ByVal Sh As Object, ByVal Target As Range) As Boolean
    Target = Now
    Sh.Cells(1, 1) = Sh.Cells(1, 1) + 1
End Function

J'ai créer la DLL et dans mon classeur Excel j'ai mis le bout de code suivant dans un module :
Private Declare Function dllTst Lib "Path\maDll.dll" (ByVal Sh As Object, ByVal Target As Range) As Boolean




Function tst(ByVal Sh As Object, ByVal Target As Range) As Boolean
        tst = dllTst(Sh, Target)
End Function


et ce bout de code dans le module ThisWorkbook :
Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, CancelAs Boolean)
    tst Sh, Target
End Sub

Lorsque je double clique sur une cellule, j'ai le message d'erreur :
Erreur d'exécution '453':
Point d'entrée dllTst d'une DLL introuvable dans Path\maDll.dll

J'ai fait un coup de regsvr32.exe pour inscrire ma DLL dans la base de registre mais ça n'a rien changé.

Quelqu'un pourrait-il m'aider? Si vous avez un exemple qui marche en C/C++ je suis preneur aussi.

Niko
Afficher la suite 

4 réponses

Meilleure réponse
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
3
Merci
Declare Function .... lib "..."
sont pour les DLLs API.

ciao...
BruNews, MVP VC++

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 135 internautes nous ont dit merci ce mois-ci

Commenter la réponse de BruNews
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
11
3
Merci
Les DLLs VB6 sont toujours des ActiveX.
Les autres ne sont pas forcément des ActiveX.

C'est à dire que Public Function Declare n'est fait que pour les DLLs qui ne sont pas en VB.
Pour le reste, voir CreateObject
_______________________________________________________________________
VB.NETis good ...VB6is better

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 135 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_ghuysmans99
Messages postés
7
Date d'inscription
vendredi 14 mars 2008
Statut
Membre
Dernière intervention
22 septembre 2008
3
Merci
Merci pour vos réponses,

J'ai finalement trouvé ce week-end.
Je voudrais mettre ma solution en PJ mais je sais pas comment faire ...

En gros c'est encore plus court que ce que j'avais fait:

Dans VB, créer un projet DLL activeX
J'ai appelé le projet Action et la classe clsAction.
J'ai ajouté dans Projet/Références : 
   - Microsoft Excel xx.0 Object Library
   - Microsoft Office xx.0 Object Library (suis pas sûr qu'il soit nécessaire)

Function DoubleClick_Action(ByVal Wb As Workbook, ByVal Sh As Object, ByVal Tg As Range, Cancel As Boolean) As Boolean
       
    Tg = Now ' Mise à jour de la cellule sur laquelle on a double cliquer
   
    Sh.Cells(1, 1) = Sh.Cells(1, 1) + 1 ' Mise à jour du compteur de clique en "A1"
   
    Wb.Sheets(2).Cells(Sh.Cells(1, 1), 1) = Now ' Mise à jour en feuille 2 du classeur
   
    Cancel = True ' Le double click permet normalement de passser en mode édition de
                  ' la cellule, mettre Cancel à True bloque l'édition
                  ' testez avec false si c'est pas clair :)
   
    DoubleClick_Action = True ' ça sert à rien ici mais c'est plus propre
End Function

J'ai construit la DLL (Fichier / Créer Action.dll)

J'ai créer un nouveau fichier Excel, dans l'éditeur VBA (Alt + F11) j'ai ajouter la référence ) ma Dll (Outils / Références -> Parcourir)
J'ai créer un nouveau Module (renomé CallAction) avec le code ci-dessous

Option Explicit



Public bAction As Boolean
'



Sub Call_DoubleClick_Action(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
   



    Dim Action As clsAction
    Set Action = New clsAction
   
    bAction = Action.DoubleClick_Action(ThisWorkbook, Sh, Target, Cancel)
    If Not bAction Then MsgBox "Problème"
   
    Set Action = Nothing
End Sub




Et j'ai écris la fonction Workbook_SheetBeforeDoubleClick dans le module ThisWorkbook comme ça :

Option Explicit



Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
    Call_DoubleClick_Action Sh, Target, Cancel
End Sub




Et voilà! Doiuble cliquer sur une cellule et la date se met automatiquement dedans. La cellule A1 sert de compteur et vous avez aussi un récapitulatif en feuille 2.

Niko

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 135 internautes nous ont dit merci ce mois-ci

Commenter la réponse de niko168b
Messages postés
7
Date d'inscription
vendredi 14 mars 2008
Statut
Membre
Dernière intervention
22 septembre 2008
3
Merci
Je reposte sur mon poste pour le même problème avec VB - 2008, j'ai longtemps cherché sur le NET et j'ai fini par trouver la réponse approximative.
Je donne donc ma solution ici. Elle fonctionne pour VB, j'imagine qu'elle fonctionne aussi pour C#, C++

Créez un projet de type Class Library (désolé j'ai la version anglaise de visual) (ici projet tst_COM)






Rendez votre classe de type COM dans ses paramètres (vous devez être sur le corps de votre classe mais pas dans une fonction)





Le texte
<Microsoft.VisualBasic.ComClass()>
est automatiquement ajouté à l'entête de votre classe.

Allez dans les propriétés de votre projet







Sur l'onglet Application, cliquez sur Assembly Information

Cochez Rendre l'application visible par COM

OK

Allez sur l'onglet Signature et cochez "Signer le composant". Dans la combobox fichier de signature, sélectionnez Nouveau

Donnez un nom sans extension (il sera complété par .pfx) et notez le password que vous choisissez (il est obligatoire et sa complexité est vérifiée par l'éditeur)

Lorsque vous compilerez votre code, il faudra encore l'enregistrer en utilisant RegAsm. Normalement dans C:\Program Files\Microsoft Visual Studio 9.0\SDK\v3.5\Bin. S'il ne s'y trouve pas tentez une recherche sur vos disques system. Sinon il faut télécharger et installer le SDK (http://www.microsoft.com/downloads/details.aspx?familyid=30402623-93ca-479a-867c-04dc45164f5b&displaylang=en).
Le mieux est de créer un raccourci vers cette fonctionnalité dans visual. Allez dans Outils > Outils Extérieurs

Ajouter votre nouvelle fonctionnalité:

Choisissez le titre qui vous convient
La commande doit indiquer le chemin de l'exécutable RegAsm
Les arguments sont /codebase /tlb et le chemin du fichier dll à enregistrer. Normalement les variable projets $(BinDir) et $(TargetName) suivies de ".dll" permettent d'indiquer ce fichier.
De même pour le répertoire de lancement, indiqué  $(BinDir) doit suffire.
Je décoche l'option de fermeture lors de la fin du script pour vérifier le bon déroulement.

Vous pouvez maintenant compiler votre dll et l'enregistrer ce qui vous fourni un fichier .tlp dans votre répertoire de release:

C'est ce fichier que vous devez indiquer en référence dans vos projets vba!

Niko

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 135 internautes nous ont dit merci ce mois-ci

Commenter la réponse de niko168b