Function+ Sub Versus Sub

Bonjour,

J'aimerais vous poser une question : Quel est l'intérêt de créer une fonction + une procédure alors que je peux le réaliser qu'avec une seule procédure ?

Je m'explique à l'aide de l'exemple suivant :

Option Explicit

Dim MesBonbon As Long    ' Variable numérique qui contiendra le nombre de bonbons
Dim MesScoubidou As Long ' Variable numérique qui contiendra le nombre de scoubidous

Sub CompterLesac()
Dim Ligne As Long ' Variable numérique pour balayer les lignes de la feuille.
Dim Colonne As Long

Ligne = 1 ' Initialise Ligne à 1
Colonne = 3
MesBonbon = 0: MesScoubidou = 0 ' Variables mises à zéro par sécurité.

While Cells(Ligne, Colonne) <> ""  ' Tant Que cellule(y,x) n'est pas vide.

    If Cells(Ligne, Colonne) = "x" Then MesBonbon = MesBonbon + 1         ' Les bonbons.
    If Cells(Ligne, Colonne) = "s" Then MesScoubidou = MesScoubidou + 1   ' Les scoubidous.
    Ligne = Ligne + 1 ' Passe à la ligne suivante.

Wend

MsgBox "J'ai " & MesBonbon & " bonbons et " _
        & MesScoubidou & " scoubidous dans mon cartable."

End Sub

Ci-dessus un code n'utilisant qu'une procédure.

Option Explicit

Dim MesBonbon As Long    ' Variable numérique qui contiendra le nombre de bonbons
Dim MesScoubidou As Long ' Variable numérique qui contiendra le nombre de scoubidous

Sub CompterLeCartable()

Call CompterPoche(3)  ' Alimente MesBonbon et MesScoubidou

MsgBox "J'ai " & MesBonbon & " bonbons et " _
        & MesScoubidou & " scoubidous dans mon cartable."

End Sub

Function CompterPoche(MaColonne As Long) As Long

Dim Ligne As Long               ' Variable numérique pour balayer les lignes de la feuille.
Ligne = 1                       ' Initialise Ligne à 1
MesBonbon = 0: MesScoubidou = 0 ' Variables mises à zéro par sécurité.

While Cells(Ligne, MaColonne) <> ""  ' Tant Que cellule(y,x) n'est pas vide. 
    CompterPoche = CompterPoche + 1 ' Incrémente le nombre d'éléments trouvés.
    If Cells(Ligne, MaColonne) = "x" Then MesBonbon = MesBonbon + 1         ' Les bonbons.
    If Cells(Ligne, MaColonne) = "s" Then MesScoubidou = MesScoubidou + 1   ' Les scoubidous.
    Ligne = Ligne + 1 ' Passe à la ligne suivante.

Wend

End Function

Ci-dessus le code répondant au même "besoin" mais faisant appel à une fonction + une procédure.

Pourriez-vous m'expliquer l'intérêt d'utiliser les fonctions ?

Je vous remercie,

Bien à vous,

Stéphane Drihem

Bonjour,

Une Function peut faire tout ce que fait une Sub mais en plus peut renvoyer un résultat...

Dans ton cas elle n'est qu'intitulée Function et ne renvoie rien, mauvaise utilisation parce qu'elle ne sert à rien...

Elle est utilisée comme une Sub pour juste alimenter les variables modules...

Si tu avais une procédure détectant si des changements sont intervenus et lancer automatiquement un recomptage pour mettre à jour. Une Function serait alors utile pour appeler les valeurs des variables.

Cordialement.

Bonjour,

En excluant le cas du besoin d'une fonction personnalisée sur feuille, je compléterai en disant que tu crées une fonction si tu as un besoin répétitif (qui s'y prête).

Une fois ta fonction construite et testée à fond, tu peux faire appel en différents endroits sans te poser de question dessus.

Il faut aussi que ce soit justifié par une certaines complexité ou une certaine longueur.

Créer une fonction pour 3 lignes de code n'a pas forcément grand sens.

Eviter de mettre 2 fois ou plus 20 lignes ça commence à devenir intéressant pour la clarté.

Comme tu peux voir il y a une part de subjectivité.

eric

PS : dans ton exemple tu aurais pu créer une fonction recevant en paramètre la plage et ce qu'il faut compter et l'appeler 2 fois, ça aurait eu plus de sens. A condition qu'elle retourne le résult comme dit MFerrand

Salut Eric !

Daccord avec toi sur tes considérations... mais le dernier cas que j'ai évoqué justifiait une fonction d'une ligne utile (dès lors que l'on ne veut pas rendre les variables publiques) pour afficher leur valeur n'importe où (et en supposant que la mise à jour des variables se fait par ailleurs de façon transparente...). Cas qui peut aussi être traité par des variables couplées à des procédures Property...

La question reste qu'on a intérêt à faire ce qui répond le mieux et le plus simplement à une situation...

Je suis toujours un peu surpris de croiser assez souvent des Function où l'on ne fait pas renvoyer de résultat !

Dans mon esprit l'idée qu'"une fonction est conçue pour renvoyer un résultat" fait partie du b-a-ba.

Sachant que selon ce qu'elle fait on peut toujours alors l'utiliser comme une Sub quand l'on n'a pas besoin du résultat...

(ce qu'on fait d'ailleurs fréquemment avec MsgBox, qui est une fonction).

Cordialement.

Merci pour vos réponses.

Effectivement, je ne renvoie pas le résultat de la fonction (on entend renvoyer le résultat de la fonction en l'intégrant dans une cellule de la feuille, c'est bien ça ?)

Pour que le Sub soit clair et compréhensible, créer des fonctions peut aider à scinder les étapes (voir même jusqu'à être réutilisées dans d'autres prog.).

Je vous remercie Messieurs, j'y vois plus clair maintenant.

Bien à vous,

Stéphane

Non ! Exemple :

Function MaFonction(arguments éventuels) As type renvoyé [éventuellement]
     Code....
     MaFonction = résultat
End Function

Le résultat est renvoyé par l'expression : NomdelaFonction =...

Quand ça manque elle ne renvoie pas de résultat, rien ne la distingue alors d'une Sub.

Rechercher des sujets similaires à "function sub versus"