Comment créer un générateur de mots de passe sécurisés et personnalisés sur Excel ?
Dans ce tutoriel, je vais vous montrer comment créer une fonction personnalisée permettant de générer très facilement un mot de passe aléatoire. Nous y verrons également comment inclure des paramètres dans cette fonction afin de pouvoir la rendre la plus personnalisable possible.
Téléchargement
Vous pouvez télécharger le fichier d'exemple de cet article en cliquant sur le lien suivant :
Tutoriel Vidéo
1. Présentation
Comme nous venons de le voir dans l’introduction de ce tutoriel, voyons comment construire un générateur de mots de passe aléatoire sur Excel.
Pour personnaliser au maximum la génération de ces mots de passe, nous retrouvons tout d’abord un tableau qui reprend les paramètres à appliquer :
Nous devrons donc rendre la construction de ce mot de passe flexible, en permettant de choisir :
- La taille totale du mot de passe exprimée en nombre de caractères,
- Si celui-ci doit être composé de lettres minuscules,
- Si celui-ci doit être composé de lettres majuscules,
- Si celui-ci doit être composé de chiffres,
- Et enfin, si celui-ci doit être composé de caractères spéciaux
Bien entendu, Excel ne propose pas directement de fonctions pour effectuer cette opération, nous allons devoir la créer entièrement, en VBA.
2. Création de la fonction
Pour créer une fonction personnalisée, nous allons devoir utiliser le langage de programmation VBA.
Ici, le code que nous allons mettre en place n’utilise pas de commandes particulièrement complexes, mais pour que ce tutoriel reste accessible à tous, nous reviendrons dans le détail sur chaque ligne de code.
Si à la suite de ce tutoriel, vous souhaitez en savoir plus sur ce langage de programmation, vous pouvez commander mon livre « Apprendre le VBA » en suivant ce lien.
La première chose à faire pour développer une macro ou une fonction en VBA est de lancer Visual Basic Editor, en appuyant sur les touches [Alt]+[F11].
Il s’agit de l’application incluse avec les logiciels de la suite Office dédiée au développement de macro-commandes.
Celui-ci va alors se lancer directement sur le projet actif, et nous allons commencer par insérer un module, qui est une feuille de code dans laquelle nous venons saisir les instructions dans le langage VBA.
Puis, nous allons pouvoir créer notre fonction, en commençant par saisir le mot-clé Function, suivi du nom que nous souhaitons lui donner, par exemple « MotDePasse » :
Puis nous validons en appuyant sur la touche [Entrée] du clavier.
Pour faire fonctionner cette fonction, nous allons lui affecter des arguments, c’est-à-dire que nous allons demander à l’utilisateur de fournir des informations sur la manière dont le mot de passe doit être généré.
Pour cela, nous saisissons le nom de ces arguments entre les parenthèses ajoutées par VBE.
Ces arguments sont au nombre de cinq (taille, minuscule, majuscule, chiffre et special) :
Function MotDePasse(taille As Integer, minuscule As Boolean, majuscule As Boolean, chiffre As Boolean, caracteresSpeciaux As Boolean)
End Function
Le premier de ces arguments est un nombre entier, nous le typons en tant que Integer.
Quant aux autres arguments, ces derniers vont permettre de préciser si l’utilisateur souhaite obtenir les caractères correspondants dans le rendu final. Nous les typons donc en tant que Boolean, c’est-à-dire que ces derniers ne pourront avoir pour valeur que VRAI ou FAUX (True ou False en langage VBA).
3. Sélection des chaînes de caractères
Il faut savoir qu’il existe plusieurs méthodes pour tirer des caractères aléatoirement en fonction de critères définis.
Ici, nous aborderons la solution la plus simple à mettre en place.
Celle-ci consiste simplement à instancier de nouvelles variables typées en tant que chaîne de caractères, qui permettront de récupérer les caractères correspondants :
Dim listeMinuscule As String, listeMajuscule As String, listeChiffres As String, listeCaracteresSpeciaux As String, listeComplete As String
listeMinuscule = "azertyuiopqsdfghjklmwxcvbn"
listeMajuscule = "AZERTYUIOPQSDFGHJKLMWXCVBN"
listeChiffres = "0123456789"
listeCaracteresSpeciaux = "&~#{([-|_\^@$%*µ,?;.:/!§"
Nous y retrouvons donc quatre listes de caractères stockées dans des chaînes différentes.
Maintenant, nous allons pouvoir effectuer une série de tests sur les valeurs des arguments, afin de créer une grande chaîne unique contenant tous les caractères à inclure dans le tirage :
If minuscule Then listeComplete = listeComplete & listeMinuscule
If majuscule Then listeComplete = listeComplete & listeMajuscule
If chiffre Then listeComplete = listeComplete & listeChiffres
If caracteresSpeciaux Then listeComplete = listeComplete & listeCaracteresSpeciaux
Pour cela, nous effectuons un test avec l’instruction If… Then que nous avions découverte dans un tutoriel précédent, et qui permet d’effectuer une action uniquement lorsqu’une condition est remplie, un peu comme la fonction Excel SI().
Nous commençons donc par regarder si l’utilisateur souhaite inclure les lettres minuscules dans le mot de passe, puis si cela est le cas, nous ajoutons la chaîne listeMinucule à la suite de la variable listeComplete (qui pour le moment est vide), en utilisant l’esperluette de concaténation (le signe « & »).
Ensuite, nous répétons cette opération pour toutes les catégories de caractères.
Nous nous retrouvons ainsi avec une chaîne de caractères composée de tous les éléments pouvant être inclus dans le mot de passe.
4. Tirer un caractère aléatoirement
Maintenant que nous disposons d’une variable contenant tous les caractères pouvant se trouver dans le mot de passe, nous allons devoir sélectionner l’un de ces caractères de manière aléatoire.
Pour cela, nous allons créer une nouvelle variable que nous appelons chaine, laquelle est typée en tant que chaîne (String).
Dans celle-ci, nous venons stocker un caractère aléatoire de la chaîne listeComplete.
Pour cela, nous utilisons deux fonctions :
- Tout d’abord, la fonction Mid() permet d’extraire un ou plusieurs caractères parmi une chaîne
- Puis la fonction Rnd() permet d’effectuer un tirage aléatoire d’un nombre décimal compris entre 0 et 1. Nous multiplions ce nombre par le nombre de lettre contenues dans la chaîne listeComplete, que nous pouvons récupérer avec la fonction Len(). Ensuite, pour éviter tout problème, nous demandons à VBA de ne conserver que la partie entière de ce nombre en encapsulant ce calcul dans la fonction Int() et pour finir, nous ajoutons 1 (pour ne pas tirer la lettre située en zéro-ième position, qui n’existe pas).
Dim chaine As String
chaine = Mid(listeComplete, Int(Rnd() * Len(listeComplete)) + 1, 1)
Cette instruction nous permet de tirer un seul caractère au sein de la chaîne listeComplete.
Pour répéter cette opération le nombre de fois demandé par l’utilisateur avec l’argument taille, nous allons insérer cette ligne dans une boucle For… Next.
Comme nous l’avons vu dans le détail dans le cours qui lui est dédié, une chaîne For… Next permet de répéter une opération tant qu’une condition est remplie.
Pour utiliser la boucle, nous commençons par déclarer une variable i à la suite de la déclaration de la variable chaine que nous typons en tant que Integer, c’est-à-dire que nombre entier :
Dim chaine As String, i As Integer
Ensuite, nous insérons la ligne que nous venons de détailler dans une instruction For… Next dans laquelle la variable i aura pour valeur de départ 1, puis va s’incrément jusqu’à atteindre la valeur de taille :
For i = 1 To taille
chaine = chaine & Mid(listeComplete, Int(Rnd() * Len(listeComplete)) + 1, 1)
Next
Pour que cela fonctionne, nous ajoutons ce résultat à la suite de la chaine « chaine ».
Il ne reste maintenant plus qu’à retourner la valeur de chaine en tant que résultat de la fonction MotDePasse :
MotDePasse = chaine
5. Quelques petites améliorations à apporter
Ici la macro est terminée, mais nous pouvons encore l’améliorer en ajoutant deux instructions.
Tout d’abord, au tout début de la fonction, nous ajoutons la ligne suivante :
Application.Volatile
Comme son nom l’indique, celle-ci permet de rendre la fonction dynamique, c’est-à-dire que le résultat sera recalculé lors de chaque recalcul effectué sur la feuille de calcul (ou en appuyant sur la touche [F9] du clavier depuis la feuille).
Ensuite, juste avant la boucle For… Next, nous ajoutons l’instruction suivante :
Randomize
Sans rentrer dans les détails, cette instruction Randomize permet de faire en sorte que la fonction Rnd() que nous avons vue un peu tôt retourne une valeur totalement aléatoire, ce qui n’était pas vraiment le cas jusqu’alors.
6. Générer des mots de passe aléatoires
Maintenant que la fonction est belle et bien terminée, nous allons pouvoir l’appeler directement depuis la feuille de calcul.
Pour cela, nous procédons exactement comme nous le ferions pour n’importe quelle autre fonction Excel, en saisissant un signe d’égalité (« = »), puis en tapant les premières lettres de la fonction :
La seule difficulté à laquelle nous allons être confrontés, c’est que contrairement aux fonctions natives d’Excel, ici nous ne disposons d’aucune aide à la saisie en direct :
Soit nous connaissons exactement les arguments attendus, soit nous pouvons cliquer sur le bouton fx pour lancer l’assistant à la création de formules une fois la fonction sélectionnée :
Il ne reste alors plus qu’à renseigner les différents arguments attendus, en appuyant à chaque fois sur la touche [F4] pour utiliser des références absolues (avec les signes dollars), ce qui nous permettra ensuite de pouvoir étendre la formule sur toutes les cellules :
De cette manière, Excel nous tire ici un mot de passe composé de 48 caractères.
Nous pouvons modifier les paramètres, afin par exemple mettre en place un mot de passe composé de 6 chiffres uniquement :
Maintenant, nous pouvons étendre la formule sur toutes les cellules de la colonne en utilisant la poignée de recopie :