27 juillet 2011

Excel: Variables, objets et interaction avec l'utilisateur

Tu dois devenir capable de

Savoir

  1. Expliquer la notion de variable en informatique
  2. Expliquer l'importance de la notion de type de variables.

Savoir faire

  1. Examiner le contenu des variables dans la fenêtre des variables locales d'Excel.
  2. Ecrire des procédure pour déposer le contenu des variables dans les cellules des feuilles de calcul.
  3. Ecrire correctement les valeurs "texte" à déposer dans les variables
  4. Ecrire correctement les valeurs "date" à déposer dans les variables
  5. Examiner et modifier les propriétés des objets "à la main" et par procédure
  6. Réaliser des interactions entre les procédures et l'utilisateur et inversement.


Notion de variable en VBA

Une variable est une portion de la mémoire centrale de l'ordinateur et qui est susceptible d'accueillir une valeur.
Cette valeur peut être réutilisée plus tard dans l'exécution d'une procédure.
  • Ouvre un nouveau classeur Excel
  • Dans le menu Outils, sélectionne la commande Macro puis l'option Macros...
  • Dans la zone Nom de la macro, indique TesteVariables

  • Clique ensuite le bouton Créer
  • La fenêtre de l'éditeur VBA s'ouvre: le curseur de texte attend tes premières frappes entre les marqueurs de début et de fin de la procédure TesteVariables

  • Entre ces deux marqueurs, frappe le texte sur le modèle suivant

Il est très important de respecter scrupuleusement les symboles utilisés et l'orthographe du texte.


La procédure est maintenant en place. Nous allons pouvoir examiner ce qu'elle fait en l'exécutant pas à pas.

  • Place le curseur de texte dans le texte de la procédure
  • Frappe la touche F8 pour démarrer l'exécution pas à pas
  • Frappe encore cette touche 7 fois de suite de manière à exécuter l'ensemble des instructions
  • Au cas où un message d'erreur intervient durant la manipulation, vérifie que ton texte correspond parfaitement à ce qui est indiqué plus haut.

- J'ai un peu l'impression que l'on se moque de moi là... Il ne s'est rien passé du tout durant l'exécution de ces instructions.

- Il ne s'est rien passé? Je ne serais pas si formel.
Simplement, ce qui s'est passé n'est pas directement visible: tout s'est déroulé en coulisses, dans la mémoire de l'ordinateur.

- Pas très impressionnant, du coup. Et il n'y a vraiment aucun moyen de voir ce qui s'y passe, dans cette mémoire?

- Heureusement si! On peut soulever un coin du voile, si l'on veut.


Quand la procédure TesteVariables fonctionne sans erreur, passe à l'étape suivante.

Voir les variables en coulisses

La procédure TesteVariables fonctionne parfaitement. Nous allons maintenant passer à l'intérieur de la mémoire pour voir comment elle fonctionne.
  • Vérifie que l'éditeur VBA est toujours bien actif
  • Dans le menu Affichage, sélectionne la commande Fenêtre Variables locales
  • Une nouvelle fenêtre intitulée Variables locales apparaît, vide pour l'instant

  • Cette fenêtre étant bien visible, exécute à nouveau la procédure TesteVariables en mode Pas à pas: le curseur de texte étant dans le texe de la procédure, frappe la touche F8.

Le contenu de la fenêtre Variables locales se modifie: les différents noms donnés dans l'éditeur VBA apparaissent à côté de la mention Variant/Empty

  • Frappe la touche F8 pour déclencher la première instruction.

Dans la colonne Valeur de la ligne MaVariable, la valeur 500 apparaît. Dans la colonne Type de la ligne MaVariable, la mention Integer s'affiche.

  • Frappe la touche F8 pour déclencher la deuxième instruction, et ainsi de suite.
  • Continue d'observer le contenu de la fenêtre Variables locales lors de l'exécution des différentes instructions.

A la fin, la fenêtre se présente comme ci-dessous.

Lorsque le marqueur de fin de procédure est dépassé, la fenêtre se vide.


Que faut-il retenir de cette expérience?

1 Les entités nommées MaVariable, Toto, MonNom, LaDate dans l'exemple ci-dessous sont des VARIABLES.
2 Une variable est une portion de la mémoire centrale de l'ordinateur dans laquelle on peut déposer une information.
3

L'information déposée dans une variable est généralement caractérisée par son type:

  • Integer: il s'agit d'un nombre entier
  • String: il s'agit d'une "chaîne" de caractères, un mot, une phrase,...
  • Date: ... :o)
  • ...

Excel admet encore beaucoup d'autres types.

4 L'information déposée dans une variable peut... changer s'il est prévu qu'elle change dans la procédure qui l'utilise.
5 A la fin de l'exécution de la procédure, la variable perd sa valeur.

Quand tu as parfaitement compris ce qui se passe lors de l'exécution de la procédure TesteVariables, passe à l'étape suivante.

Les variables peuvent communiquer avec les feuilles de calculs

Dans l'exemple précédent, nous avons vu que les variables existent dans le monde de la mémoire centrale. Existe-t-il cependant un moyen de les faire communiquer avec le monde des feuilles de calculs?

Les variables transmettent des valeurs

  • Sur une feuille de calculs vierge, introduis les informations indiquées sur l'exemple ci-dessous. Indique ton âge dans la cellule B1.

  • Démarre la rédaction manuelle d'une nouvelle procédure, selon la méthode déjà expliquée précédemment: cette procédure s'appellera CalculAge.
  • Sur la première ligne, écris le texte MonAge =
  • Derrière le signe =, frappe Ctrl+Espace

Une liste déroulante apparaît: elle présente les noms des procédures et des objets qui peuvent être utilisés ici:

  • Frappe la lettre R (première lettre du mot Range) et sélectionne l'objet Range
  • Frappe la touche de tabulation; le mot-clef Range s'ajoute au texte
  • Frappe une parenthèse ouvrante

Une nouvelle aide apparaît pour indiquer les informations suivantes à fournir

Ici, nous sommes avertis qu'une référence de cellule est attendue.

  • Indique la référence MonAge = Range("B1")
  • Frappe un point

Une liste déroulante apparaît. Elle nous présente toutes les méthodes et les propriétés que l'on peut indiquer maintenant.

  • Frappe la lettre V (première lettre de la propriété Value)
  • Frappe la touche de tabulation: la ligne se complète
  • En utilisant les mêmes procédés, termine la rédaction du texte de cette procédure selon l'exemple présenté ci-dessous:

  • Peux-tu prévoir ce que fait cette procédure? Réfléchis quelques instants avant de poursuivre.

La procédure CalculAge:

  • dépose le contenu de la cellule B1 dans la variable MonAge;
  • ajoute deux unités à la valeur de MonAge et dépose le résultat du calcul dans la cellule B2
  • dépose la valeur de la variable MonAge dans la cellule B3. Cette valeur n'a pas changé depuis la première ligne.

Exécute la procédure en mode Pas à pas


Les variables transmettent des formules

  • modifie le texte de la procédure CalculAge selon les indications données ci-dessous

Peux-tu prévoir ce que fait cette procédure? Réfléchis quelques instants avant de poursuivre. Quelle différence avec la version précédente?

  • Exécute la procédure en mode Pas à pas.

Quand tu as bien compris les deux versions de la procédure CalculAge, passe à l'étape suivante.

Les variables et leurs types

A l'étape précédente, nous avons pu voir que le logiciel Excel distingue les variables selon leur type. Quelques expériences complémentaires vont nous permettre de mieux comprendre ce point.

Les variables numériques et leurs types

  • Démarre l'éditeur de code VBA selon la méthode utilisée précédemment dans cette leçon.
  • Dans l'éditeur, frappe le texte de la procédure TypesVariables comme illustré ci-dessous. Sois attentif à l'écriture de la valeur 2.13, avec un point et non une virgule.

  • Visualise la fenêtre des Variables locales en utilisant la méthode expliquée précédemment dans cette leçon.
  • Exécute la procédure en mode Pas à pas en frappant la touche F8. A chaque frappe, sois attentif aux informations données dans la fenêtre des Variables locales.

Après l'exécution des deux premières lignes, la fenêtre des variables locales se présente comme sur l'illustration ci-dessous:

La variable MaVariable est de type Integer (un nombre entier); la variable TaVariable est du type Double.

Les variables de type Double sont conçues pour recevoir des valeurs appartenant à l'ensemble des réels (au sens mathématique).
Dans une variable de type Double, le nombre est codé sur 8 octets. Cela permet d'y déposer des nombres compris entre
-1,79769313486231.10308 et -4,94065645841247.10-324 pour les nombres négatifs
et entre
4,94065645841247.10-324 et 1,79769313486231.10308 pour les positifs.

Il existe aussi le type Single qui permet de recevoir des nombres compris entre
-3,402823.1038 et -1,401298.10-45 pour les nombres négatifs
et entre
1,401298.10-45 et 3,402823.1038 pour les positifs.

Dans le cadre de cette leçon, nous n'aurons pas à nous soucier de ces subtilités: nous laisserons la gestion des types de variables au logiciel.


Ecrire correctement les valeurs "texte" à déposer dans les variables

  • Sélectionne l'éditeur de code VBA si nécessaire.
  • Dans l'éditeur, frappe le texte de la procédure TypeTexte comme illustré ci-dessous.

  • Exécute les instructions en mode Pas à pas en examinant le contenu de la fenêtre Variables locales.

A la première ligne, la variable TaVariable reçoit la valeur Bonjour le monde. Remarque les guillemets.

A la deuxième ligne, le contenu de la variable TaVariable est déposé dans MaVariable.
Remarque que pour désigner le contenu de la variable on utilise simplement son nom, sans guillemets.

A la troisième ligne, c'est bien le texte "TaVariable" qui est envoyé dans MaVariable.
Pour indiquer qu'il s'agit bien d'un texte, on utilise les guillemets.

Dans l'éditeur VBA, les textes qui doivent être affectés à des variables sont entourés de guillemets.
Pour désigner une variable, on n'utilise jamais de guillemets.


Ecrire correctement les valeurs "date" à déposer dans les variables

  • Sélectionne l'éditeur de code VBA si nécessaire.
  • Dans l'éditeur, frappe le texte de la procédure TypeDate comme illustré ci-dessous.

  • Exécute la procédure en mode Pas à pas en examinant attentivement le contenu de la fenêtre Variables locales.

- Oups! Mais c'est n'importe quoi cette histoire. Quelqu'un peut m'expliquer la raison pour laquelle cette valeur 1,797.10-3 vient se mettre dans la variable?

- Très simple: c'est le résultat de l'opération de division de 18 par 5 divisé par 2003.
Le problème, c'est que nous n'avions pas précisé qu'il s'agissait d'une date. Excel a donc considéré qu'il s'agit simplement d'un calcul... qu'il effectue sans problème.

- Et on s'en tire comment alors?

- Cela reste très simple: on entoure la valeur de type date d'un signe de reconnaissance: le signe #.

  • Dans l'éditeur VBA, modifie la ligne d'instruction de la procédure TypeDate en

MaVariable = #18/05/2003#

  • Exécute la procédure Pas à pas.

Tout se passe maintenant correctement.

Dans l'éditeur VBA, les dates qui doivent être affectés à des variables sont entourés de signes #.


Quand tu as bien en tête la façon de traiter les valeurs de type "texte" et de type "date" en VBA, passe à l'étape suivante.

Examiner et modifier les propriétés des objets

Nous sommes maintenant capables d'examiner le contenu des variables à tout moment de l'exécution d'une procédure.

Il est également possible d'examiner les objets et leurs propriétés.


Examen et modification manuelle des propriétés

  • Ouvre un nouveau classeur Excel.
  • Dans la cellule A1 de la Feuil1, frappe la formule "=A2+2"
  • Dans la cellule A2, indique la valeur 10.

Puisque A2 contient 10, le contenu de A1 vaut donc 12.

  • Si nécessaire, démarre l'éditeur de code VBA selon la méthode utilisée précédemment dans cette leçon.
  • Dans l'éditeur, frappe le début du texte de la procédure ExamineObjet selon le modèle proposé ci-dessous

La syntaxe utilisée est semblable à celle que nous avons employée lors de l'affectation d'une variable. Remarque cependant la différence avec l'emploi du mot clef Set.
L'objet Range("A1") est affecté à la variable UnObjet.

  • Vérifie que la fenêtre des Variables locales soit visible à l'écran.
  • Exécute la macro en mode Pas à pas.

Dans la fenêtre des variables locales, nous voyons apparaître la mention de la variable précédée d'un signe qui indique la présence d'une liste à ouvrir:

  • Clique sur le signe qui précède la mention UnObjet

La liste des propriétés de l'objet UnObjet apparaît

Certaines de ces propriétés sont elles-mêmes de objets (vu dans une leçon précédente) .

  • Sélectionne la propriété ColumnWidth puis clique sur la valeur 10,71 qui lui est attribuée actuellement.
  • Change cette valeur en 20.
  • Remarque que la colonne qui contient la cellule A1 s'est élargie.

On voit donc que nous pouvons modifier les propriétés "à la main".

  • Dans la liste des propriétés, recherche Formula et modifie sa valeur à "=A2*2".

Note la modification dans la feuille de calculs.

  • Dans la liste des propriétés, recheche Value et modifie sa valeur à 55.

Note que la formule disparaît de la cellule A1 et fait place à la valeur indiquée.


Modification des propriétés dans une procédure

Si les propriétés peuvent être modifiées "à la main", il est aussi possible de les modifier dans une procédure.


Exemple 1:
  • Dans la cellule A1 de la feuille de calculs active, indique la valeur 0.
  • Retourne dans l'éditeur de code VBA.
  • Dans l'éditeur, frappe le texte de la procédure ModifProp selon le modèle proposé ci-dessous:

  • Exécute la macro en mode Pas à pas.
  • Examine le contenu de la cellule A1.

D'autres propriétés peuvent être modifiées de la même façon.

Exemple 2

  • Retourne dans l'éditeur de code VBA.
  • Dans l'éditeur, modifie le texte de la procédure ModifProp selon le modèle proposé ci-dessous:

Peux-tu prévoir ce qui va se passer lors de l'exécution? Réfléchis quelques instants avant de lancer la procédure.

Exemple 3

  • Retourne dans l'éditeur de code VBA.
  • Dans l'éditeur, modifie le texte de la procédure ModifProp selon le modèle proposé ci-dessous:

Pour la valeur du paramète ColorIndex, tu peux indiquer un chiffre compris entre 1 et 56 de la palette ci-dessous.

Exemple 4

  • Retourne dans l'éditeur de code VBA.
  • Dans l'éditeur, modifie le texte de la procédure ModifProp selon le modèle proposé ci-dessous:

Peux-tu prévoir ce qui va se passer lors de l'exécution? Réfléchis quelques instants avant de lancer la procédure.


Toutes les propriétés des objets ne peuvent être modifiées: dans ce cas, elles sont dites "en lecture seule".
Quand tu as examiné quelques propriétés d'objets et que tu es capable de les modifier "à la main" et par une procédure, passe à l'étape suivante.

Interaction avec l'utilisateur: l'ordinateur vous parle

A ce point de la leçon, nous avons appris à manipuler les variables et à voir leur contenu dans la fenêtre des variables locales.
Nous savons aussi comment la valeur d'une variable peut être déposée dans une cellule d'une feuille de calculs.
Nous allons maintenant apprendre à faire en sorte que les procédures puissent afficher la valeur d'une variable dans une boîte de dialogue.

VBA prévoit une fonction appelée MsgBox et dont le rôle est de délivrer de courts messages à l'utilisateur.

Comme il s'agit d'une fonction, elle demande un certain nombre de paramètres et renvoie une valeur.

  • Si nécessaire, démarre l'éditeur de code VBA selon la méthode utilisée précédemment dans cette leçon.
  • Dans l'éditeur, frappe le début du texte de la procédure Message selon le modèle suivant:

  • Immédiatement derrière le mot MsgBox, frappe une parenthèse ouvrante.

Un aide-mémoire des paramètres possibles apparaît. Le premier paramètre s'appelle Prompt: il s'agit du message à délivrer à l'écran. Le terme français "prompteur" (utilisé par le présentateur TV) dérive de ce mot.

  • Frappe le message à déliver à l'utilisateur sur le modèle ci-dessous:

  • Frappe ensuite une virgule. Un aide mémoire encore plus complet pour le prochain paramètre apparaît:

Comme le nom du paramètre le laisse penser (Buttons), il s'agit maintenant de préciser le type de boutons qui figureront dans la boîte de dialogue.

  • Dans la liste déroulante des types de boutons, sélectionne vbYesNo afin d'obtenir les deux boutons Oui et Non. Frappe la touche de tabulation pour accepter.
  • Frappe une virgule.

La nature du paramètre suivant apparaît dans l'aide-mémoire: il s'agit du titre de la boîte de dialogue:

  • Frappe la phrase "La météo du jour". Comme il s'agit d'un texte, il ne faut pas oublier de frapper des guillemets.

En VBA, tous les paramètres ne sont pas obligatoires. Dans le cadre de cette leçon, nous ne préciserons pas les paramètres ultérieurs.

  • Frappe une parenthèse fermante pour terminer la rédaction du texte de la procédure.

  • Vérifie que la fenêtre des Variables locales soit visible à l'écran.
  • Exécute deux fois la macro en mode Pas à pas.

  • A la première exécution, actionne le bouton Oui. A la deuxième exécution, le bouton Non. Sois attentif à la valeur de la variable Reponse donnée dans la fenêtre des Variables locales.

La fonction MsgBox renvoie donc une valeur différente selon le bouton actionné. Cette valeur peut éventuellemênt être utilisée ensuite.

  • Modifie la valeur du paramètre Buttons et observe la valeur retournée par la fonction selon le bouton actionné.

Certaines valeurs de ce paramètre permettent d'ajouter des icones dans la boîte de dialogue: vbQuestion, vbCritical. On peut additionner les arguments de manière à faire apparaître des combinaisons d'icones et de boutons: vbCritical + vbRetryCancel, ...

- Comique. J'ai envie d'essayer de cumuler vbYesNo et vbYesNoCancel, comme ça pour voir.

- Toutes les combinaisons ne sont pas possibles, question de logique. Ici, le résultat sera plutôt étonnant: seul un bouton OK apparaît.


Comment faudrait-il faire pour qu'une boîte de dialogue annonce le contenu de la cellule A1?
Etablis le texte de la procédure MessageCellule qui permet cela. Seul le bouton OK doit apparaître.
Quand ta procédure MessageCellule fonctionne, passe à l'étape suivante.

Interaction avec l'utilisateur: parler à l'ordinateur

A ce point, nous savons comment recevoir des informations de l'ordinateur par l'intermédiaire des feuilles de calcul ou des boîtes de messages.

Nous allons maintenant voir comment nous pouvons fournir des informations à l'ordinateur de manière interactive.


VBA prévoit une fonction appelée InputBox et dont le rôle est de demander des informations à l'utilisateur.

Comme il s'agit d'une fonction, elle demande un certain nombre de paramètres et renvoie une valeur.

  • Si nécessaire, démarre l'éditeur de code VBA selon la méthode utilisée précédemment dans cette leçon.
  • Dans l'éditeur, frappe le début du texte de la procédure BoîteDonnées selon le modèle suivant:

  • Immédiatement derrière le mot InputBox, frappe une parenthèse ouvrante.

Un aide-mémoire des paramètres possibles apparaît. Le premier paramètre s'appelle Prompt, comme dans le cas de la MsgBox.

  • Frappe le message à délivrer à l'utilisateur sur le modèle ci-dessous:

  • Frappe une virgule, suivie du titre de la boîte de dialogue "La météo du jour".
  • Frappe une nouvelle virgule.

Le paramètre suivant s'intitule Default. Il s'agit d'indiquer maintenant une réponse par défaut à la question posée: la réponse qui est prise en compte si l'utilisateur ne répond pas.

  • Frappe le texte "Couci, couça" suivi d'une virgule.

Les deux paramètres suivants intitulés XPos et YPos représentent la position de la boîte de dialogue à l'écran, exprimée en "twips".

    Un "twip" est une unité de mesure en typographie, définie comme un vingtième de point ("twentieth of a point").
    Le point est une autre unité de mesure en typographie: 1 point = 1/72e de pouce.
    1 twip est donc 1/72/20 pouce = 1/1440 pouce
    1 pouce = 2,54 cm, donc 1 twip = 2,54cm/1440 = 0,00176 cm

Le twip est donc une très petite unité de longueur.

  • Indique les valeurs 2000 et 3000 pour ces deux paramètres.

En VBA, tous les paramètres ne sont pas obligatoires. Dans le cadre de cette leçon, nous ne préciserons pas les paramètres suivants.

  • Frappe une parenthèse fermante pour terminer la rédaction du texte de la procédure.
  • Vérifie que la fenêtre des Variables locales soit visible à l'écran.
  • Exécute la macro en mode Pas à pas en modifiant la réponse par défaut:

  • Note la valeur de la variable Reponse à l'issue de l'exécution de la procédure.
  • Exécute une nouvelle fois la procédure en conservant la réponse par défaut.
  • Exécute une troisième fois la procédure en donnant une autre réponse.

Comment faudrait-il faire pour qu'une boîte de dialogue pose une question qui serait indiquée dans la cellule A1 d'une feuille de calculs. La réponse par défaut serait dans la cellule A2.
Finalement, la nouvelle réponse viendrait remplacer l'ancienne réponse par défaut.
Quand ta procédure fonctionne, passe à l'étape suivante.

Exercices

Résous les exercices suivants en respectant les contraintes qui sont données.

  1. La cellule A1 d'une feuille de calcul contient une valeur. Ecrire une procédure qui envoie le contenu de A1 vers la cellule B7 sans utiliser le presse-papiers.
  2. Les cellules A1 et A2 d'une feuille de calcul contiennent chacune une valeur différente. Ecrire une procédure qui réalise l'échange des contenus des deux cellules: le contenu de A1 passe en A2 et inversement.
  3. Une procédure demande le montant d'un placement ainsi que le taux d'intérêt annuel. Elle indique en réponse la valeur du placement après un an. Cette procédure n'utilise pas les feuilles de calcul.
  4. Une procédure demande les références d'une cellule de la feuille de calcul active et la valeur qu'il faut y placer. Elle place ensuite cette valeur dans la cellule demandée.
    Cette procédure peut-elle également fonctionner avec des plages étendues de cellules?

Aucun commentaire:

Enregistrer un commentaire