Cration de DLL VB pour utilisation dans Excel (VBA)

Résolu
niko168b Messages postés 7 Date d'inscription vendredi 14 mars 2008 Statut Membre Dernière intervention 22 septembre 2008 - 14 mars 2008 à 17:48
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

4 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
14 mars 2008 à 20:52
Declare Function .... lib "..."
sont pour les DLLs API.

ciao...
BruNews, MVP VC++
3
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
14 mars 2008 à 22:27
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
3
niko168b Messages postés 7 Date d'inscription vendredi 14 mars 2008 Statut Membre Dernière intervention 22 septembre 2008
17 mars 2008 à 13:47
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
3
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
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
3
Rejoignez-nous