Différence entre une sub et une fonction

Résolu
Daydayer Messages postés 201 Date d'inscription mercredi 1 décembre 2004 Statut Membre Dernière intervention 13 août 2005 - 23 mai 2005 à 10:33
Neo.balastik Messages postés 796 Date d'inscription jeudi 17 mai 2001 Statut Membre Dernière intervention 5 mai 2009 - 23 mai 2005 à 19:37
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

linasteph Messages postés 153 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 juillet 2009 1
23 mai 2005 à 14:46
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
mrdep1978 Messages postés 402 Date d'inscription jeudi 25 novembre 2004 Statut Membre Dernière intervention 7 juin 2009 7
23 mai 2005 à 11:06
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
0
Daydayer Messages postés 201 Date d'inscription mercredi 1 décembre 2004 Statut Membre Dernière intervention 13 août 2005
23 mai 2005 à 12:04
maSub1 "Coucou" et
Call maSub1("Coucou")

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

Daydayerement Vôtre
0
linasteph Messages postés 153 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 juillet 2009 1
23 mai 2005 à 12:49
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(.....)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Daydayer Messages postés 201 Date d'inscription mercredi 1 décembre 2004 Statut Membre Dernière intervention 13 août 2005
23 mai 2005 à 14:33
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
0
mrdep1978 Messages postés 402 Date d'inscription jeudi 25 novembre 2004 Statut Membre Dernière intervention 7 juin 2009 7
23 mai 2005 à 14:47
oui
0
Neo.balastik Messages postés 796 Date d'inscription jeudi 17 mai 2001 Statut Membre Dernière intervention 5 mai 2009 7
23 mai 2005 à 19:37
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
0
Rejoignez-nous