IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Discussion :

Comment passer en VBA l'adresse d'un tableau,en argument d'une fonction ?(d'1 dll C#)


Sujet :

VBA

  1. #1
    Candidat au Club
    Inscrit en
    Mai 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 5
    Points : 3
    Points
    3
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :

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

    "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

  2. #2
    Membre habitué
    Inscrit en
    Juillet 2005
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 141
    Points : 148
    Points
    148
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Declare Function transformTab Lib _
    "D:\FinanceLib\FinanceLib\bin\Debug\FinanceLib" _
    (ByRef monTab As Long, ByVal maxi As Long)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim i, tabVBA(1 To 5) As Long
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Call fi.transformTab(tabVBA(1), 5)
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Declare Function transformTab Lib _
    "D:\FinanceLib\FinanceLib\bin\Debug\FinanceLib" _
    (ByRef monTab() As Long, ByVal maxi As Long)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim i as long
    Dim tabVBA(5) As Long
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Call fi.transformTab(tabVBA(), 5)
    maintenant c'est juste des réflexions sur la défintion des tableaux
    rémi

  3. #3
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Déjà, si tu appelles une fonction, ta sub attend un résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    Function LaFonction(LeTableau)
    fonction dans laquelle on récupère les dimensions du tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    NbItem = Ubound(LeTableau)
    'ou
    For i = 0 to Ubound(LeTableau)
         '...
    Si ça peut t'aider...
    A+

  4. #4
    Candidat au Club
    Inscrit en
    Mai 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 5
    Points : 3
    Points
    3
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  5. #5
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    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... (?)

  6. #6
    Candidat au Club
    Inscrit en
    Mai 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 5
    Points : 3
    Points
    3
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  7. #7
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    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

  8. #8
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    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...

Discussions similaires

  1. passer un tableau en argument dans une fonction
    Par rogerio dans le forum Débuter
    Réponses: 6
    Dernier message: 30/10/2008, 12h15
  2. Comment passer un argument dans une fonction
    Par DeezerD dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 22/01/2008, 18h13
  3. Réponses: 1
    Dernier message: 03/05/2007, 07h49
  4. Réponses: 1
    Dernier message: 02/05/2007, 15h08
  5. Réponses: 17
    Dernier message: 24/11/2006, 18h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo