Ecrire un composant COM en .NET est relativement simple, pour peu que l’on n’essaie pas de faire des sp??cialit??s.
Il y a n??anmoins quelques petites choses ?? se rem??morer si l’on veut ??viter de perdre un temps pr??cieux, et une de celles-ci concerne les tableaux. Imaginons que nous voulions ??crire un composant COM en .NET, utilisable depuis le code VBA d’une feuille Excel. Le code pourrait ??tre :
Public Sub mySub
Dim myArray() as Double
ReDim myArray(1 to 10) as Double
Dim comObject As myCOMObject
for i = 1 to 10
myArray(i) = i
next i
Set comObject = New myCOMObject
myCOMObject.MyMethod(myArray)
Set comObject = Nothing
End Sub
Si vous ex??cutez ce code, une exception sera lev??e :
System.IndexOutOfRangeException: Index was outside the bounds of the array.
Ce qu’il faut savoir, c’est que sauf sur mention explicite avec la clause Option Base, les tableaux VBA sont index??s ?? partir de 0. Or, dans notre cas o?? l’on veut red??finir la taille du tableau myArray, il faut se veiller ?? ne pas indiquer la borne inf??rieure, et ainsi la laisser ?? 0.
Du c??t?? du composant COM, les valeurs sont bien entendus disponible ?? partir de l’indice 1. Ne pas essayer de lire les valeurs ?? l’indice 0 :
Double [] myLocalArray = new Double[myReceivedArray.GetLength(0)];
for(int i = 1; i <= 10; i++)
{
myLocalArray[i] = myReceivedArray[i];
}
Writing a .NET COM component is fairly simple. As far as we do not try to do specialties. There are come little tricks to remember before spending lot of time. One of them is the arrays. Let’s write a .NET COM component that should be used from a VBA code of an Excel sheet. The code could be :
Public Sub mySub
Dim myArray() as Double
ReDim myArray(1 to 10) as Double
Dim comObject As myCOMObject
for i = 1 to 10
myArray(i) = i
next i
Set comObject = New myCOMObject
myCOMObject.MyMethod(myArray)
Set comObject = Nothing
End Sub
If you run this code, an exception will raise :
System.IndexOutOfRangeException: Index was outside the bounds of the array.
What is important to know about is that VB defines arrays using a 0-based indexes unless you specify the Option Base clause. In that case, I redefined the myArray size, but I had to not specify the lower-bound, letting that bound to 0.
On the COM component side, values are available only from the second cell (index equal to 1). Do not try to read the cell with index 0 :
Double [] myLocalArray = new Double[myReceivedArray.GetLength(0)];
for(int i = 1; i <= 10; i++)
{
myLocalArray[i] = myReceivedArray[i];
}
0 Comments