Accès à la base de registre

Lorsque vous cliquez sur Démarrer/Exécuter, et que vous écrivez regedit, et OK, vous accédez à la base de registre. C'est ici que sont sauvegardées toutes les informations de votre système (Quelle version de Windows vous utilisez, quels programmes sont installés, en quelle langue, quel est votre fuseau horaire, etc.) C'est également ici que lorsque vous utilisez un programme et que vous changer certaines options

Par exemple, dans Excel, vous pouvez faire Outils/Options, onglet General, cocher "Liste des derniers fichiers utilisés", et mettre cette valeur sur 9 (Ce qui veut simplement dire que quand vous allez continuer à travailler avec Excel, petit à petit, il va "garnir" le menu Fichier avec, en dessous la liste de tous les derniers fichiers que vous avez ouvert, jusqu'à un maximum de 9). Et bien, cette option de 9 fichiers, il est bien possible que ce soit dans la base de registre qu'elle soit stockée (Bien que je n'en soit pas sûr pour cet exemple précis, mais c'est quand même un bon exemple)

Vous aussi, vous pouvez stocker des informations système dans la base de registre. Les avantages sont nombreux :

  1. Ce qui est stocké dans la base de registre est automatiquement sauvegardé
  2. La base de registre est facilement accessible manuellement (Avec RegEdit), mais aussi par programmation VBA, ou n'importe quel autre langage depuis n'importe quelle autree programme qu'Excel
  3. La base de registre est un standard au niveau des infos de configuration

Informations générales

L'instruction pour enregistrer quelque chose dans la base de registre est SaveSettings. Ce que vous sauvegardez avec SaveSettings sinstallera automatiquement dans (Avec Windows 2000) :

HKEY_USERS \ S-4-6-23-9092171932-311282134-1221991238-2009 \ Software \ VB and VBA Program Settings

Le chiffre en bleu est l'identification (fictive) de mon nom d'utilisateur.

Avant d'aller plus loin, et à titre d'exercice, essayez de trouver dans la base de registre (Démarrer/Exécuter : regedit), ce fameux endroit VB and VBA Program Settings

Dans cette clé (VB and VBA Program Settings) vont donc se trouver les clés et sous-clés de votre application.

Ecriture dans la base de registre (SaveSetting)

Par exemple, imaginons que vous avez développé une feuille Excel complexe (une application), que nous vous avez nommée "UltraCalc" - Ce n'est pas forcément le nom du fichier .XLS, c'est un titre, tout simplement, vous avez plusieurs genres d'options, mais vous voulez sauvegarder dans la partie "Informations personnelles", le "Nom de l'utilisateur" qui serait égal à "André Dupont". Vous écririez alors ceci dans une macro VBA :

Sub TestRegistre()
  SaveSetting appname:="UltraCalc", section:="Informations personnelles", key:="Nom de l'utilisateur", setting:="André Dupont"
End Sub

Dès que vous avez exécuté cette ligne de code, si vous retournez dans RegEdit, vous allez voir ceci :

ASTUCE : Pour retrouver plus facilement cet endroit, une fois que vous êtes dans RegEdit, faites Edition/Rechercher : andré Dupont, et OK. Il va directement vous positionner sur la clé Informations Personnelles

On aurait pu également écrire la ligne de code comme ceci, bien entendu, mais ça me parait moins clair :

SaveSetting "UltraCalc", "Informations personnelles", "Nom de l'utilisateur", "André Dupont"

Lecture dans la base de registre (GetSetting)

Puisqu'on a écrit quelque chose dans la base de registre, il faut bien entendu pouvoir le lire avec VBA. L'instruction GetSetting s'en charge. Voici l'instruction si nous voulons afficher André Dupont :

MsgBox GetSetting(appname:="UltraCalc", section:="Informations personnelles", key:="Nom de l'utilisateur")

Si vous exécutez ceci, il va donner un message "André Dupont"

Remarquez les parenthèses en plus - C'est parce que SaveSetting ne renvoie pas de valeur qu'il ne faut pas de parenthèses. GetSetting renvoie le nom de l'utilisateur, donc il faut des parenthèses.

Valeur par défaut en cas d'inexistance de la clé (Default)

Si vous avez fait une faute d'orthographe, ou si la clé n'existe simplement pas, comme dans ces deux cas :

MsgBox GetSetting(appname:="UltraCalk", section:="Informations personnelles", key:="Nom de l'utilisateur")
MsgBox GetSetting(appname:="UltraCalc", section:="Informations personnelles", key:="Date de naissance")

Il n'y a pas d'erreur, mais simpement le MsgBox sera vide.

Il est possible de pallier à ce genre de circonstances simplement en utilisant un paramètre de plus : Default, comme ceci :

MsgBox GetSetting(appname:="UltraCalk", section:="Informations personnelles", key:="Nom de l'utilisateur",Default:="Y'a rien !")
Affichera "André dupont"
MsgBox GetSetting(appname:="UltraCalc", section:="Informations personnelles", key:="Date de naissance",Default:="Y'a rien !")
Affichera "Y'a rien !"
MsgBox GetSetting(appName:="UltraCalc", section:="Informations personnelles", key:="Nom de l'utilisateur",Default:="Y'a rien !")
Affichera "Y'a rien !"

Effacement d'une entrée dans la base de registre (DeleteSetting)

On peut effacer soit l'appName (Ici UltraCalc), ce qui détruira tout ce qui est sous-jacent, ou la section (Ici par exemple Informations personnelle), ou une simple clé (Nom de l'utilisateur).

Exemples :

DeleteSetting appname:="Ultracalc", section:="Informations personnelles", key:="Nom de l'utilisateur"
DeleteSetting appname:="Ultracalc", section:="Informations personnelles"
DeleteSetting appname:="Ultracalc"

A nouveau, on n'est pas obligé de nommer les paramètres :

DeleteSetting "Ultracalc", "Informations personnelles", "Nom de l'utilisateur"
DeleteSetting "Ultracalc", "Informations personnelles"
DeleteSetting "Ultracalc"

Si on fait une faute d'orthographe, une erreur est générée (Rattrappable avec On Error bien entendu)

Exercice de style : Protection d'une application

Une excellente utilisation de la base de registre pourrait consister à protéger une application. Par exemple, vous livrez à un client un classeur avec plein de macros, mais vous ne savez pas s'il va vous payer pour votre travail de programmation. Vous allez alors faire en sorte que le classeur accepte de s'ouvrir 5 fois, et à la 6ème fois, un message d'erreur "Votre période d'essai est terminée.", et le classeur se ferme automatiquement, le client est obligé de prendre contact avec vous pour que vous le laissiez ouvrir le classeur autant de fois qu'il le désire.

En fait, nous allons créer une clé Version d'essai, dans la section Démarrage, de l'application UltraCalc, qui va être à la base mise sur 0, et qui va s'augmenter de 1 en 1 à chaque ouverture du classeur UlktraCalc.XLS. Pour que ce soit absolument automatique, nous mettrons ce code dans Workbook_Open, qui s'exécutera automatiquement à l'ouverture de UltraCalc.XLS.

Marche à suivre :

  1. Allez dans Excel
  2. Sauvegardez le classeur dans C:\Mes Documents\UltraCalc.XLS
  3. Faites Outils/Macros/Visual Basic Editor
  4. Affichez l'explorateur de projet si nécessaire avec Affichage/Explorateur de projet
  5. Double-cliquez sur ThisWorkBook, qui appartient à VBA Project (UltraCalc.XLS) pour faire apparaître la fenêtre de code
  6. En haut à gauche de cette fenêtre, à la place de General, choisissez Workbook
  7. En haut, plus vers la droite, vérifiez bien que ce soit marqué Open. Vous devriez avoir
    Private Sub Workbook_Open()

    End Sub
    Il s'agit d'une procédure qui va s'exécuter automatiquement lors de l'ouverture de ce classeur. Consultez les événements de feuilles et de classeur si vous désirez en savoir plus sur ces procédures automatiques.

Nous allons commencer par déterminer si cette clé existe. Si elle n'existe pas, il faut la créer, et lui donner 0 comme valeur, et si elle existe, nous allons simplement l'augmenter de 1 à chaque voyage. Allons-y pas à pas. Dans cette première version du programme, nous allons déterminer avec GetSetting si cette clé existe. Vous vous rappelez de Default qui est renvoyé en cas d'inexistance ? Nous allons l'utiliser. Dans ce cas, si vous exécutez ce programme plusieurs fois de suite, vous aurez toujours le message "Première utilisation", puisque GetSetting renvoie inlassablement rien, puisque la clé n'existe pas, et qu'aucun SaveSetting ne vient créer la clé :

Private Sub Workbook_Open()
  If GetSetting(appname:="UltraCalc", section:="Démarrage", key:="Version d'essai", Default:="rien") = "rien" Then
    MsgBox "première utilisation"
  Else
    MsgBox "pas la première utilisation"
  End If
End Sub

Dans cette 2ème version améliorée, nous allons préciser que si justement GetSetting renvoie "rien", alors, avec SaveSetting, il faut mettre cette valeur à 0. Si vous excécutez cette procédure plusieurs fois de suite, la première fois, vous aurez le message "Première utilisation", et toutes les autres fois, vous aurez "Pas la première utilisation"

Private Sub Workbook_Open()
  If GetSetting(appname:="UltraCalc", section:="Démarrage", key:="Version d'essai", Default:="rien") = "rien" Then
    MsgBox "première utilisation"
    SaveSetting appname:="UltraCalc", section:="Démarrage", key:="Version d'essai", setting:=0
  Else
    MsgBox "pas la première utilisation"
  End If
End Sub

Nous savons donc à la fin de cette procédure que la clé existe, et qu'elle a été créée si nécessaire. Les MsgBox sont devenus inutiles. Enlevons-les :

Private Sub Workbook_Open()
  If GetSetting(appname:="UltraCalc", section:="Démarrage", key:="Version d'essai", Default:="rien") = "rien" Then
    SaveSetting appname:="UltraCalc", section:="Démarrage", key:="Version d'essai", setting:=0
  Else
    
  End If
End Sub

Le Ellse est aussi devenu inutile. Finalement, tout ce qui nous importait était de créer la clé si elle n'existait pas. Point !

Private Sub Workbook_Open()
  If GetSetting(appname:="UltraCalc", section:="Démarrage", key:="Version d'essai", Default:="rien") = "rien" Then
    SaveSetting appname:="UltraCalc", section:="Démarrage", key:="Version d'essai", setting:=0
  End If
End Sub

Maintenant, en dessous du End If, qui finalement n'aura eu l'éphémère utilité qu'au premier lancement du programme, nous allons augmenter la valeur de Version D'essai de 1. Attention, la ligne de code est longue :

Private Sub Workbook_Open()
  If GetSetting(appname:="UltraCalc", section:="Démarrage", key:="Version d'essai", Default:="rien") = "rien" Then
    SaveSetting appname:="UltraCalc", section:="Démarrage", key:="Version d'essai", setting:=0
  End If
  SaveSetting appname:="UltraCalc", section:="Démarrage", key:="Version d'essai", setting:=GetSetting(appname:="UltraCalc", section:="Démarrage", key:="Version d'essai") + 1
End Sub

Ici, le Setting:= n'est pas un simple chiffre comme 1, 6 ou 85, mais en fait, la récupération de la clé GetSetting(appname:="UltraCalc", section:="Démarrage", key:="Version d'essai") PLUS UN

Si vous exécutez ce programme 6 fois, alors, la clé de registre sera égale à 6. Faites le, et ensuite, manuellement, allez dans la base de registre (regedit), et supprimez la clé Version D'essai pour pouvoir recommencer depuis 0 notre programme de protection.

Maintenant, il s'agit de donner un message d'erreur et de fermer immédiatement le classeur lorsqu'on dépasse 5 ouvertures de UltraCalc.XLS. Nous allons commencer par simplement afficher si oui ou non on a dépassé la limite des 5 ouvertures. Essayez d'exécuter ce programme 8 fois de suite (vous pouvez cliquer dans le programme et appuyer sur F5, c'est plus rapide). Si vous avez bien pris la peine d'effacer la clé avant de lancer ce programme, vous allez constater que les 5 premières exécution donnent le premier message, et toutes les autres sonnent le 2ème message :

Private Sub Workbook_Open()
  If GetSetting(appname:="UltraCalc", section:="Démarrage", key:="Version d'essai", Default:="rien") = "rien" Then
    SaveSetting appname:="UltraCalc", section:="Démarrage", key:="Version d'essai", setting:=0
  End If

  SaveSetting appname:="UltraCalc", section:="Démarrage", key:="Version d'essai", setting:=GetSetting(appname:="UltraCalc", section:="Démarrage", key:="Version d'essai") + 1
  If GetSetting(appname:="UltraCalc", section:="Démarrage", key:="Version d'essai") <= 5 Then
    MsgBox "vous n'avez pas dépassé la limite"
  Else
    MsgBox "vous AVEZ dépassé la limite"
  End If
End Sub

Bien. Nous allons donc maintenant corriger le programme de manière à ce qu'il ne nous affiche pas bêtement si oui ou non on a dépassé la limite, mais seulement si on l'a dépassée, alors, il s'agit d'avertir l'utilisateur qu'il a dépassé la période d'essai, et que le classeur va être fermé.

Private Sub Workbook_Open()
  If GetSetting(appname:="UltraCalc", section:="Démarrage", key:="Version d'essai", Default:="rien") = "rien" Then
    SaveSetting appname:="UltraCalc", section:="Démarrage", key:="Version d'essai", setting:=0
  End If

  SaveSetting appname:="UltraCalc", section:="Démarrage", key:="Version d'essai", setting:=GetSetting(appname:="UltraCalc", section:="Démarrage", key:="Version d'essai") + 1
  If GetSetting(appname:="UltraCalc", section:="Démarrage", key:="Version d'essai") > 5 Then
    MsgBox "Votre pédiode d'essai est terminée"
    ThisWorkbook.Close

  End If
End Sub

Pour tester réellement ce programme :

  1. Allez dans la base de registre (RegEdit)
  2. Supprimez la clé Version d'Essai
  3. Revenez dans Excel
  4. Fermez UltraCalc
  5. FAITES SEPT FOIS DE SUITTE :
    - Ouvrez UltraCalc
    - Activer les macros : Oui
    - Fermez UltraCalc

Maintenant, normalement, vous êtes bloqué, vous ne pouvez plus entrer dans UltraCalc. Vous avez 3 solutions pour y entrer :

  1. Soit vous allez dans la base de registre pour effacer à nouveau Version d'Essai
  2. Vous répondez Non à la question "Activer les macros"
  3. Vous laissez le doigt sur SHIFT (Majuscule, pas CAPS LOCK !)pendant que vous ouvrez UltraCalc, ce qui vous permet de court-circuiter la macro Workbook_Open

Si vous analysez tout ce que nous venons de faire, c'est bien intéressant, mais il y a évidememnt de grosses failles. C'éait juste un exercice de base pour apprendre à utiliser utilement la base de registre.