Petites précisions sur le passage de paramètres à une fonction, sub ou propriété

Contenu du snippet

Bonjour à tous !

Je constate en épeluchant les sources de ce site que vous oubliez trop souvent, quand vous présentez des fonctions, de définir un passage de paramètre correctement construit.
Ce bref tutorial à pour but de vous montrer ce dernier, optimisé, et ceci dans le but de vous éviter à la longue, notament lors de cas de fonctions récursives, les exceptions ou autres violations d'accès.

NOTE: Il n'est nullement exhaustif, il ne traite notament pas des paramètres de type 'Optional' ou 'ParamArray'.

1er rappel :

- Bien définir la portée de la fonction/sub/prop. En effet, une portée 'Private' sera interne à un module, une form, une classe... Il ne sera donc pas accéssible à partir des autres module de l'application mais sera plus rapide et moins gourmant en ressources.
Tandis qu'une 'Public' sera visible par tous les autres modules de l'appli mais sera un plus gros consommateur de ressource du fait de sont implémentation multiples. De +, attention au doublement de nom de fonction quand il y a trop de 'Public'...

2eme rappel :

- Le paramètres doit être typé dans 95% des cas, c'est très important !! Evitez ainsi tous variant dans les paramètres, sauf si VRAIMENT vous ne pouvez pas définir exactement le type de donnée à passer ET/OU dans le cas d'un paramètre de type 'Optional'

3eme rappel :

- Précisez impérativement le type de passage, c'est à dire soit par référence, soit par valeur, je détail les deux cas :
1) ByRef (Par référence) : C'est la valeur par défaut, c'est à dire que si vous ne spécifiez de type de passage, c'est celle-ci qui est utilisée. C'est la plus ouple, elle est en lecture/écriture, c'est à dire que si vous modifier dans la fonction appellé le paramètre 'ByRef', celui-ci sera également modifié dans la fonction appellante, il s'agit en fait d'une adresse en mémoire.
Ex: Private Sub MaFonction(ByRef strParam As String)
strParam = "toto"
End Sub

Private Sub MaFonction_2()
Dim strBuffer As String

strBuffer = "titi"
Call MaFonction(strBuffer)
Debug.Print strBuffer ' strBuffer contient maintenant "toto"
End Sub

2) ByVal (par valeur) : Là, c'est autre chose, la valeur passé en paramètre est dupliqué en mémoire et utilisable UNIQUEMENT dans le périmètre de la fonction, c'est à dire que si vous modifier le paramètre passé, il sera perdu poour toujours à la sortie de la fonction (dès que l'exécution croise un Exit Function ou End Function)

Ex: Private Sub MaFonction(ByVal strParam As String)
strParam = "toto"
End Sub

Private Sub MaFonction_2()
Dim strBuffer As String

strBuffer = "titi"
Call MaFonction(strBuffer)
Debug.Print strBuffer ' strBuffer contient toujours "titi"
End Sub

- Avantages et inconvénients des deux :
  • ByRef permet la modification des paramètres ou le retour de paramètres nombreux, mais si elle modifie un paramètres qu'elle ne devais pas modifier, c'est le bug assuré dans la fonction appellante ! ;)
  • ByVal permet de travaillé dans son propre environnement sans se soucier des fonctions appellantes, il est isolé avec ses paramètres mais par contre consomme plus de mémoire.


- Pour une bonne utilisation de l'un ou de l'autre, il vous faut définir très exactement à quoi va servir le paramètre passé, est-ce qu'il va être réutilisé...

Conclusion :


Voila. J'espère que ce tutorial vous sera utile, car il est bon de temps en temps de revenir au source ! ;)

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.