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

Soyez le premier à donner votre avis sur cette source.

Snippet vu 8 300 fois - Téléchargée 43 fois

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

Ajouter un commentaire

Commentaires

cs_Troopers
Messages postés
81
Date d'inscription
lundi 18 février 2002
Statut
Membre
Dernière intervention
29 août 2003
-
Bonne idée!! on oublie trop rapidement les bases qui sont essentielles!!
Sirocooo
Messages postés
412
Date d'inscription
mercredi 19 décembre 2001
Statut
Membre
Dernière intervention
7 avril 2008
1 -
super ton travail, continu comme ca, on à besoin de personnes comme toi.
Aller hop 10/10
cs_Jack
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
61 -
Oui, c'est sympa, d'autant que je n'avais jamais réussis à faire le vrai distingo en ByRef et ByVal (je me faisais pas chier : ByVal partout) : Si j'ai bien compris, ByRef peut donc aussi servir de variable pour renvoyer une donnée. Ca peut être pratique.
Merci de ces infos.
Jack
cs_ProgrammeurFou
Messages postés
7
Date d'inscription
vendredi 26 juillet 2002
Statut
Membre
Dernière intervention
28 juillet 2002
-
Ok je pige ByVal c'est pour que la procedure ne change pas la valeur, donc par exemple pour simplement prendre la valeur de celle-ci

au fond c'est ByVal qui est "spécial" ByRef c'est le truc plus normal dison mais faut quand meme faire la nuance
cs_Zeroc00l
Messages postés
370
Date d'inscription
lundi 1 avril 2002
Statut
Membre
Dernière intervention
11 février 2010
-
En bref Byref agit comme un si on envoyait le pointeur de la variable désignée ( mais ca c'est plus du c++ )
Bonne idée de mettre cette source, mais perso je le savais avant ( j'ai le MSDN et ca m'avait intrigué )
Je recommande a tout le monde d'utiliser des byref, il est vrai que c'ts plus rapide et parmet de changer plus de valeur sans trop de ligne de code.

9/10 (chui peut etre vache mais c'est une explication on peut retrouve ailleur)

-={[ ZeroCool ]==-

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.