OVH Cloud OVH Cloud

Fonction retournant 2 valeurs

10 réponses
Avatar
Jean-Michel
Bonjour, comment je pourrai faire pour qu'une fonction me retourne deux
valeurs ?

Merci

10 réponses

Avatar
ng
Salut,

Plusieurs méthode :

1) Utilisation d'un type utilisateur :

'Dans un module :

Public Type tRetour
sValeur1 As String
lVal2 As Long
End Type

Public Function MultiRetVal1(sArg As String) As tRetour
MultiRetVal1.sValeur1 = sArg
MultiRetVal1.lVal2 = Len(sArg)
End Function

'Dans la form :
Private Sub Form_Load()
Dim Retour As tRetour
Retour = MultiRetVal1("Test !")

MsgBox Retour.sValeur1
MsgBox Retour.lVal2

End Sub


2) Mais le mieux est l'utilisation de *pointeurs* (passage d'une variable en
byref) :

Private Sub Form_Load()
Dim sRetVal As String, lRetVal As Long

Call MultiRetVal2("Test !", sRetVal, lRetVal)

MsgBox sRetVal
MsgBox lRetVal

End Sub

Public Sub MultiRetVal2(ByVal sArg As String, ByRef sValRetour1 As String,
ByRef lRetour2 As Long)
sValRetour1 = sArg
lRetour2 = Len(sArg)
End Sub

3) Ou si toutes les variables retour sont du même type, on peut imaginer
renvoyer un tableau...


Nicolas.
--
http://www.ngsoft-fr.com
"Jean-Michel" a écrit dans le
message de news:
Bonjour, comment je pourrai faire pour qu'une fonction me retourne deux
valeurs ?

Merci




Avatar
Jean-Michel
Merci beaucoup de ton aide :)

"ng" a écrit dans le message de
news:eO$
Salut,

Plusieurs méthode :

1) Utilisation d'un type utilisateur :

'Dans un module :

Public Type tRetour
sValeur1 As String
lVal2 As Long
End Type

Public Function MultiRetVal1(sArg As String) As tRetour
MultiRetVal1.sValeur1 = sArg
MultiRetVal1.lVal2 = Len(sArg)
End Function

'Dans la form :
Private Sub Form_Load()
Dim Retour As tRetour
Retour = MultiRetVal1("Test !")

MsgBox Retour.sValeur1
MsgBox Retour.lVal2

End Sub


2) Mais le mieux est l'utilisation de *pointeurs* (passage d'une variable


en
byref) :

Private Sub Form_Load()
Dim sRetVal As String, lRetVal As Long

Call MultiRetVal2("Test !", sRetVal, lRetVal)

MsgBox sRetVal
MsgBox lRetVal

End Sub

Public Sub MultiRetVal2(ByVal sArg As String, ByRef sValRetour1 As String,
ByRef lRetour2 As Long)
sValRetour1 = sArg
lRetour2 = Len(sArg)
End Sub

3) Ou si toutes les variables retour sont du même type, on peut imaginer
renvoyer un tableau...


Nicolas.
--
http://www.ngsoft-fr.com
"Jean-Michel" a écrit dans le
message de news:
> Bonjour, comment je pourrai faire pour qu'une fonction me retourne deux
> valeurs ?
>
> Merci
>
>




Avatar
Pierre Alexis [MVP]
Salut Jean-Michel,

Tu as écrit :

Bonjour, comment je pourrai faire pour qu'une fonction me retourne deux
valeurs ?



Ce que l'on fait généralement c'est passer les arguments par référence à la
fonction, ainsi la fonction que tu appelles va pouvoir modifier les paramètres
transmis. Exemple :

Private Sub Form_Load()

Dim Premier As String
Dim Deuxieme As String
Dim Troisieme As String

' La fonction va "remplir" les variables Premier, Deuxieme et Troisieme
Call GetPodiumTourDeFrance(Premier, Deuxieme, Troisieme)

MsgBox Premier
MsgBox Deuxieme
MsgBox Troisieme

End Sub

Private Sub GetPodiumTourDeFrance(ByRef PremierCoureur As String, ByRef
DeuxiemeCoureur As String, ByRef TroisiemeCoureur As String)

PremierCoureur = "Eddy Merckx"
DeuxiemeCoureur = "Laurent Jalaber"
TroisiemeCoureur = "Miguel Indurain"

End Function

Pour savoir ce que sont les arguments par référence (en oppostion aux
arguments par valeur) je te conseille cet article de la FAQ :

Question 23 - Quelle est la différence entre les mots-clés "ByVal" et "ByRef"
?
http://faq.vb.free.fr/index.php?question#

Autre solution, tu peux faire en sorte que ta classe retourne un type perso,
ou encore mieux une classe.

Exemple avec des types persos :

Private Type Podium
Premier As String
Deuxieme As String
Troisieme As String
End Type

Private Sub Form_Load()

Dim PodiumTourDeFrance As Podium

PodiumTourDeFrance = GetPodiumTourDeFrance()

MsgBox PodiumTourDeFrance.Premier
MsgBox PodiumTourDeFrance.Deuxieme
MsgBox PodiumTourDeFrance.Troisieme

End Sub

Private Function GetPodiumTourDeFrance() As Podium

GetPodiumTourDeFrance.Premier = "Eddy Merckx"
GetPodiumTourDeFrance.Deuxieme = "Laurent Jalaber"
GetPodiumTourDeFrance.Troisieme = "Miguel Indurain"

End Function

Bon courage :-)

--
Pierre ALEXIS - MVP Visual Basic
Courriel & messenger :
FAQ Visual Basic : http://faq.vb.free.fr/
Avatar
Jean-Michel
Merci, sympa :)

"Pierre Alexis [MVP]" a écrit dans le message de
news:%
Salut Jean-Michel,

Tu as écrit :

> Bonjour, comment je pourrai faire pour qu'une fonction me retourne deux
> valeurs ?

Ce que l'on fait généralement c'est passer les arguments par référence à


la
fonction, ainsi la fonction que tu appelles va pouvoir modifier les


paramètres
transmis. Exemple :

Private Sub Form_Load()

Dim Premier As String
Dim Deuxieme As String
Dim Troisieme As String

' La fonction va "remplir" les variables Premier, Deuxieme et


Troisieme
Call GetPodiumTourDeFrance(Premier, Deuxieme, Troisieme)

MsgBox Premier
MsgBox Deuxieme
MsgBox Troisieme

End Sub

Private Sub GetPodiumTourDeFrance(ByRef PremierCoureur As String, ByRef
DeuxiemeCoureur As String, ByRef TroisiemeCoureur As String)

PremierCoureur = "Eddy Merckx"
DeuxiemeCoureur = "Laurent Jalaber"
TroisiemeCoureur = "Miguel Indurain"

End Function

Pour savoir ce que sont les arguments par référence (en oppostion aux
arguments par valeur) je te conseille cet article de la FAQ :

Question 23 - Quelle est la différence entre les mots-clés "ByVal" et


"ByRef"
?
http://faq.vb.free.fr/index.php?question#

Autre solution, tu peux faire en sorte que ta classe retourne un type


perso,
ou encore mieux une classe.

Exemple avec des types persos :

Private Type Podium
Premier As String
Deuxieme As String
Troisieme As String
End Type

Private Sub Form_Load()

Dim PodiumTourDeFrance As Podium

PodiumTourDeFrance = GetPodiumTourDeFrance()

MsgBox PodiumTourDeFrance.Premier
MsgBox PodiumTourDeFrance.Deuxieme
MsgBox PodiumTourDeFrance.Troisieme

End Sub

Private Function GetPodiumTourDeFrance() As Podium

GetPodiumTourDeFrance.Premier = "Eddy Merckx"
GetPodiumTourDeFrance.Deuxieme = "Laurent Jalaber"
GetPodiumTourDeFrance.Troisieme = "Miguel Indurain"

End Function

Bon courage :-)

--
Pierre ALEXIS - MVP Visual Basic
Courriel & messenger :
FAQ Visual Basic : http://faq.vb.free.fr/




Avatar
Pierre Alexis [MVP]
Salut Patrice,

Tu as écrit :

Je ne suis pas tout à fait d'accord avec ta méthode même si effectivement
cela marche. mais pour moi une fonction a des paramètres et renvoie un
résultat. Les paramètres ne doivent pas être modifiés dasn la fonction.
Sinon autant faire des sub, le résultat étant l'un des paramètres.
Il est vrai aussi que j'ai appris la programmation au début des années 80 et
nos formateurs étaient très stricts sur ces notions.
Je préfère de beaucoup la méthode de Zoury avec un type utilisateur.



Tu as le droit ;-)

Ceci dit beaucoup de programmeurs préfèrent utiliser la valeur de retour de la
fonction pour retourner les éventuels codes d'erreurs. Cela se fait très
couramment en C/C++ où l'on passe souvent en paramètre des pointeurs ou des
références et où la valeur retour des fonctions est un long. Preuve à l'appui,
les API Windows, elles employent abondamment cette technique pour retourner
une ou plusieurs informations.

Toi on t'as peut-être appris à ne pas travailler comme ça, mais moi on est en
train de m'apprendre à justement travailler comme ça... ;-) Ca prouve bien
qu'il n'y a pas vraiment une solution meilleure que l'autre, ça dépend des
sensibilités je pense.

--
Pierre ALEXIS - MVP Visual Basic
Courriel & messenger :
FAQ Visual Basic : http://faq.vb.free.fr/
Avatar
Patrice Henrio
Je ne suis pas tout à fait d'accord avec ta méthode même si effectivement
cela marche. mais pour moi une fonction a des paramètres et renvoie un
résultat. Les paramètres ne doivent pas être modifiés dasn la fonction.
Sinon autant faire des sub, le résultat étant l'un des paramètres.
Il est vrai aussi que j'ai appris la programmation au début des années 80 et
nos formateurs étaient très stricts sur ces notions.
Je préfère de beaucoup la méthode de Zoury avec un type utilisateur.



"Pierre Alexis [MVP]" a écrit dans le message de
news:%
Salut Jean-Michel,

Tu as écrit :

> Bonjour, comment je pourrai faire pour qu'une fonction me retourne deux
> valeurs ?

Ce que l'on fait généralement c'est passer les arguments par référence à


la
fonction, ainsi la fonction que tu appelles va pouvoir modifier les


paramètres
transmis. Exemple :

Private Sub Form_Load()

Dim Premier As String
Dim Deuxieme As String
Dim Troisieme As String

' La fonction va "remplir" les variables Premier, Deuxieme et


Troisieme
Call GetPodiumTourDeFrance(Premier, Deuxieme, Troisieme)

MsgBox Premier
MsgBox Deuxieme
MsgBox Troisieme

End Sub

Private Sub GetPodiumTourDeFrance(ByRef PremierCoureur As String, ByRef
DeuxiemeCoureur As String, ByRef TroisiemeCoureur As String)

PremierCoureur = "Eddy Merckx"
DeuxiemeCoureur = "Laurent Jalaber"
TroisiemeCoureur = "Miguel Indurain"

End Function

Pour savoir ce que sont les arguments par référence (en oppostion aux
arguments par valeur) je te conseille cet article de la FAQ :

Question 23 - Quelle est la différence entre les mots-clés "ByVal" et


"ByRef"
?
http://faq.vb.free.fr/index.php?question#

Autre solution, tu peux faire en sorte que ta classe retourne un type


perso,
ou encore mieux une classe.

Exemple avec des types persos :

Private Type Podium
Premier As String
Deuxieme As String
Troisieme As String
End Type

Private Sub Form_Load()

Dim PodiumTourDeFrance As Podium

PodiumTourDeFrance = GetPodiumTourDeFrance()

MsgBox PodiumTourDeFrance.Premier
MsgBox PodiumTourDeFrance.Deuxieme
MsgBox PodiumTourDeFrance.Troisieme

End Sub

Private Function GetPodiumTourDeFrance() As Podium

GetPodiumTourDeFrance.Premier = "Eddy Merckx"
GetPodiumTourDeFrance.Deuxieme = "Laurent Jalaber"
GetPodiumTourDeFrance.Troisieme = "Miguel Indurain"

End Function

Bon courage :-)

--
Pierre ALEXIS - MVP Visual Basic
Courriel & messenger :
FAQ Visual Basic : http://faq.vb.free.fr/




Avatar
Patrice Henrio
Tout à fait d'accord. Je pense que lorsque tu sauras que mon langage de
prédilection reste le LISP pour sa pureté tu comprendras mieux mes
réticences. C'est vrai aussi que je n'ai jamais accepté de me mettre au
C/C++, et que je me suis limité au minimum requis de l'époque (deux semaines
de C) sur une années complète de formation informatique (Algorithmique,
Pascal, Lisp, SmallTalk, Prolog).
Après tout comme quelqu'un me l'a déjà dit sur un autre sujet, l'important
est quand même de réussir à faire un programme qui remplisse la tâche qui
lui est assigné.
"Pierre Alexis [MVP]" a écrit dans le message de
news:OT9q$
Salut Patrice,

Tu as écrit :

> Je ne suis pas tout à fait d'accord avec ta méthode même si


effectivement
> cela marche. mais pour moi une fonction a des paramètres et renvoie un
> résultat. Les paramètres ne doivent pas être modifiés dasn la fonction.
> Sinon autant faire des sub, le résultat étant l'un des paramètres.
> Il est vrai aussi que j'ai appris la programmation au début des années


80 et
> nos formateurs étaient très stricts sur ces notions.
> Je préfère de beaucoup la méthode de Zoury avec un type utilisateur.

Tu as le droit ;-)

Ceci dit beaucoup de programmeurs préfèrent utiliser la valeur de retour


de la
fonction pour retourner les éventuels codes d'erreurs. Cela se fait très
couramment en C/C++ où l'on passe souvent en paramètre des pointeurs ou


des
références et où la valeur retour des fonctions est un long. Preuve à


l'appui,
les API Windows, elles employent abondamment cette technique pour


retourner
une ou plusieurs informations.

Toi on t'as peut-être appris à ne pas travailler comme ça, mais moi on est


en
train de m'apprendre à justement travailler comme ça... ;-) Ca prouve bien
qu'il n'y a pas vraiment une solution meilleure que l'autre, ça dépend des
sensibilités je pense.

--
Pierre ALEXIS - MVP Visual Basic
Courriel & messenger :
FAQ Visual Basic : http://faq.vb.free.fr/




Avatar
Zoury
> Je préfère de beaucoup la méthode de Zoury avec un type utilisateur.



?! j'ai posté ça moi? je croyais que c'était Nicolas! :O)))
Avatar
Zoury
Salut! :O)

Ceci dit beaucoup de programmeurs préfèrent utiliser la valeur de retour


de la
fonction pour retourner les éventuels codes d'erreurs.
Cela se fait très
couramment en C/C++ où l'on passe souvent en paramètre des pointeurs ou


des
références et où la valeur retour des fonctions est un long. Preuve à


l'appui,
les API Windows, elles employent abondamment cette technique pour


retourner
une ou plusieurs informations.



Yep.

Toutefois, on trouve de plus en plus (VB6, .NET, JAVA, etc.) un concept
d'erreur ou d'exception qui peuvent être levé afin d'alleger le code et les
fonctions. Les fonctions ne renvoient plus de code "d'erreur" mais
avertissent plutôt le système qu'une exception à été rencontrée.

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire profiter à tous
Avatar
Patrice Henrio
exact ! désolé et rendant à César ce qui est à César, il s'agit bien de ng.
"Zoury" <yanick_lefebvre at hotmail dot com> a écrit dans le message de
news:
> Je préfère de beaucoup la méthode de Zoury avec un type utilisateur.

?! j'ai posté ça moi? je croyais que c'était Nicolas! :O)))