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 :

Fonction qui retourne deux valeurs [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Inscrit en
    Janvier 2010
    Messages
    252
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 252
    Points : 125
    Points
    125
    Par défaut Fonction qui retourne deux valeurs
    Bonjour a tous
    J’ai ecrit la function ci-dessous qui retourne dans un ARRAY a la fois l’addition et la soustraction des deux variables numeriques qu’elle recoit. Cela marche tres bien.
    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
    Public Function fctPlusMinus(dblA As Double, dblB As Double) As Variant
    'Cette fonction retourne l'addiotion et la soustraction de deux valeurs dans un Array.
     
     
        Dim arrTemp() As Double  'Array dynamique
        ReDim arrTemp(1 To 1, 1 To 2) As Double
     
        'Calculer les valeurs a retourner
        arrTemp(1, 1) = dblA + dblB  '<== l'addition
     
        arrTemp(1, 2) = dblA - dblB  '<== la soustraction
     
        'Attribuer les resultats a un Array
        fctPlusMinus = arrTemp
     
    End Function
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub Call_fctPlusMinus()
    'Tester la fonction ci-dessus.
     
        Debug.Print fctPlusMinus(12, 5)(1, 1)  '=> 17  OK
     
        Debug.Print fctPlusMinus(12, 5)(1, 2) '=> 7 OK
     
    End Sub
    Mais j’ai entendu dire qu’on peut obtenir le meme resultat en passant par les deux moyens suivants:
    1=>>Creation de module de classe
    2==>Utilisation de ByRef pour les arguments

    Je ne vois pas comment cela peut se faire. Pouvez-vous svp m’aider a reproduire la meme function (qui retourne l’addition et la soustraction) en utilisant les 2 methodes mentionnees ci-dessus ?
    Cordialement.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 652
    Points : 1 219
    Points
    1 219
    Par défaut
    Bonjour,

    Sans passer par une Classe, un exemple utilisant une variable définie par l'utilisateur (ce qui laisse entendre qu'on peut utiliser une classe)
    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
    Type structRetour
      Addition As Double
      Soustraction As Double
    End Type
     
    Public Function fctPlusMinus(dblA As Double, dblB As Double) As structRetour
    'Cette fonction retourne l'addition et la soustraction de deux valeurs dans une variable définie par l'utilisateur (structRetour)
    Dim Retour As structRetour
     
    'Calculer les valeurs à retourner
    Retour.Addition = dblA + dblB  '<== l'addition
    Retour.Soustraction = dblA - dblB   '<== la soustraction
     
    'Attribuer les resultats à la variable de retour
    fctPlusMinus = Retour
     
    End Function
     
    Sub Call_fctPlusMinus()
    'Tester la fonction ci-dessus.
    Debug.Print fctPlusMinus(12, 5).Addition
    Debug.Print fctPlusMinus(12, 5).Soustraction
    End Sub

  3. #3
    Membre habitué
    Inscrit en
    Janvier 2010
    Messages
    252
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 252
    Points : 125
    Points
    125
    Par défaut
    Bonjour et merci pour ta reponse dont je me suis inspire pour obtenir le meme resultat en utilisant cette foisci un module de classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    'Ma classe s'appele clsFctPlusMinus.
    'Elle possede deux fonctions (Plus et Minus) qui calculent l'addition et la soustraction respectivement.
    Public Function Plus(dblA As Double, dblB As Double) As Double
          Plus = dblA + dblB
    End Function
    Public Function Minus(dblA As Double, dblB As Double) As Double
          Minus = dblA - dblB
    End Function
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub call_Tester_clsFctPlusMinus()
    'Ma classe s'appele clsFctPlusMinus.
    'Elle possede deux fonctions (Plus et Minus) qui calculent l'addition et la soustraction respectivement.
     
        'Ma variable porte le meme nom que la classe dont elle est issue.. _
        je croyais que ca allait poser un probleme , mais non !!!
        Dim clsFctPlusMinus As clsFctPlusMinus
        Set clsFctPlusMinus = New clsFctPlusMinus
     
        'Appeler des fonctions Plus et Minus.
        Debug.Print clsFctPlusMinus.Plus(12, 5) '<== l'addition
        Debug.Print clsFctPlusMinus.Minus(12, 5) '<== la soustraction
     
    End Sub
    Donc je reviens a mon premier message pour vous demander comment on peut passer par BYREF pour qu’une function retourne deux valeurs ?

  4. #4
    Inactif  
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    1 733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 1 733
    Points : 2 553
    Points
    2 553
    Par défaut
    Une fonction ne retourne qu'une seule variable

    Cette variable peut être un tableau.

    Si tu veux utiliser un module de classe il te suffira de créer une classe qui elle aura un plus et un moins et du coup du stockeras les deux. Il te suffira d'appeler la classe pour avoir les deux. Ce qui revient à un tableau.

    Pour tes byref pas compris ta question, dans ton exemple ta fonction reçoit ses arguments byref qui est l'option par défaut... En effet le Byval ne te permettrait pas de modifier leurs valeurs

  5. #5
    Invité
    Invité(e)
    Par défaut
    Un module nommé "Maths" qui aurait une fonction "Minus" déclaré en public pourrai s'appeler:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Msgbox Maths.Minus(10,15)
    msgbox Maths.Plus(15,50)
    Plus simplement ? Le Math est déjà pris par le VBA.
    modFctPlusMinus pour les 2 fonctions, mais ça ne dérangerai pas d'avoir 100 modules dans un Addin.

  6. #6
    Membre habitué
    Inscrit en
    Janvier 2010
    Messages
    252
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 252
    Points : 125
    Points
    125
    Par défaut
    merci a tous pour vos reponses.
    je suis a mes debuts en matiere de module de classes.

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 652
    Points : 1 219
    Points
    1 219
    Par défaut
    Bonjour,

    Je cite EngueEngue
    ta fonction reçoit ses arguments byref qui est l'option par défaut...
    ***********

    Pour la question du tableau examinez le code suivant (j'y ai inclus une Enumération mais on peut s'en passer)

    Module de Classe
    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
    Public Enum ChoixCalcul
      Additon = 1
      Soustraction = 2
      Produit = 3
      division = 4
      [_count] = 4
    End Enum
     
    Public Function Calculs(dblA As Double, dblB As Double) As Variant
    Dim T(1 To ChoixCalcul.[_count]) '[_Count] est le nombre d'items de l'énumération ChoixCalcul
    T(ChoixCalcul.Additon) = dblA + dblB
    T(ChoixCalcul.Soustraction) = dblA - dblB
    '--- D'autres calculs ---
    T(ChoixCalcul.Produit) = dblA * dblB
    T(ChoixCalcul.division) = dblA / dblB
    Calculs = T
    End Function
    Module standard
    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
    Sub call_Tester_clsFctPlusMinus()
    Dim clsFctPlusMinus As clsFctPlusMinus
    Set clsFctPlusMinus = New clsFctPlusMinus
     
    '--- On affiche tous les résultats dans la fenêtre Exécution ---
    Dim i&
    For i = 1 To ChoixCalcul.[_count] '[_Count] est le nombre d'items de l'énumération ChoixCalcul
      Debug.Print clsFctPlusMinus.Calculs(12, 5)(i)
    Next i
     
    '--- on affiche que 2 résultats dans une MsgBox ---
    MsgBox "Soustraction " & clsFctPlusMinus.Calculs(12, 5)(ChoixCalcul.Soustraction) & vbCrLf & _
           "Division " & clsFctPlusMinus.Calculs(12, 5)(ChoixCalcul.division)
    End Sub
     
     
    Sub AutreManiereDansUnVariant()
    Dim clsFctPlusMinus As clsFctPlusMinus
    Set clsFctPlusMinus = New clsFctPlusMinus
     
    Dim var As Variant
    var = clsFctPlusMinus.Calculs(12, 5)
     
    '--- On affiche tous les résultats dans la fenêtre Exécution ---
    Dim i&
    For i = 1 To UBound(var)
      Debug.Print var(i)
    Next i
     
    '--- on affiche que 2 résultats dans une MsgBox ---
    MsgBox "Soustraction " & var(ChoixCalcul.Soustraction) & vbCrLf & _
           "Division " & var(ChoixCalcul.division)
    End Sub
    Bon courage et à plus.

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

Discussions similaires

  1. Fonction qui retourne plusieurs valeurs !
    Par casafa dans le forum C++
    Réponses: 20
    Dernier message: 23/04/2014, 16h56
  2. un fonction qui retourne une valeur aléatoire
    Par houwa dans le forum Bibliothèques
    Réponses: 2
    Dernier message: 02/03/2008, 20h27
  3. Réponses: 8
    Dernier message: 24/10/2006, 16h50
  4. [debutant] fonction qui retourne une valeur
    Par arnolpourri dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 15/06/2006, 09h29
  5. [PL/SQL] Fonction qui retourne plusieurs valeurs
    Par Loko dans le forum Oracle
    Réponses: 2
    Dernier message: 07/12/2004, 09h43

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