Fonction VBA et variables de sortie

Bonjour

Je voudrais savoir comment on peut faire sortir 2 résultats de calculs dans une fonction. Par exemple j'ai une fonction calcul

Function calcul(a As Double, b As Double, c As Double) As Double
Dim res1 As Double
res1 = a - c
calcul = a + b
End Function
quel moyen a-t-on de faire sortir de la fonction le résultat res1 dans une variable qui serait utilisé dans un autre endroit d'un programme plus globale ?
j'ai vu un programme en delphi ou il est déclaré une variable type structure dans laquelle se trouve une variable res. Il passe ensuite le résultat res1 dans la variable res en déclarant la fonction ainsi : Function calcul (a,b,c : double ; var res :double) : double;
Pourriez-vous m'aider ?
Merci par avance

Bonjour,

Une fonction est typée. Elle doit renvoyer un "résultat" correspondant à son type défini, sachant que le type par défaut est Variant.

Dans une fonction de type Double, on doit renvoyer un nombre réel. Dans une fonction de type Object, on renvoie un objet (instruction Set à inclure).

Pour renvoyer plusieurs résultats en une seule fonction, il faut une fonction de type Variant et renvoyer un array, à moins de choisir un objet, une collection par exemple, dans les cas où on cherche à coupler et "uniciser" des résultats (clé+item), mais c'est déjà plus lourd.

Exemple :

function Test(a as double, b as double, c as double) as Variant
dim t(1 to 2)
t(1) = a - c
t(2) = a + b
Test = t
end function

La fonction Test renvoie donc un tableau monodimensionnel à 2 éléments. Ce tableau peut être stocké dans une variable de type Variant déclarée sur la procédure principale et utilisé à souhait (en lecture comme en écriture)...

Sinon, en VBA, il est possible d'utiliser des variables dites publiques, à déclarer ainsi ;

Public Mavar as double

en tête d'un module standard.

Mais les cas où cette option est la meilleure sont assez rares.

Cdlt,

Bonjour

J'utilise une deuxième sortie dans la pile en utilisant ByRef (passage de valeur par référence, cad par adresse, c'est l'appelant qui réserve la zone de stockage de la variable équivalente à res1)

Function calcul(a As Double, b As Double, c As Double, ByRef res1 As Double) As Double
res1 = a - c
calcul = a + b
End Function

Merci à vous deux,

la solution 3GB me paraît facile à comprendre

par contre pour la solution de scraper qui semble correspondre à ce que j'ai vu en delphi j'ai 2 question :

1) je croyais que par défaut quand on écrivait Function calcul (a as double, b as double) as double VBA comprenait par défaut

Function calcul (Byref a as double, ByRef b as double) as double. C'est faux ou pas ?

2

quand on déclare :

Function calcul(a As Double, b As Double, c As Double, ByRef res1 As Double) As Double
res1 = a - c
calcul = a + b
End Function

comment on applique la fonction calcul et on utilise l'argument res1 dans le programme principale puisque res1 est calculé dans la fonction

on fait calcul (a,b,res1) ou il faut donner une valeur à res1 en écrivant calcul (a,b,0) en ayant déclarer res1 comme une variable globale ?

et notamment quand on appelle la fonction dans une feuille excel comment on écrit la fonction dans la cellule ?

merci pour la réactivité en tout cas

on a le choix pour avoir le resultat comme formule matricielle ou résultat individuel

7fulgar.xlsb (22.59 Ko)

évidemment l'administrateur réseau m'interdit d'ouvrir le fichier. Je vais regarder cela chez moi sur mon PC perso

En tout cas le forum est très réactif j'avance à grand pas.

merci pour le fichier BsAlv.

bonjour,

la partie VBA :

Function Calcul(a As Double, b As Double, c As Double, d As Double)
     'Application.Volatile
     Dim aOut(1 To 6)
     aOut(1) = a + b
     aOut(2) = a + c
     aOut(3) = a + d
     aOut(4) = b + c
     aOut(5) = b + d
     aOut(6) = c + d
     Calcul = aOut
End Function

Sub TESTE_VBA()
     aa = Calcul(10, 20, 30, 40)
     MsgBox "les resultat : " & Join(aa) & vbLf & vbLf & Join(aa, vbLf)

     MsgBox "a+d = " & Calcul(10, 20, 30, 40)(3)

End Sub

Bonjour à tous,

"1) je croyais que par défaut quand on écrivait Function calcul (a as double, b as double) as double VBA comprenait par défaut

Function calcul (Byref a as double, ByRef b as double) as double. C'est faux ou pas ?"

>>> Oui, en effet, je crois que ByRef est le mode de transmission par défaut. Parfois, on explicite seulement pour mettre en évidence.

2

quand on déclare :

Function calcul(a As Double, b As Double, c As Double, ByRef res1 As Double) As Double
res1 = a - c
calcul = a + b
End Function

comment on applique la fonction calcul et on utilise l'argument res1 dans le programme principale puisque res1 est calculé dans la fonction

on fait calcul (a,b,res1) ou il faut donner une valeur à res1 en écrivant calcul (a,b,0) en ayant déclarer res1 comme une variable globale ?

>>> Ici, dans la fonction, res1 est destiné à l'écriture, à ce qu'on lui affecte un résultat. Il n'est pas passé en lecture comme les arguments classiques.

3 ) et notamment quand on appelle la fonction dans une feuille excel comment on écrit la fonction dans la cellule ?

>>> Sur la feuille excel, impossible d'utiliser res1 (en tout cas aisément).

Avec la fonction de type Variant, on a une fonction personnalisée qui renvoie une matrice.

=Calcul(A1,B1,C1) '>>> renvoie {3;6} par exemple

On peut alors facilement choisir l'élément qui nous intéresse :

=INDEX(Calcul(A1,B1,C1);2) '>>> renvoie 6

Cdlt,

Merci pour vos réponses je vais essayer de digérer ces informations

Bonjour à tous,

Une autre méthode utilisant un index qui désigne le résultat souhaité:

Function calcul(a#, b#, c#, IndexResultat&)
   Select Case IndexResultat
      Case 1: calcul = a - c
      Case 2: calcul = a + b
      Case 3: calcul = a * b / c
      Case Else: calcul = CVErr(xlErrRef)
   End Select
End Function

Bonsoir à tous

Merci pour votre aide, je viens de tester la méthode très simple de mafraise qui semble correspondre à ce que souhaitait faire
merci à tous

Bonjour à tous,

"1) je croyais que par défaut quand on écrivait Function calcul (a as double, b as double) as double VBA comprenait par défaut

Function calcul (Byref a as double, ByRef b as double) as double. C'est faux ou pas ?"

>>> Oui, en effet, je crois que ByRef est le mode de transmission par défaut. Parfois, on explicite seulement pour mettre en évidence.

avec une exception.
Si c'est une cellule (ou plage) qui est passée, c'est ByVal par défaut.
Une fonction ne doit pas pouvoir modifier une autre cellule que celle depuis laquelle elle est appelée.
eric

Rechercher des sujets similaires à "fonction vba variables sortie"