formateur informatique

Encrypter et décrypter des données en Vba Excel

Accueil  >  Bureautique  >  Excel  >  Excel VBA  >  Encrypter et décrypter des données en Vba Excel
Livres à télécharger


Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :


Inscription Newsletter    Abonner à Youtube    Vidéos astuces Instagram
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 Feuille Excel pour encodage de messages secrets

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,
Recherche verticale de caractères codés dans tableau Excel

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,
Boutons sur feuille Excel pour crypter et décrypter messages avec VBA

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.
Message encodé par algorithme VBA Excel

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.
Code VBA Excel pour crypter et décrypter des informations de texte

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.
 
Sur Facebook
Sur Youtube
Les livres
Contact
Mentions légales



Abonnement à la chaîne Youtube
Partager la formation
Partager sur Facebook
Partager sur Twitter
Partager sur LinkedIn