Vous êtes sur la page 1sur 13

Intgration de code C++ et C dans Excel

Crer une DLL


Pour crer une nouvelle librairie dynamique, il faut :
Crer un projet C++, avec type DLL
Inclure le projet dans une solution
Pour accder aux fonction de la DLL il faut connatre le

nom sous lequel elles sont exportes : linterface de la


DLL.
Excel ne peut accder que des fonction qui traitent
des paramtres et retourne des valeurs de types
reconnus.
Excel ne peut pas accder directement des classes.

Vrifier linterface dune DLL avec


Dependency walker

Arborescence
de dpendances
Interface

Hello World en Excel/C++


Fichier HelloWorld.cpp
#include <wtypes.h>
#include <string.h>
BSTR __stdcall cHello(void)
{
char *mess="Hello World";
BSTR ret=SysAllocStringByteLen(mess,strlen(mess));
return ret;
}

Dfinition de linterface
Fichier HelloWorld.def

LIBRARYHelloWorld
EXPORTS
cHello

Instruction Declare en VBA


Le code C++ doit tre compil et distribu dans une

librairie dynamique (DLL).


On ne peut accder que aux fonctions qui ont t
exportes par le crateur de la DLL.
Declare Function cHello Lib "HelloWorld.dll" () As String
Function Hello() As String
Hello = cHello()
End Function

Passage de paramtres
On peut passer des donnes entre VBA et C++. Si une

variable est passe ByRef depuis VBA, alors en C++ le


paramtre correspondant doit tre dclar comme
pointeur.
On peut passer un array de VBA vers C++ en passant
par rfrence le premier lment dun tableau de taille
suffisante.
On peut aussi utiliser le type Variant de VBA et y
inclure un tableau.

quivalence de Types
VBA

C++

Byte

unsigned char

Boolean

[signed] short

Integer

[signed] [long] int

Currency

CY (type de <wtypes.h>

Single

float

Double

double

Date

double
DATE (type de <wtypes.h>

String

BSTR (type de <wtypes.h>

Variant

VARIANT (type de <oaidl.h>

Instruction Declare sous VBA


Pour accder une fonction C++ dans VBA on utilise

linstruction Declare.
Deux syntaxes:
[Public|Private] Declare Sub name Lib libname [Alias

aliasname][([arglist])]
[Public|Private] Declare Function name Lib libname
[Alias aliasname] [([arglist])] [As Type]

Interface sans fichier def


On peut exporter des fonctions dune DLL sans avoir

recours un fichier def.


Il est impratif de prcder chaque fonction dune
directive
__declspec(dllexport)

Il est conseill de dbrancher la dcoration C++ en

utilisant la directive :
extern "C"

Appel dune DLL sans def depuis


VBA
Deux possibilites:
Reprer le nom dcor laide de Dependecy Walker.
Reprer lordinal.
' Fonction declaree par ordinal
Declare Function Get_nprime Lib "excel_demo.dll" Alias "#2" _
(ByVal n&) As Integer
' subroutine declaree par nom
Declare Sub Get_allprime Lib "excel_demo.dll" Alias "_all_prime@12" _
(ByVal n&, ByRef sz&, ByRef pr_list&)

Ordinal et nom dcor

Nom
Ordinal
dcor

Vous aimerez peut-être aussi