Votre première fonction VBA

Création de la fonction FileRankToString(n° de case)

Création de la fonction FileRankToString(n° de case)


Création du module hébergeant la future fonction

Avant d’écrire votre première fonction VBA, il faut un module dans lequel on va stocker toutes les fonctions.

Quand on sauve la feuille Excel, on sauve également ses modules VBA mais tout ce que l’on a pu écrire dans la fenêtre Exécution est toujours perdu.

Revenons à la figure du VBE en 2 (cercle en blanc sur fond rouge) dans le navigateur de projet "Projet – VBAProject". Vous devriez y voir une feuille de calcul en 3, ThisWorkbook en 4 mais pas les items 8 à 10.

Cliquez sur le VBE menu "Insertion" > "Module"

Dans le navigateur de projet, un nouvel item apparaît en cercle 9 : Modules > Module1

Optionnellement vous pouvez changer le nom du module1 par "ModChess" en 3 (cercle en blanc sur fond rouge) si vous avez sélectionné "Module1" près du cercle 8.

FileRankToString() votre première fonction VBA

En mathématique l’usage veut qu’on utilise des noms de fonction courts sur une seule lettre telle que f(x) = y.

En informatique, le nom de la fonction, les noms des paramètres doivent être parlants donc sur plusieurs lettres avec initiale en majuscule à chaque début de mot puisqu’on ne peut pas utiliser le blanc séparateur entre les mots. Pour différencier fonction et variable, on peut choisir comme convention qu’un nom de fonction commence par une majuscule et un nom de variable par une minuscule. Ils doivent avoir des noms différents.

Double-cliquer "Module1" ou "ModChess" s’il a été renommé.

La fenêtre d’édition des macros de ce module est vide en 4 (en blanc sur fond rouge).

Insérer le code suivant dans la fenêtre d’édition du Module1 (pas dans la fenêtre Exécution).

Contrairement à la fenêtre Exécution où il faut copier-coller et valider par ENTER le code VBA ligne par ligne, ici vous pouvez sélectionner tout le bloc de lignes et copier-coller l’ensemble en une seule fois.

Cependant si on tape à la main la déclaration du type d’une variable après "As", l’autocomplétion facilite la sélection du type à partir de sa ou ses premières lettres.

Option Explicit

Function FileRankToString(ByVal indexSquare As Integer) As String
Dim file As Integer, rank As Integer

        rank = indexSquare \ 8
        file = indexSquare - rank * 8
        FileRankToString = Chr(file + Asc("a")) + CStr(rank + 1)
End Function

Après le mot-clé Function, apparaît le nom de la fonction à déclarer ici FileRankToString. Puis on trouve la liste des paramètres entre parenthèses. Ici il n’y en a qu’un paramètre : indexSquare. ByVal signifie que le paramètre est passé par valeur (paramètre d’entrée) par opposition à ByRef par référence (paramètre de sortie ou d’entrée-sortie c-a-d modifié par la fonction). Comme une fonction ne peut retourner qu’un seul résultat, si on a besoin d’un résultat supplémentaire en plus du résultat principal on le récupérera via un paramètre de sortie déclaré en ByRef.

Après la fermeture de la parenthèse de la liste des paramètres, on trouve le type du résultat de la fonction, ici une chaîne de caractère (String).

Rappelons que dans la fenêtre Exécution on avait des affectations de variables que l’on n’a pas eu à déclarer :

indexSquare = 62
rank = indexSquare \ 8
file = indexSquare - rank * 8

Dans la fenêtre d’édition, on doit leur donner un type explicitement d’où Option Explicit en tête de module. Il est fortement recommander de toujours utiliser cette Option Explicit sinon les types de variable n’étant pas précisés, VBA va choisir des types par défaut qui ne correspondent pas forcément à ce que l’on souhaite (risque de bug) ou sont plus génériques donc moins performants. Les types permettent de contrôler que l’on n’additionne pas une String avec un Integer.

Le mot-clé Dim permet de dimensionner (déclarer) le type des variables file et rank. Elles sont de type Integer. On dit que l’on a typé les variables. La virgule "," sépare deux items consécutifs dans la liste des déclarations. Etant déclarées à l’intérieur de la fonction FileRankToString, les variables sont dites locales à la fonction, c-a-d qu’elles ne sont pas accessibles à l’extérieur de la fonction.

On reconnaît dans le corps de la fonction les instructions déjà expérimentées dans la fenêtre Exécution lors des précédentes sessions. On a mis une tabulation avant chaque instruction pour bien différencier le corps de la fonction des déclarations qui précédent.

La dernière instruction reprend le nom de la fonction en tant que simple variable ici de type String qui est affectée (en partie gauche du "=") avec l’expression combinant file et rank. C’est le résultat retourné par la fonction.

Au mot-clé Function de début de déclaration de la fonction correspond la fin de la déclaration avec le mot-clé End Function.

Test de la fonction FileRankToString

Retournons dans la fenêtre Exécution. Maintenant que la fonction est déclarée, on peut l’utiliser.

? FileRankToString(62)

g8

? FileRankToString(0)

a1

Comme dans la fonction mathématique f(x), le nombre entre parenthèse est le paramètre d’entrée. Il est rangé automatiquement dans le contenu du paramètre indexSquare défini en premier dans la déclaration de la fonction.

Dans la formule d’une cellule d’Excel

Si vous en voyez l’usage, vous pouvez même utiliser votre nouvelle fonction dans une formule de cellule de la feuille calcul. VBA permet donc d’étendre le jeu de fonctions de formule avec vos propres fonctions ! C’est complètement différent d’un enregistrement de macro puisqu’une macro n’a pas de paramètre et ne retourne pas de résultat.

Dans la cellule R2C20, on a mis comme formule ’’=FileRankToString(R[-1]C)’’

référençant comme paramètre d’entrée le contenu numérique de la cellule juste au-dessus c-a-d 62. Le résultat de la formule affiche alors ’’g8’’.

Sauvegarde de la fonction FileRankToString

Sauver votre feuille Excel et son module :

  • soit depuis VBE par le menu "Fichier" > "Sauver"
  • soit classiquement par le menu "Fichier" > "Sauver" d’Excel.

Vous pouvez choisir comme nom de classeur Chess.xls


Précédent : Coordonnées sur l’échiquier (2ème partie)

Suivant : Edition de code VBA et commentaire

Posté le 6 juillet 2011 par Matt