Les fonctions et procédures
Les fonctions et les procédures sont les éléments primordiaux des programmes, lorsqu’ils commencent à devenir un peu conséquents. Elles permettent de regrouper une ou plusieurs instructions. C’est en quelque sorte un sous-programme, à ceci près qu’il n’est pas autonome et qu’il est utilisé par le programme principal à un certain moment. On dit que le programme appelle une fonction ou une procédure. Une procédure est série d’instructions regroupées, généralement utilisées pour l’affichage ou la sauvegarde, car elles n’ont pas de valeur de retour. On utilise le mot-clé Sub pour la déclarer, suivi du nom de la procédure, de paramètres entre parenthèses (que nous verrons plus tard) et de End Sub en fin de déclaration : Public Sub HelloWorld() MessageBox.Show(« Bonjour ») MessageBox.Show(« le ») MessageBox.Show(« monde ») End Sub Le nom de la procédure sert à l’appeler à partir d’un autre endroit du programme. HelloWorld regroupe trois instructions, qui affichent chacune un mot de la phrase « Bonjour le monde » dans une boîte de dialogue. On l’appelle dans le programme tout simplement en indiquant son nom et des paramètres, s’il y en a : HelloWorld() À l’endroit de votre programme où vous inscrivez ce nom, c’est comme si vous récriviez les instructions regroupées dans la procédure. Vous le pouvez l’appeler autant de fois que nécessaire dans le programme.
Écrire des procédures permet de gagner en compréhension et en temps, car vous n’avez pas besoin de récrire toutes les instructions à chaque fois. Ici, en un appel, vous avez récrit l’équivalent de trois instructions, mais les procédures peuvent être beaucoup plus longues.
Une fonction est une série d’instructions regroupées, comme dans une procédure, mais elle permet de renvoyer une valeur de retour. Cette valeur peut être utilisée par le programme appelant comme si c’était une valeur normale. Voici comment déclarer une fonction : Public Function HelloWorld() Dim resultat As String = « Bonjour le monde » Return (resultat) End Function HelloWorld renvoie tout simplement la chaîne de caractères « Bonjour le monde ». Vous n’êtes pas obligé de préciser le type de la valeur de retour mais vous pouvez le faire en ajoutant As et le type après le nom et les paramètres. Il est recommandé de le préciser, car le code est plus clair. Cela aide à la compréhension et permet de détecter plus facilement les erreurs. Public Function HelloWorld() As String Dim resultat As String = « Bonjour le monde » Return (resultat) End Function Return est le mot-clé qui sert à spécifier que l’on sort de la fonction en retournant la valeur de retour. On peut également affecter la valeur de retour au nom de la fonction, comme ceci : Public Function HelloWorld() As String Dim resultat As String = « Bonjour le monde » HelloWorld = resultat End Function Les deux fonctions sont exactement les mêmes et, bien que ce ne soit pas d’une importance primordiale, mieux vaut le savoir pour comprendre des programmes écrits par d’autres.
Vous pouvez appeler une fonction comme une procédure. Dans ce cas, la valeur de retour n’a pas d’effet, mais les instructions de la fonction sont quand même exécutées : HelloWorld()
La fonction se contente de renvoyer une chaîne de caractères. Mais vous pouvez utiliser cette valeur de retour dans n’importe quelle partie du programme qui attend une valeur du même type. Exemple : MessageBox.Show(HelloWorld()) Par cet appel, le programme affiche une boîte de dialogue contenant le message « Bonjour le monde », car Show attend une chaîne de caractères, et justement, HelloWorld en renvoie une.
Les paramètres
Lorsque l’on déclare ou que l’on appelle des fonctions ou des procédures, leur nom est toujours suivi de parenthèses vides ou qui contiennent des paramètres. Les paramètres sont des variables, dont on récupère la valeur lors de l’appel de la fonction ou de la procédure. Il peut y en avoir un, plusieurs, ou aucun. Ils permettent de donner de la flexibilité à une fonction ou à une procédure. En effet, étant donné que leur valeur exacte n’est donnée que lors de l’appel, celle-ci peut varier et apporter du changement. À la déclaration, il faut spécifier leur type et leur nom. Voici un exemple de procédure avec des paramètres : Public Sub QuiSuisJe(ByVal nom As String, ByVal prenom As ✂ String) MessageBox.Show(« Je suis » + nom + » » +prenom) End Sub Le principe est le même pour les fonctions : Public Function Moi(ByVal nom As String, ByVal prenom As ✂ String) As String Return (« Je suis » + nom + » » +prenom) End Function Par contre, lorsque l’on appelle des fonctions ou des procédures qui ont des paramètres, il faut mettre entre parenthèses les valeurs de ces paramètres. On peut le faire soit par le biais de variable, ou d’expression constante, voire de fonction. En effet, une fonction peut être un paramètre d’une autre fonction, car elle retourne une valeur ; mais il faut que les types correspondent. Dim mon_nom As String = « Martin » Dim mon_prenom As String = « Pierre » QuiSuisJe(mon_nom, mon_prenom) MessageBox.Show(Moi(« Martin », « Pierre »))
Le mot-clé ByVal qui figure dans la déclaration des paramètres indique qu’ils sont transmis par valeur. Cela signifie qu’à chaque fois qu’un paramètre est fourni, une copie des données est faite avant qu’elles soient transmises à la fonction ou à la procédure. Cela garantit qu’un changement sur la valeur transmise ne sera pas répercuté sur la variable originale. Il s’agit du comportement par défaut, ce qui rend ByVal optionnel. Modifions un peu la procédure QuiSuisJe: Public Sub QuiSuisJe(ByVal nom As String, ByVal prenom As ✂ String) MessageBox.Show(« Je suis » + nom + » » +prenom) nom = « DOE » prenom = « John » End Sub Après avoir affiché le nom et le prénom, on les modifie. On reprend le programme précédent, avec une légère modification : Dim mon_nom As String = « Martin » Dim mon_prenom As String = « Pierre » QuiSuisJe(mon_nom, mon_prenom) MessageBox.Show(Moi(mon_nom, mon_prenom)) Au lieu d’écrire des valeurs constantes dans la dernière instruction, on indique mon_nom et mon_prenom. Le programme affiche deux fois une boîte de dialogue dans laquelle figure le texte « Je suis Martin Pierre », bien que les paramètres aient été modifiés dans la deuxième procédure QuiSuisJe. Cela est dû au fait que ces paramètres ont été passés par valeur. La procédure a donc travaillé sur une copie des variables mon_nom et mon_prenom et leurs valeurs originales n’ont donc pas été modifiées.
Le passage de paramètres par valeur s’oppose au passage de paramètres par référence. Dans ce cas, la procédure ou la fonction ne travaille plus avec une copie de la variable passée en paramètre, mais directement avec celle-ci, plus précisément avec son adresse mémoire. En d’autres termes, si une modification est faite pendant la procédure ou la fonction, elle est conservée hors de celle-ci. À manipuler avec une prudence donc ! Pour spécifier un passage par référence, on utilise ByRef au lieu de ByVal. Appliquons cela à la fonction QuiSuisJe: Public Sub QuiSuisJe(ByRef nom As String, ByRef prenom As ✂ String) MessageBox.Show(« Je suis » + nom + » » +prenom) nom = « DOE » prenom = « John » End Sub