Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :Encrypter et décrypter des messages textuels en VBA Excel
Dans cette
formation VBA, nous allons monter une petite application utile et intéressante. Elle doit permettre d'
encrypter un message que vous tapez de manière à ce qu'il soit indéchiffrable pour l'oeil humain. Le
message codé est envoyé à un destinataire par messagerie par exemple. Il est donc sécurisé. Ce destinataire dispose de la même application
VBA Excel. Un bouton lui permet de
déchiffrer le texte qui apparaît explicitement à l'écran.
Le classeur de l'application
Ce classeur est constitué d'une seule feuille. Les cinq premières colonnes seront masquées à l'issue. Elles vont servir à la
macro VBA pour retourner l'encryptage de chaque lettre du message composé. Ainsi la première colonne recense toutes les lettres de l'alphabet et tous les chiffres de 0 à 9. La deuxième colonne fournit leur correspondance
encryptée. Mises bout à bout, elles fourniront un message impossible à déchiffrer. La troisième colonne est une copie de la première afin de permettre au programme de
décrypter un message reçu. Le
code VBA va se servir de résultats fournis par des fonctions de calcul intermédiaires d'
Excel. C'est pourquoi figure en colonnes
E et
F le petit tableau sur deux lignes. Nous devons dans un premier temps écrire en colonne
F les résultats de recherche fournis par une
fonction Excel selon des lettres tapées en colonne
E.
La recherche d'information - RechercheV
Concrètement, le
programme VBA devra écrire tour à tour en colonne
E, chaque lettre qui compose le message d'origine ou encodé. En instantané, la
fonction Excel affichera la correspondance en colonne
F selon le tableau des trois premières colonnes. Le
programme VBA n'aura alors plus qu'à prélever tour à tour la lettre correspondante retournée par la fonction pour créer le
texte crypté ou composer le
message décodé. La
fonction Excel qui permet de rechercher une information dans un tableau pour retourner sa valeur correspondante est la fonction
RechercheV(), pour les tableaux en colonne. Le
support Excel sur l'extraction d'informations explique le fonctionnement de cette
rechercheV() dans des cas pratiques. Concrètement ici, la fonction
RechercheV() en
F12 doit rechercher la lettre tapée en
E12 dans le tableau des deux premières colonnes de la feuille. Lorsqu'elle trouve cette lettre dans la première colonne du tableau de recherche, elle retourne la valeur correspondante de la deuxième colonne. La syntaxe de la RechercheV() est la suivante :
=RechercheV(valeur_cherchée ;tableau_recherche ;colonne_retour ;faux)
La
valeur_cherchée est donc
E12. Le
tabeau_recherche est
A4:B40. Le numéro de la
colonne_retour est
2 pour fournir la valeur correspondante en colonne 2. Et enfin
faux, le dernier argument de cette fonction indique Ã
Excel de ne pas tenter de se rapprocher de la valeur s'il elle n'est pas trouvée. Il s'agit de résultats stricts. Nous utiliserons de la même façon une
RechercheV() en
F13 pour rechercher la valeur inscrite en
E13 dans le tableau
B4:C40 cette fois afin de retourner la valeur correspondante issue de la deuxième colonne de ce tableau.
- Saisir la formule Excel en F12 permettant de retourner la lettre codée de la cellule E12,
- Saisir la formule Excel en F13 permettant de retourner la lettre décodée de la cellule E13,
Les fonctions saisies sont les suivantes :
=RECHERCHEV(E12;A4:B40;2;FAUX)
=RECHERCHEV(E13;B4:C40;2;FAUX)
Si vous changez les valeurs en E12 et E13, instantanément les valeurs correspondantes sont rapatriées en F12 et F13. Comme toute
fonction Excel, la
fonction RechercheV() est une fonction dynamique dont le résultat dépend des valeurs saisies.
Code VBA pour encrypter et décrypter
Nous avons besoin de deux boutons qui lanceront respectivement leur procédure associée, soit pour encoder un texte, soit pour le décoder. La première prélèvera le message saisi en
H1 pour livrer sa version encodée en
H2. La seconde prélèvera le texte encrypté en
H2 pour livrer sa version décodée en
H1. Donc, avant de créer les deux boutons, nous avons besoin des deux procédures de
code. Comme ces
macros Vba sont spécifiques à ce classeur, nous allons les écrire pour la feuille de ce classeur et non dans le classeur de macros personnelles, c'est-à -dire le modèle d'
Excel.
- Basculer dans l'éditeur de code VBA,
- Depuis l'explorateur de projet, double cliquer sur Feuil2 (Encodage) pour afficher sa feuille de code au centre de l'écran,
- Créer les deux procédures encrypter() et decrypter(),
Sub encrypter()
End Sub
Sub decrypter()
End Sub
Nous devons maintenant associer ces deux
macros à deux boutons, pour les exécuter. Nous allons placer ces deux boutons directement sur la feuille. Pour cela, nous avons besoin du
ruban Développeur. S'il n'est pas présent sur votre interface
Excel, référez-vous au
support de formation pour débuter en VBA afin de savoir l'afficher.
- Enregistrer le travail (CTRL + S),
- Revenir sur la feuille Excel (ALT + F11),
- Cliquer sur l'onglet Développeur pour afficher son ruban,
- Dans le groupe Contrôles, cliquer sur le bouton Insérer,
- Choisir le premier bouton des contrôles de formulaire,
- Le tracer directement sur la feuille,
- Dans la boîte de dialogue qui suit, lui associer la macro Feuil2.encrypter,
- Changer son texte en Encrypter,
- De la même façon, ajouter un second bouton en dessous,
- Lui associer la macro Feuil2.decrypter,
- Changer son texte en Décrypter,
Un clic sur l'un ou l'autre bouton ne produit aucun résultat à ce stade puisque leurs procédures sont vides. Pour améliorer la qualité de l'
encodage, nous choisissons d'inverser tous les caractères, une fois chacun d'entre eux encodé. Donc la procédure de
décryptage devra elle aussi être capable de les inverser de nouveau, pour les remettre dans l'ordre, une fois chacun d'entre eux
décodé. L'une et l'autre des procédures doit mémoriser le texte de la cellule correspondante dans une variable. Nous appellerons cette variable
msg. Elle doit être de type texte (String) puisqu'elle mémorise le contenu textuel d'une cellule. Ces notions sont abordées par le
support de formation sur les variables en VBA.
- Basculer dans l'éditeur de code (ALT + F11),
- Déclarer la variable msg en tant que String dans la procédure encrypter(),
Dim msg As String
Pour inverser l'ordre des lettres du texte récupéré, nous aurons besoin d'une
boucle capable de parcourir la chaîne de caractères, en partant de la dernière lettre et en remontant jusqu'à la première. Nous utiliserons une
boucle For. Le
support de formation VBA sur les boucles For Next présente leur fonctionnement. Pour être capable de décrémenter cette
boucle en partant du dernier caractère, il faut connaître le nombre de lettres contenues dans le texte. Pour cela, nous avons besoin d'une variable que nous nommerons
nombre à déclarer en tant qu'
entier. Puis il faudra une variable pour mémoriser la construction de l'encodage du texte au fur et à mesure. Nous nommerons cette variable
code et la déclarerons en tant que
texte.
- Déclarer les variables nombre et code à la suite,
Dim nombre As Integer: Dim code As String
Les deux points (
:) dans la syntaxe
VBA Excel permettent d'énumérer les déclarations de variables sur la même ligne. Pour que le
code soit déclenché, faut-il encore que le contenu de la cellule
H1 Ã
encoder ne soit pas vide. Nous allons donc vérifier ce critère avec une
instruction If qui déterminera si l'exécution du code doit se poursuivre ou non. Le
support VBA sur les conditions et critères apprend à poser des raisonnements dans une feuille de code avec ces instructions. C'est l'objet
Cells en
VBA Excel qui permet de désigner une cellule selon son indice de ligne et son indice de colonne.
H1 représente une cellule en ligne 1 et en colonne 8. Elle est donc atteinte en
VBA par
Cells(1,8). La propriété
Value de l'objet
Cells renvoie le contenu de la cellule ainsi désignée,
Cells(1,8).Value. Et, nous devons tester si ce contenu n'est pas vide (<>'') avant de poursuivre. Ce test doit être réalisé à l'aide de l'
instruction If.
- Ajouter le critère sur le contenu de la cellule après la déclaration de variable,
If (Cells(1, 8).Value <> '') Then
'Le code peut se poursuivre
End If
L'
instruction If doit toujours être bouclée par les mots clés
End If. Et c'est entre les bornes de cette instruction que doivent être codés les traitements. Une ligne précédée d'une apostrophe en
VBA est un commentaire. Il s'agit d'une indication pour le développeur qui est ignorée par
VBA et le compilateur. Nous devons maintenant mémoriser le contenu de la cellule
H1 dans la variable
msg. Et pour pouvoir parcourir chaque caractère de ce contenu mémorisé, en partant du dernier à l'aide d'une
boucle, nous devons mémoriser le nombre de caractères dans la variable
nombre.
- Dans le If, ajouter les deux affections des variables msg et nombre,
msg = Cells(1, 8).Value
nombre = Len(msg)
La fonction
Len() en
VBA renvoie le nombre de caractères contenus dans le
String qui lui est passé en argument. Ensuite nous devons écrire les bornes de la boucle qui permettra de parcourir les caractères mémorisés en partant du dernier et en remontant jusqu'au premier.
- A la suite, dans l'instruction If, ajouter le code suivant :
For i = nombre To 1 Step -1
Next i
Nous utilisons une variable que nous nommons
i pour parcourir cette boucle (
For i). Nous l'initialisons à la valeur de la position du dernier caractère (
i = nombre). Puis à chaque passage dans la
boucle, nous la faisons remonter jusqu'Ã la position 1 (
To 1) en la décrémentant grâce au mot clé
Step de la boucle
For (
Step -1). Et surtout nous n'oublions pas de fermer cette
boucle grâce au mot clé
Next suivi de la variable utilisée pour parcourir cette
boucle (
Next i). Désormais, tous les traitements récurrents qui consistent Ã
encoder les caractères récupérés puis à les assembler de nouveau, doivent être écrits dans les bornes de cette boucle.
La
fonction VBA Excel qui permet de prélever une partie d'un texte en partant d'une position donnée, sur une longueur donnée est la fonction
Mid(). La
formation VBA Excel pour modifier la casse des cellules exploite cette fonction
Mid() pour pouvoir traiter des bouts de chaînes de caractères. Nous devons à chaque fois prélever un caractère du texte mémorisé, en partant de la position en cours dans la boucle, soit i. La fonction
Mid() requiert trois paramètres. Le premier paramètre est le texte dont on souhaite prélever le caractère soit
msg ici. Le deuxième paramètre est la position à partir de laquelle le texte doit être prélevé dans ce texte, soit
i ici. Et enfin le dernier paramètre est la longueur sur laquelle prélever ce morceau. Il nous faut un seul caractère, donc nous indiquerons 1. Ce qui donne :
Mid(msg, i, 1).
Si nous inscrivons instantanément chacun de ces caractères prélevés par la fonction
Mid() en cellule
E12 (
Cells(12, 5)), la fonction
RechercheV() d'
Excel en
F12 retournera automatiquement son caractère encrypté correspondant. Nous n'aurons plus qu'à les récupérer tour à tour et à les ré-assembler dans la variable
code pour mémoriser le texte correspondant
encodé.
- En suivant ces instructions, ajouter les deux traitements suivants dans la boucle :
Cells(12, 5).Value = Mid(msg, i, 1)
code = code & Cells(12, 6).Value
Le Et commercial (
&) est utilisé pour assembler les caractères encryptés retournés, un à un, puisque nous sommes dans une boucle. Donc, une fois que la
boucle est terminée, nous devons obtenir le texte inversé et
encrypté, dans la variable
code. Nous devons inscrire ce résultat en cellule
H2 (
Cells(2, 8)).
- Pour ce faire, après la boucle, mais toujours dans le If, ajouter la ligne suivante :
Cells(2, 8).Value = code
Il nous reste à tester.
- Basculer sur la feuille du classeur (ALT + F11),
- Saisir un message en H1, par exemple Dossier confidentiel,
- Cliquer sur le bouton Encrypter,
Vous obtenez le
message codé en retour en cellule
H2 comme l'illustre la capture ci-dessous. Vous en conviendrez, sans algorithme pour le
déchiffrer, ce message est incompréhensible.
Le code complet pour un tel traitement est relativement simple, comme vous le remarquez. Il est donné ci-dessous.
Sub encrypter()
Dim msg As String: Dim nombre As Integer: Dim code As String
If (Cells(1, 8).Value <> '') Then
'Le code peut se poursuivre
msg = Cells(1, 8).Value
nombre = Len(msg)
For i = nombre To 1 Step -1
Cells(12, 5).Value = Mid(msg, i, 1)
code = code & Cells(12, 6).Value
Next i
Cells(2, 8).Value = code
End If
End Sub
Il nous reste maintenant à coder la procédure de
décryptage. En réalité, c'est exactement la même chose. Sauf qu'il faut adapter les références des cellules, en l'occurrence celle à partir de laquelle on prélève le texte à mémoriser (
H2 au lieu de H1), celle dans laquelle on inscrit la lettre à décoder (
E13 au lieu de E12) et enfin celle à partir de laquelle on prélève le caractère décodé (
F13 au lieu de F12) pour reconstituer le message original intelligible.
- Copier l'intégralité du code compris entre les bornes de la procédure encrypter(),
- Le coller dans les bornes de la procédure decrypter(),
- Changer les occurrences Cells(1,8) en Cells(2, 8),
- Changer l'occurrence Cells(12, 5) en Cells(13, 5),
- Changer l'occurrence Cells(12, 6) en Cells(13, 6),
- Enregistrer le code (CTRL + S),
- Basculer sur la feuille du classeur (ALT + F11),
- Supprimer le contenu du texte clair en cellule H1 pour un test représentatif,
- Cliquer sur le bouton Décrypter,
Vous retrouvez le texte d'origine dans sa version claire. Notre programme d'
encodage et de
décodage d'informations fonctionne donc parfaitement. Pour parfaire l'application, il convient de masquer les 5 premières colonnes qui servent aux
RechercheV(). Une fois masquées, elles ne seront pas visibles par l'utilisateur mais tout à fait exploitables par le programme. Donc la console d'
encryptage s'en trouvera d'autant plus ergonomique.
A partir de cet
algorithme, nous pourrions même envisager d'améliorer la
sécurité de l'encryptage de données pour éviter la répétition des lettres semblables qui se suivent comme les doubles S ou les doubles L. Pour ce faire, nous bâtirions un second tableau pour les
rechercheV où la correspondance entre les caractères d'origine et les lettres cryptées serait complètement différente. Ainsi, un coup sur deux, l'
algorithme d'encryptage utiliserait le premier tableau puis l'autre. L'algorithme pour
décrypter suivrait la même procédure en sens inverse. Ainsi, une même lettre qui se répèterait à la suite, ne serait pas
encodée deux fois de la même façon.