Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2236 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°2120042
totem
Posté le 07-01-2012 à 11:19:23  profilanswer
 

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.
 
 

mood
Publicité
Posté le 07-01-2012 à 11:19:23  profilanswer
 

n°2120095
billgatesa​nonym
Posté le 07-01-2012 à 22:39:06  profilanswer
 

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
n°2120107
totem
Posté le 08-01-2012 à 11:06:14  profilanswer
 

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

n°2120109
gilou
Modérateur
Modzilla
Posté le 08-01-2012 à 11:28:28  profilanswer
 

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é!  --
n°2120110
totem
Posté le 08-01-2012 à 11:29:19  profilanswer
 

gilou a écrit :

Citation :

Où est l'erreur ? Merci : - )


Ta fonction dans la dll s'a


 
Je vais attendre la suite ^^

n°2120111
gilou
Modérateur
Modzilla
Posté le 08-01-2012 à 11:33:36  profilanswer
 

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é!  --
n°2120112
totem
Posté le 08-01-2012 à 11:36:47  profilanswer
 

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:

n°2120113
gilou
Modérateur
Modzilla
Posté le 08-01-2012 à 11:38:07  profilanswer
 

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é!  --
n°2120114
totem
Posté le 08-01-2012 à 11:40:10  profilanswer
 

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

n°2120131
totem
Posté le 08-01-2012 à 15:13:55  profilanswer
 

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
mood
Publicité
Posté le 08-01-2012 à 15:13:55  profilanswer
 

n°2121443
totem
Posté le 15-01-2012 à 15:28:22  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

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

 

Sujets relatifs
InputBox Excel VBA bouton AnnulerModifier une feuille Excel dans VBA
macro excelRemplir questionnaire java avec macro excel
Matcher des séries dans EXCEL (VBA)Code VBA qui plante pour majuscules
Macro excelCode couleur en VBA (boutons etc)
Macro pour copier le contenu d'un document excel vers un autreVBA importation fichiers TXT
Plus de sujets relatifs à : Intégrer une dll en c++ dans une macro VBA


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR