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

Macros et VBA Excel Discussion :

renvoi de valeurs par référence en VBA [XL-2000]


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2011
    Messages : 39
    Points : 27
    Points
    27
    Par défaut renvoi de valeurs par référence en VBA
    Bonjour à tou(te)s,

    J'ai une DLL contenant une fonction que je voudrais utiliser dans Excel. Ladite fonction renvoie plusieurs valeurs et utilise donc des références :

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    void A2_Aff_lineique(real_T freq, real_T T, real_T ro, real_T p, real_T *Aff_tot,real_T *Aff_02, real_T *Aff_H20)

    Mon problème est que je ne sais pas comment on déclare et on utilise ce genre de fonction...

    J'étais bien tenté d'écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Declare Function Aff_Gaz Lib "DLL_Affaiblissement2" Alias "_A2_Aff_lineique" (ByVal freq As Double, ByVal T As Double, ByVal ro As Double, ByVal p As Double, ByRef Aff_tot As Long, ByRef Aff_02 As Long, ByRef Aff_H20 As Long)
    mais ça ne marche pas ! En effet, cette fonction ne renvoie rien, et je ne sais même quoi lui fournir pour les trois derniers arguments qui sont définis par référence...(les quatre premiers paramètres étant saisies dans différentes cellules par l'utilisateur).

    Si vous avez des conseils ou des éclaircissements à m'apporter, je suis preneur !!

    Merci d'avance

  2. #2
    Membre éprouvé Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 665
    Points : 929
    Points
    929
    Par défaut
    Bonsoir,

    Bon je n'y connais pas grand chose en DLL mais d'après ta déclaration (en C++?)
    essaie peut être ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Declare Sub Aff_Gaz Lib "DLL_Affaiblissement2" Alias "A2_Aff_lineique" (ByVal freq As Double, ByVal T As Double, ByVal ro As Double, ByVal p As Double, ByRef Aff_tot As Double, ByRef Aff_02 As Double, ByRef Aff_H20 As Double)
    les modifs:
    • Sub car ta fonction (procédure) ne renvoie rien.
    • Type double pour les 3 derniers arguments: Ce sont des pointeurs sur des variables de même "type" (real_T) que celles que tu as déclarées en double, pourquoi les passer en long?
    • Une dernière chose: ton alias ne correspond pas à ton nom de fonction : un _ au début en plus.


    J'espère que ça débroussailleras un peu le terrain.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2011
    Messages : 39
    Points : 27
    Points
    27
    Par défaut
    Merci pour ta réponse.

    Quelques précisions :

    - La fonction, telle qu'elle est définie, ne semble rien renvoyer mais en fait les trois derniers arguments correspondent aux adresses des trois résultats que doit donner la fonction (c'est ainsi qu'on gère le renvoi de valeurs multiples en C/C++)

    - En ce qui concerne les types Long à la place de Double, je ne sais pas ce qu'il m'a pris, c'est une erreur bête

    - pour mon Alias, le _ devant le nom n'est pas une erreur, c'est ainsi que le nom de ma fonction a été "décoré" lors de la création de la dll par Visual Studio

    Je vais creuser dans le sens de tes conseils...

  4. #4
    Membre éprouvé Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 665
    Points : 929
    Points
    929
    Par défaut
    La fonction, telle qu'elle est définie, ne semble rien renvoyer mais en fait les trois derniers arguments correspondent aux adresses des trois résultats que doit donner la fonction (c'est ainsi qu'on gère le renvoi de valeurs multiples en C/C++)
    donc il faut bien que tu la déclares en sub et que tu passes tes 3 derniers arguments par référence (byref)

    Tiens moi au courant ça m’intéresse.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2011
    Messages : 39
    Points : 27
    Points
    27
    Par défaut
    Bon, j'ai avancé sur le sujet mais ça coince encore...

    Tout d'abord pour me faciliter la vie, j'ai modifié (à contre cœur) mon code C :

    ma fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void A2_Aff_lineique(real_T freq, real_T T, real_T ro, real_T p, real_T *Aff_tot,real_T *Aff_02, real_T *Aff_H20)

    est devenue


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int A2_Aff_lineique(real_T freq, real_T T, real_T ro, real_T p, real_T *Aff_tot,real_T *Aff_02, real_T *Aff_H20)
    et renvoie 1 (simplement pour pouvoir l'appeler plus aisément en VBA, je ne sais pas si c'est une bonne idée mais je n'en ai plus d'autre...)

    J'ai donc maintenant dans mon code VBA :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Declare Function Aff_Gaz Lib "DLL_Affaiblissement2" Alias "_A2_Aff_lineique" (ByVal freq As Double, ByVal T As Double, ByVal ro As Double, ByVal p As Double, ByRef Aff_tot As Double, ByRef Aff_02 As Double, ByRef Aff_H20 As Double) As Integer
     
    Dim Aff_tot As Double, Aff_H20 As Double, Aff_02 As Double
     
    Function Affaiblissement_Gaz(ByVal freq As Double, ByVal T As Double, ByVal ro As Double, ByVal p As Double) As Double
     
        y = Aff_Gaz(freq, T, ro, p, Aff_tot, Aff_02, Aff_H20)
     
        Affaiblissement_Gaz = Aff_tot
     
    End Function


    Et lorsque je saisis les valeurs des différents paramètres dans les cellules et que je tape la commande =Affaiblissement_Gaz(B2;B3;B4;B5) dans la case Excel destinée au résultat j'obtiens #VALEUR!.

    Avez-vous une idée du problème ?
    Merci d'avance !!


    P.S :
    Ça, c'est pour récupérer une seule des trois valeurs qui m'intéressent. Quand j'y serai parvenu (je ne désespère pas), on m'a conseillé la stratégie suivante pour récupérer les différentes valeurs souhaitées :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Public Type Aff
        Aff_tot As Double
        Aff_02 As Double
        Aff_H20 As Double
    End Type


    et dans la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Aff.Aff_tot=...
    Aff.Aff_02=...
    Aff.Aff_H20=...

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2011
    Messages : 39
    Points : 27
    Points
    27
    Par défaut
    Bon, ça y est ça fonctionne !
    Le problème n'est (en général) pas là où on regarde... Dans mon cas c'était dans le code C que l'export de la fonction vers la DLL était mal fait.

    Pour en finir avec ce sujet, et issoram puisque ça t'intéresse voilà comment j'ai codé en VBA mon appel à la fonction de la DLL (en remettant ma fonction en C dans son état initial, c'est à dire qui sort un type void) et le renvoi des différentes valeurs (ça fait un peu "bricolage" mais j'ai pas trouvé mieux...).


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    'definition du nouveau type
    Public Type Aff
        A_tot As Double
        A_02 As Double
        A_H20 As Double
    End Type
     
    'declaration de la fonction contenue dans la DLL comme une Sub car elle ne renvoie rien
    Declare Sub Aff_Gaz Lib "DLL_Affaiblissement2" Alias "_A2_Aff_lineique@44" (ByVal freq As Double, ByVal T As Double, ByVal ro As Double, ByVal p As Double, ByRef Aff_tot As Double, ByRef Aff_02 As Double, ByRef Aff_H20 As Double)
     
    'declaration des variables destinées à recevoir les resultats ainsi que la variable "intermédiaire" A_Gaz
    Dim Aff_tot As Double, Aff_H20 As Double, Aff_02 As Double, A_Gaz As Aff
     
     
    'définition de la fonction principale faisant le calcul à partir des paramètres entrés
    Public Function Affaiblissement_Gaz(ByVal freq As Double, ByVal T As Double, ByVal ro As Double, ByVal p As Double) As Aff
     
        Call Aff_Gaz(freq, T, ro, p, Aff_tot, Aff_02, Aff_H20)
     
        Affaiblissement_Gaz.A_tot = Aff_tot
        Affaiblissement_Gaz.A_02 = Aff_02
        Affaiblissement_Gaz.A_H20 = Aff_H20
     
    End Function
     
     
    'définition de trois sous-fonctions retournant chacune un des trois sous-résultats
    Public Function Affaiblissement_total(ByVal freq As Double, ByVal T As Double, ByVal ro As Double, ByVal p As Double) As Double
     
        A_Gaz = Affaiblissement_Gaz(freq, T, ro, p)
     
        Affaiblissement_total = A_Gaz.A_tot
     
     
     
    End Function
     
    Public Function Affaiblissement_02(ByVal freq As Double, ByVal T As Double, ByVal ro As Double, ByVal p As Double) As Double
     
        A_Gaz = Affaiblissement_Gaz(freq, T, ro, p)
     
     
        Affaiblissement_02 = A_Gaz.A_02
     
     
    End Function
     
    Public Function Affaiblissement_H20(ByVal freq As Double, ByVal T As Double, ByVal ro As Double, ByVal p As Double) As Double
     
        A_Gaz = Affaiblissement_Gaz(freq, T, ro, p)
     
        Affaiblissement_H20 = A_Gaz.A_H20
     
    End Function

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2007] Définir valeur par défaut avec VBA
    Par legaramir dans le forum VBA Access
    Réponses: 13
    Dernier message: 31/05/2013, 12h13
  2. [PHP 5.0] Appliquer une fonction à plusieurs valeurs par référence
    Par gui80 dans le forum Langage
    Réponses: 12
    Dernier message: 09/03/2010, 13h42
  3. valeur par defaut en vba
    Par Invité dans le forum VBA Access
    Réponses: 1
    Dernier message: 21/11/2007, 09h32
  4. Valeur par defaut a partir d'une variable vba ?
    Par Alpha31 dans le forum Access
    Réponses: 2
    Dernier message: 06/06/2006, 16h00
  5. [VBA-A] Valeur par défaut
    Par chetflo dans le forum IHM
    Réponses: 5
    Dernier message: 22/12/2005, 13h22

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