Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Général VBA
Général VBA Forum général VBA . Pour les logiciels spécifiques (Access, Excel, Word, ...), postez dans les bons sous forums.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/05/2007, 15h51   #1
Invité de passage
 
Inscription : mai 2007
Messages : 5
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 5
Points : 0
Points : 0
Par défaut Comment passer en VBA l'adresse d'un tableau,en argument d'une fonction ?(d'1 dll C#)

Bonjour tout le monde !

Mon titre n'est pas clair alors je m'explique:
J'ai ecris une petite fonction a titre d'exemple TRANSFORMTAB dans ma dll C# (dll qui sert de bibliotheques de sous-fonctions que j'appelle dans mon VBA) , ma fonction prend en argument l'adresse d'un tableau et sa taille, et rajoute 1000 à chacun de ses elements; => mais je n'arrive pas a utiliser ma fonction dans mon VBA excel ...

*************** CODE DLL
Code C :
1
2
3
4
5
6
7
8
9
       //public unsafe void transformTab(long* tab,long maxi)
 
        public void transformTab(long []monTab ,long maxi)
        {
            for (int i = 0; i < maxi; i++)
            {
                monTab[i] = i + 1000;
            }
        }


************** CODE VBA
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Private Declare Function transformTab Lib _
"D:\FinanceLib\FinanceLib\bin\Debug\FinanceLib" _
(ByRef monTab As Long, ByVal maxi As Long)
 
Private Sub CmdCsharp_Click()
 
    Dim i, tabVBA(1 To 5) As Long
    Dim fi As Object
    Set fi = CreateObject("FinanceLib.FinanceClass")
    For i = 1 To 5
        tabVBA(i) = i
    Next i
    Call fi.transformTab(tabVBA(1), 5)
End Sub
En apellant en argument juste le 1er element du tableau, VBA me met cette erreur :

Citation:
"call fi.transformTab(tabVBA(1), 5)"

ERREUR D'EXECUTION '5'
ARGUMENT OU APPEL DE PROCEDURE INCORRECT
Et en apellant en argument juste le nom du tableau comme adresse, VBA me met cette erreur :

Citation:
"call fi.transformTab(tabVBA, 5)"

ERREUR D'EXECUTION '13'
INCOMPATIBILITE DE TYPE
***********************************

Ma declaration par reference en VBA est-elle correcte ?
Ou bien faudrait-il changer mon code C# ?

Merci à tous pour vos remarques …

Russel
russel92 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2007, 16h09   #2
Membre habitué
 
Inscription : juillet 2005
Messages : 141
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 141
Points : 117
Points : 117
Bonjour,
justement je me posait cette question ce matin
j'ai pas du tout testé et je sais pas vraiment faire appel à une dll en C mais déja, je remplacerais ces différentes lignes :
Code :
1
2
3
Private Declare Function transformTab Lib _
"D:\FinanceLib\FinanceLib\bin\Debug\FinanceLib" _
(ByRef monTab As Long, ByVal maxi As Long)
Code :
Dim i, tabVBA(1 To 5) As Long
Code :
Call fi.transformTab(tabVBA(1), 5)
par
Code :
1
2
3
Private Declare Function transformTab Lib _
"D:\FinanceLib\FinanceLib\bin\Debug\FinanceLib" _
(ByRef monTab() As Long, ByVal maxi As Long)
Code :
1
2
Dim i as long
Dim tabVBA(5) As Long
Code :
Call fi.transformTab(tabVBA(), 5)
maintenant c'est juste des réflexions sur la défintion des tableaux
rémi
gruget est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2007, 16h11   #3
Inactif
 
Avatar de ouskel'n'or
 
Inscription : février 2005
Messages : 12 466
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 12 466
Points : 11 930
Points : 11 930
Déjà, si tu appelles une fonction, ta sub attend un résultat
Code :
Result = LaFonction(LeTableau)
Déjà, là tu as sans doute... (pt être même nécessairement) une erreur.
Ensuite, si, dans ta fonction, tu attends un tableau, je ne sais pas ce que dit le c++ mais en VBA, la fonction attend la variable tableau sans les dimensions.
Code :
Function LaFonction(LeTableau)
fonction dans laquelle on récupère les dimensions du tableau
Code :
1
2
3
4
NbItem = Ubound(LeTableau)
'ou
For i = 0 to Ubound(LeTableau)
     '...
Si ça peut t'aider...
A+
ouskel'n'or est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2007, 16h41   #4
Invité de passage
 
Inscription : mai 2007
Messages : 5
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 5
Points : 0
Points : 0
Par défaut argument tableau

Merci Gruget et Ouskel'n'or, j'ai essayé ce que vous avez dit, mais ca n'a rien changé ... :-(
Au fait ma dll n'est pas écrite en C ni en C++ mais en Csharp, elle contient d'autres fonctions simples (comme somme (long a,long b) par ex. qui marchent bien lorque je les appelle de la meme maniere dans VBA)
Le probleme reste de passer a tranformTab( ) un tableau de donnees sur lequel il va travailler ...
J'ai essaye ceci en Csharp: (je lui passe un objet en argument plutot qu'un tableau de long) :
Code c :
1
2
3
4
5
6
7
8
9
10
11
12
public object transformTab(ref object monTab, long maxi)
        {
            long[] tabLocal = monTab as long[];
 
            for (int i = 0; i < maxi; i++)
            {
               tabLocal[i] = i*2;
            }
 
            monTab = tabLocal;
            return monTab;
        }

et en VBA:
Code :
1
2
3
Private Declare Function transformTab Lib _
"D:\projets-Kingbo\FinanceLib\FinanceLib\bin\Debug\FinanceLib" _
(monTab As Object, ByVal maxi As Long) As Object
*************
mais ca bug toujours, avec la declaration proposée par Gruget, c'est idem ...

Merci si vous trouvez qq chose
russel92 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2007, 17h00   #5
Inactif
 
Avatar de ouskel'n'or
 
Inscription : février 2005
Messages : 12 466
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 12 466
Points : 11 930
Points : 11 930
A quoi te sert de créer un objet ? Tu ne peux pas simplement l'appeler avec ses paramètres ? La syntaxe de Gruget devrait alors fonctionner... (?)
ouskel'n'or est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2007, 11h34   #6
Invité de passage
 
Inscription : mai 2007
Messages : 5
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 5
Points : 0
Points : 0
Par défaut passer un tableau VBA à une fonction DLL c-sharp ??

Re-Bonjour, j'ai tjs le meme probleme pour passer mon tableau dim tab(1 to 5) as long à une fonction de ma DLL-Csharp qui va traiter le tableau ( par exemple en multipliant chaque element par 2)
Il parait qu'il y a un probleme de transtypage, que VBA stocke les adresses des tableaux en SAFEARRAY et le probleme c'est que je n'ai pas de SAFEARRAY en visual C#
Ouskel'n'or en passant juste l'adresse du tableau a la fonction il ne reconnait pas l'adresse , voila pourkoi il faudrait (peut etre ) encapsuler tout mon tableau dans un objet que j'enverrai à ma DLL C-sharp

**********CODE DLL C-SHARP :
Code c :
1
2
3
4
5
6
7
public void multTab(long []monTab ,long maxi)
        {
            for (int i = 0; i < maxi; i++)
            {
                monTab[i] = 2*monTab[i];
            }
        }


**********CODE VBA :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Private Declare Function transformTab Lib _
"D:\FinanceLib\FinanceLib\bin\Debug\FinanceLib" _
(ByRef monTab() As Long, ByVal maxi As Long)
 
Private Sub Cmd()
 
    Dim i, tabVBA(1 To 5) As Long
    Dim fi As Object
    Set fi = CreateObject("FinanceLib.FinanceClass")
    For i = 1 To 5
        tabVBA(i) = i
    Next i
    Call fi.multTab(tabVBA(), 5)
End Sub
russel92 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2007, 11h45   #7
Modérateur
 
Avatar de AlainTech
 
Homme Alain Gerard
Consultant informatique
Inscription : mai 2005
Messages : 3 676
Détails du profil
Informations personnelles :
Nom : Homme Alain Gerard
Âge : 58
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique
Secteur : Finance

Informations forums :
Inscription : mai 2005
Messages : 3 676
Points : 7 633
Points : 7 633
russel92,

Veux-tu bien utiliser les balises [code] quand tu postes du code?

Je n'ai pas envie de le faire pour toi à chaque fois.

Merci
__________________
N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
Pensez aussi à voter pour les réponses qui vous ont aidés.
------------
Je dois beaucoup de mes connaissances à mes erreurs!
AlainTech est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2007, 12h20   #8
Inactif
 
Avatar de ouskel'n'or
 
Inscription : février 2005
Messages : 12 466
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 12 466
Points : 11 930
Points : 11 930
Désolé mais je ne peux pas t'aider. Simplement une chose, "en principe", quand on fait appel à fonction, on attend quelque chose et ton call me gène.
Result = Lafonction me paraîtrait plus orthodoxe.
pour le reste, à part écrire ta fonction en VBA...
ouskel'n'or est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h32.


 
 
 
 
Partenaires

Hébergement Web