XL 2016 Fonction qui renvoie 2 valeurs

djiska

XLDnaute Junior
Bonjour
j'aimerai savoir comment coder une fonction qui renvoie deux valeurs.

par exemple;

Je voudrai que ma fonction reçoive 4 paramètres (x1,x2,y1,y2) et me retourne a,b que je calcule grâce aux paramètres passés

public function Deuxvaleurs(byval x1,x2,y1,y2) as double

je calcule a et b
a= ...............
b= ...........

Ma question :
si la fonction ne tournait qu'une valeur on aurait fait : Deuxvaleurs= valeur de retour
Comment faire dans le cas ou on a deux valeurs de retour , sans pour autant créer un nouveau TYPE ??

Merci
 

job75

XLDnaute Barbatruc
Bonsoir djiska,

Par exemple :
VB:
Function Deuxvaleurs(ByVal x1#, x2#, x3#, x4#)
Dim a(1 To 2)
a(1) = x1 + x2 + x3 + x4
a(2) = x1 * x2 * x3 * x4
Deuxvaleurs = a 'vecteur ligne
End Function
A+
 

Pièces jointes

  • DeuxValeurs(1).xlsm
    15 KB · Affichages: 10

jmfmarques

XLDnaute Accro
Bonjour
sans pour autant créer un nouveau TYPE ??
1) L'utilisation d'un type personnalisé est pourtant, en l'occurrence, ce qu'il y a de plus orthodoxe et ce : à divers titres (dont le nommage plus convivial de chacune des deux variables)
2) refuser un type personnalisé juste pour le "plaisir" de le refuser, je choisirais alors personnellement d'utiliser une simple routine en lieu et place d'une fonction et passerais par référence à cette routine mes deux variables, que je pourrais en outre nommer comme je l'entends et typer également comme je l'entends (y compris de types différents).
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour tout le monde,
Une autre approche peut être plus simple à l'écriture est de passer le choix en paramètre :
VB:
Function Deuxvaleurs(ByVal x1#, x2#, x3#, x4#, Choix As Boolean)
If Choix = 0 Then
    Deuxvaleurs = x1 + x2 + x3 + x4
Else
    Deuxvaleurs = x1 * x2 * x3 * x4
End If
End Function
Ainsi : =Deuxvaleurs(1;2;3;4;0) renvoie 10
et =Deuxvaleurs(1;2;3;4;1) renvoie 24
 

djiska

XLDnaute Junior
Bonjour tout le monde,
Une autre approche peut être plus simple à l'écriture est de passer le choix en paramètre :
VB:
Function Deuxvaleurs(ByVal x1#, x2#, x3#, x4#, Choix As Boolean)
If Choix = 0 Then
    Deuxvaleurs = x1 + x2 + x3 + x4
Else
    Deuxvaleurs = x1 * x2 * x3 * x4
End If
End Function
Ainsi : =Deuxvaleurs(1;2;3;4;0) renvoie 10
et =Deuxvaleurs(1;2;3;4;1) renvoie 24
Salut tout le monde
@ Sylvanu ,ne peut on pas le faire sans le boolean que tu as ajouté ?
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonsoir tout le monde,
Soit on passe par une matrice de retour et un index d'extraction, solution de Job, soit on passe par un paramètre qui renvoie que la valeur demandée comme ma proposition.
On peut aussi écrire deux fonctions qui chacune renvoie sa propre valeur.
Mais il y aura toujours un discriminant pour savoir quoi retourner. Tout dépend comment on veut choisir sa discrimination des résultats.
Le plus simple restant évidemment la double fonction qui simplifie le coté feuille.
VB:
Function AddPerso(ByVal x1#, x2#, x3#, x4#)
    Deuxvaleurs = x1 + x2 + x3 + x4
End Function
Function MultPerso(ByVal x1#, x2#, x3#, x4#)
    Deuxvaleurs = x1 * x2 * x3 * x4
End Function
 

jmfmarques

XLDnaute Accro
Bon
illustrons ce que j'exposais plus haut (mon message #3), en utilisant une simple routine :
VB:
Private Sub CommandButton1_Click()
  Dim surface As Double, forme As String, largeur As Double, hauteur As Double
  largeur = 23
  hauteur = 10
  titi largeur, hauteur, surface, forme
  MsgBox surface & vbCrLf & forme
End Sub

Private Sub titi(ByVal L As Double, ByVal H As Double, ByRef v1 As Double, ByRef v2 As String)
  v1 = L * H
  v2 = "carré"
  If L <> H Then v2 = "rectangle"
End Sub

(ce qui ne veut absolument pas dire que l'utilisation d'un type personnalisé ne serait pas préférable)
 

djiska

XLDnaute Junior
Bon
illustrons ce que j'exposais plus haut (mon message #3), en utilisant une simple routine :
VB:
Private Sub CommandButton1_Click()
  Dim surface As Double, forme As String, largeur As Double, hauteur As Double
  largeur = 23
  hauteur = 10
  titi largeur, hauteur, surface, forme
  MsgBox surface & vbCrLf & forme
End Sub

Private Sub titi(ByVal L As Double, ByVal H As Double, ByRef v1 As Double, ByRef v2 As String)
  v1 = L * H
  v2 = "carré"
  If L <> H Then v2 = "rectangle"
End Sub

(ce qui ne veut absolument pas dire que l'utilisation d'un type personnalisé ne serait pas préférable)
Merci Tres interressant cette methode avec une procedure
 

Discussions similaires

Statistiques des forums

Discussions
312 348
Messages
2 087 508
Membres
103 568
dernier inscrit
NoS