niko168b
Messages postés7Date d'inscriptionvendredi 14 mars 2008StatutMembreDernière intervention22 septembre 2008
-
14 mars 2008 à 17:48
niko168b
Messages postés7Date d'inscriptionvendredi 14 mars 2008StatutMembreDernière intervention22 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.
cs_ghuysmans99
Messages postés3983Date d'inscriptionjeudi 14 juillet 2005StatutMembreDernière intervention30 juin 201316 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
niko168b
Messages postés7Date d'inscriptionvendredi 14 mars 2008StatutMembreDernière intervention22 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.
niko168b
Messages postés7Date d'inscriptionvendredi 14 mars 2008StatutMembreDernière intervention22 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!