Intégrer une dll en c++ dans une macro VBA

Intégrer une dll en c++ dans une macro VBA - VB/VBA/VBS - Programmation

Marsh Posté le 07-01-2012 à 11:19:23    

Bonjour
 
J'ai cherché sur des forums, google, etc... comment créer une dll en C++ et ensuite l'utiliser dans une macro excel mais il y a toujours une erreur généré dans les exemples donnés !
 
Donc je me décide à poser la question sur ce forum :)
 
J'utilise :
 - Visual C++ 2010 express (version gratuite)
 - Excel 2007
 
Mon besoin :
 - La dll à deux entrées (des doubles par exemple) et une sortie (un double aussi par exemple qui sera l'addition des deux entrées)
 - La macro appelle la dll et affiche le résultat dans une cellule (c'est l'appelle de la dll qui me pause problème ici).
 
 
Vous aurez compris que c'est un programme simple et inutile. Mais il aura pour objectif que je comprenne le/les liens qu'il doit y avoir entre la dll et vba.
 
Je débute aussi bien en vba que en c++ (en ce qui concerne les E/S) !
 
l'objectif premier et de pouvoir accélérer mon code VBA déjà créée. Ce sont des calculs statistiques qui prennent énormément de ressource !
L'objectif second et d'apprendre un peut plus le C++.
 
Merci d'avance pour les exemples que vous pourrez m'apporter.
 
 

Reply

Marsh Posté le 07-01-2012 à 11:19:23   

Reply

Marsh Posté le 07-01-2012 à 22:39:06    

Microsoft explique ça sur sa page http://msdn.microsoft.com/en-us/library/bb687915.aspx
 
Edit : voir aussi http://support.microsoft.com/kb/178474/fr


Message édité par billgatesanonym le 07-01-2012 à 22:42:36
Reply

Marsh Posté le 08-01-2012 à 11:06:14    

Merci,
 
Alors je me trouve toujours avec le même message d'erreur 453 : "Point d'entrée Test d'une DLL introuvable dans test4.dll"

 
Voici mon code Excel :
 
Private Declare Function Test Lib "test4.dll" (ByVal y As Double) As Double
 
Private Sub CommandButton1_Click()
     
    Dim Valeur As Double
    Valeur = 2
    Cells(1, 1).Value = Test(Valeur)
 
End Sub

 
 
Mon test4.h
 
//#include "stdafx.h"
#include "windows.h"
#define export __declspec (dllexport)
export double __stdcall test4(double );

 
 
mon test4.cpp
 
// test4.cpp : définit les fonctions exportées pour l'application DLL.
//
#include "test4.h"
double _stdcall test4(double z)  
{  
return z+2 ;  
}

 
 
mon test4.def
 
LIBRARY fonctions
EXPORTS
test4

 
Où est l'erreur ? Merci : - )

Reply

Marsh Posté le 08-01-2012 à 11:28:28    

Citation :

Où est l'erreur ? Merci : - )


Ta fonction dans la dll s'appelle test4

Citation :

LIBRARY fonctions  
EXPORTS  
test4


et ton code VB cherche à trouver une fonction nommée Test dans la dll

Citation :

Private Declare Function Test Lib "test4.dll" (ByVal y As Double) As Double


Comme il n'y en a pas avec ce nom dans la Dll, il y a echec, d'ou le message d'erreur tout a fait logique
"Point d'entrée Test d'une DLL introuvable dans test4.dll"  
 
En faisant
Private Declare Function test4 Lib "test4.dll" (ByVal y As Double) As Double
et
Cells(1, 1).Value = test4(Valeur)  
ça devrait coller
 
A+,

Message cité 1 fois
Message édité par gilou le 08-01-2012 à 11:33:14

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 08-01-2012 à 11:29:19    

gilou a écrit :

Citation :

Où est l'erreur ? Merci : - )


Ta fonction dans la dll s'a


 
Je vais attendre la suite ^^

Reply

Marsh Posté le 08-01-2012 à 11:33:36    

Elle est la :)
Noter que le message d'erreur (traduit sans trop comprendre par le traducteur) n'est pas clair.
"Point d'entrée Test introuvable dans test4.dll"  
aurait été plus clair.
A+,

Message cité 1 fois
Message édité par gilou le 08-01-2012 à 11:38:27

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 08-01-2012 à 11:36:47    

gilou a écrit :

Elle est la :)
Noter que le message d'erreur (traduit sans troip comprendre opar le traducteur) n'est pas clair.
"Point d'entrée Test introuvable dans test4.dll"  
aurait été plus clair.
A+,


 
Merci beaucoup, ça marche enfin !!!
 :pt1cable:

Reply

Marsh Posté le 08-01-2012 à 11:38:07    

Si tu veux un exemple plus construit, mais en anglais, voir par exemple ce lien: http://www.developerfusion.com/art [...] ual-basic/
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 08-01-2012 à 11:40:10    

Bah maintenant la prochaine étape va être de passer un tableau de double  et de renvoyer une tableau également!
 
ensuite j’écrirai mes équations : - )

Reply

Marsh Posté le 08-01-2012 à 15:13:55    

Alors comme je le pensais je n'y arrive pas sans vous : - )
 
Symptome : Excel crash sans message d'erreur, module test2 incriminé (test4 seul fonctionne très bien)
 
L'idée du code suivant est de :
 - passer un tableau de VBA vers ma dll
 - de récupérer un nombre (qui ne veut rien dire c'est juste pour faire tourner la macro et être certain qu'elle fonctionne)
 
test4.cpp :

Code :
  1. // test4.cpp : définit les fonctions exportées pour l'application DLL.
  2. //
  3. #include "test4.h"
  4. double _stdcall test4(double z,double y)
  5. {
  6. int i;
  7. for(i=1;i<10000000;i++)
  8. {
  9.  z=z/z+z-1;
  10.  z=sqrt(pow(z,2));
  11.  z=z+1;
  12. }
  13. return z+y;
  14. }
  15. double _stdcall test2(int * tableau,long lngNbItems)
  16. {
  17. long i;
  18. for(i=0;i<lngNbItems;i++)
  19. {
  20.  tableau[i] = 2 * tableau[i];
  21. }
  22. return i;
  23. }


 
test4.h

Code :
  1. #include "math.h"
  2. #define export __declspec (dllexport)
  3. export double __stdcall test4(double );
  4. export double __stdcall test2(int ,long );


 
test4.def

Code :
  1. LIBRARY fonctions
  2. EXPORTS
  3. test4
  4. test2


 
VBA

Code :
  1. 'Déclaration de la DLL
  2. Private Declare Function test4 Lib "C:\Users\Jerome\Desktop\test\Test4\test4\Debug\test4.dll" (ByVal y As Double, ByVal x As Double) As Double
  3. Private Declare Function test2 Lib "C:\Users\Jerome\Desktop\test\Test4\test4\Debug\test4.dll" (tableau As Long, ByVal lngNbItems As Long)
  4. Private Sub CommandButton1_Click()
  5.    
  6.     'Déclaration des variables
  7.     Dim ValeurX As Double
  8.     Dim ValeurY As Double
  9.     Dim i As Long
  10.     Dim elements(0 To 9) As Long
  11.    
  12.     'Dim Tableau As Variant
  13.    
  14.    
  15.     'Remplissage des variables
  16.     ValeurX = Cells(1, 1).Value
  17.     ValeurY = Cells(1, 2).Value
  18.    
  19.    
  20.    
  21.     'Boucle dans vba
  22.     For i = 1 To 10000000 Step 1
  23.         ValeurX = ValeurX / ValeurX + ValeurX - 1
  24.         ValeurX = (ValeurX ^ 2) ^ 0.5
  25.         ValeurX = ValeurX + 1
  26.     Next i
  27.     Cells(3, 1).Value = ValeurX
  28.    
  29.     'Appelle de la dll
  30.     ValeurX = Cells(1, 1).Value
  31.     Cells(2, 1).Value = test4(ValeurX, ValeurY)
  32.     For i = 0 To 9
  33.         elements(i) = i
  34.     Next
  35.     Cells(2, 2).Value = test2(elements(0), 10)
  36.    
  37.     'Affichage du temps
  38.     Cells(4, 1).Value = Fin - Debut
  39.    
  40. End Sub


 
merci de votre aide.
 
L'idée est d'ensuite de passer un tableau au lieu d'un nombre dans le sens dll => VBA également


Message édité par totem le 08-01-2012 à 15:41:53
Reply

Marsh Posté le 08-01-2012 à 15:13:55   

Reply

Marsh Posté le 15-01-2012 à 15:28:22    

Bon j'ai réussi a passer un tableau dans les deux sens en declarant non pas une fonction mes un(e) sub.
 
Maintenant ma question (toute simple) :
 - Comment déclarer la dll sans mettre le chemin en entier et sans placer la dll dans windows\system ?
 

Code :
  1. 'Déclaration de la DLL
  2. Private Declare Function test4 Lib "C:\Users\Jerome\Desktop\test\Test4\test4\Debug\test4.dll" (ByVal y As Double, ByVal x As Double) As Double


 
Un truc du style ci-après qui ferait ce que fait ci-avant ?
 

Code :
  1. 'Déclaration de la DLL
  2. Private Declare Function test4 Lib activeworbook.path & "\test4\Debug\test4.dll" (ByVal y As Double, ByVal x As Double) As Double


 
Mais ça ne marche pas !
 
Merci d'avance

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed