Différence entre une sub et une fonction [Résolu]

Signaler
Messages postés
201
Date d'inscription
mercredi 1 décembre 2004
Statut
Membre
Dernière intervention
13 août 2005
-
Messages postés
796
Date d'inscription
jeudi 17 mai 2001
Statut
Membre
Dernière intervention
5 mai 2009
-
bonjour!

qqn pourrait-il m'expliquer la différence entre une 'sub' et une fonction? il me semble que c'est au niveau de ce qu'elles renvoient et de leur appel, mais je ne sais plus...

merci de votre réponse.

Daydayerement Vôtre

7 réponses

Messages postés
153
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
22 juillet 2009
1
Oui sauf que si tu utilises la syntaxe Call pour appeler toute fonction que tu as définies, la valeur de retour de la fonction est ignorée
3
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 123 internautes nous ont dit merci ce mois-ci

Messages postés
402
Date d'inscription
jeudi 25 novembre 2004
Statut
Membre
Dernière intervention
7 juin 2009
4
Effectivement, une Sub est une procédure et donc ne renvoie rien
Une fonction (Function) renvoie quelque chose (valeur ou objet)
Ex:

'Procédure
Public Sub maSub1(a_Text As String)
MsgBox a_Text
End Sub


'Fonction renvoyant un entier
Public Function maFonc1(a_Val As Integer) As Integer
maFonc1 = a_Val * 2
End Function


'Fonctin renvoyant une chaine
Public Function maFonc2(a_Text As String, a_Val As Integer) As String
maFonc2 = a_Text & " : " & a_Val
End Function


'Fonction renvoyant un objet
Public Function maFonc3(a_Text As String, a_Val As Integer) As Object
Dim l_test As New Form
Set maFonc3 = l_test
End Function


'Fonctin renvoyant un Variant (c'est à dire n'importe quel type de donnée
Public Function maFonc4(a_Text As String, a_Val As Integer)
Dim l_test As New Form
Select Case a_Val
Case 0
'Renvoie un entier
maFonc4 = 1
Case 1
'Renvoie une chaine
maFonc4 = a_Text
Case 2
'Renvoie un objet
Set maFonc4 = l_test
End Select
End Function


Public Sub test()
Dim a As Object
Dim li_Value As Integer
Dim ls_Val As String
Dim lv_test As Variant


maSub1 "Coucou"
Call maSub1("Coucou")


'Appels de fonction dont on ne récupère pas la valeur (ce qui ne sert à rien dans cet exemple)
maFonc1 2
Call maFonc1(2)


Debug.Print "maFonc1"
li_Value = maFonc1(2)
Debug.Print li_Value
Debug.Print ""
Debug.Print "maFonc2"
ls_Val = maFonc2("test", 2)
Debug.Print ls_Val
Debug.Print ""
Debug.Print "maFonc3"
Set a = maFonc3("test", 2)
Debug.Print a.Caption
Debug.Print ""
Debug.Print "maFonc4"
li_Value = maFonc4("test", 0)
Debug.Print li_Value
ls_Val = maFonc4("test", 1)
Debug.Print ls_Val
Set a = maFonc4("test", 2)
Debug.Print a.Caption
Debug.Print ""
Debug.Print "maFonc4 bis"
lv_test = maFonc4("test", 0)
Debug.Print lv_test
lv_test = maFonc4("test", 1)
Debug.Print lv_test
Set lv_test = maFonc4("test", 2)
Debug.Print lv_test.Caption


End Sub
Messages postés
201
Date d'inscription
mercredi 1 décembre 2004
Statut
Membre
Dernière intervention
13 août 2005

maSub1 "Coucou" et
Call maSub1("Coucou")

sont de manieres d'appeler une fonction ou une sub alors?

Daydayerement Vôtre
Messages postés
153
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
22 juillet 2009
1
Call permet aussi bien d'appeler une sub qu'une function.



Pour une sub cela sera: masub(......)

et pour une fonction par exemple cela sera: a=mafunc(.....)
Messages postés
201
Date d'inscription
mercredi 1 décembre 2004
Statut
Membre
Dernière intervention
13 août 2005

merki! mais en fait je voulais savoir si c'était les deux facon d'appeler une fonction (ou une sub)... alors c'est oui?

Daydayerement Vôtre
Messages postés
402
Date d'inscription
jeudi 25 novembre 2004
Statut
Membre
Dernière intervention
7 juin 2009
4
oui
Messages postés
796
Date d'inscription
jeudi 17 mai 2001
Statut
Membre
Dernière intervention
5 mai 2009
5
Salut :O)

En effet une sub ne retourne pas d'information mais n'oublions pas qu'en passant un argument par référence, une sub peut modifier le contenu d'une variable locale. Pour rappel, VB passe par défaut tous ses arguments par référence. ByVal devrait être explicitment utilisé à chaque fois que ByRef n'est pas nécessaire. Histoire d 'être logique et 'propre'.

Exemple :

Private Sub Command1_Click()


Dim toto As Long


toto = 1
Call MySub(toto)


'Toto vaut 2 puisque la valeur 1 lui a été ajouté dans la sub MySub
MsgBox toto


End Sub

Private Sub MySub(ByRef Parametre As Long)


'La variable Parametre pointe sur la variable toto. Parametre et toto sont une seule et unique variable.
'Toto vaut 1 à ce stade. Toto aura comme valeur 2 après l'exécution de la ligne ci-dessous.
Parametre = Parametre + 1


End Sub

Guy