• Aucun résultat trouvé

5.7 La boîte à message

Nous l’avons déjà rencontrée dans sa plus simple expression (page 173). En voici une version plus fournie en options. L’une des options consiste à choisir quels boutons seront présents dans la boîte : OK , Annuler , Oui , Non , et pas mal d’autres possibilités qu’il serait trop long de détailler ici. Pour les curieux, toutes ces options apparaissent dans une info-bulle lors de la frappe de l’instruction ; il faut prendre du temps pour les tester.

Le clic sur l’un des boutonsrenvoie une valeur numérique, qui est affectée à une variable, et que l’on doit tester pour décider de la suite à prendre. Impossible donc de retarder plus longtemps l’utilisation d’une structure de programmation classique : l’alternative simple.

La syntaxe générale est

variable = MsgBox("message",type de boîte,"titre",...)

CommeType de boîte, il y a entre autresvbOkCancel,vbOkOnly,vbYesNo,vbYesNoCancel, etc.

les noms sont suffisamment explicites.

Option Explicit Sub message() Dim retour As Byte

retour = MsgBox("message", vbYesNo, "titre")

’ MsgBox retour If retour = 6 Then

MsgBox ("vous avez choisi OUI") Else

If retour = 7 Then

MsgBox ("vous avez choisi NON") End If

End If End Sub

L’affichage du contenu de la variable retour permet de constater que Oui renvoie la valeur 6 et Non renvoie la valeur 7. On s’est contenté dans l’exemple d’afficher le choix de l’utilisateur.

On peut aussi dans chacun des cas appeler une autre macro, ce que nous ne manquerons pas de faire dans des exemples plus sophistiqués, mais il nous faut d’abord passer par d’autres structures de programmation.

6

6 Création de fonctions personnalisées

À toute la panoplie des fonctions d’Excel, il est possible d’ajouter ses propres fonctions.

Une fonction est une macro dont les instructions sont encadrées par une structure Function(...) ... End Function

Entre les parenthèses, on déclare les différents arguments (éventuels) nécessaires à la fonction pour produire un résultat. Le résultat retourné doit être affecté à une variable dont le nom est celui de la fonction.

Voici une fonction appelée hypotenuse qui calcule la longueur de l’hypoténuse d’un triangle rectangle dont on donne la longueur des deux côtés de l’angle droit. Les deux longueurs sont supposées être des nombres positifs, et dans le cas contraire, c’est un message d’erreur qui sera retourné.

Option Explicit

Function hypotenuse(x As Single, y As Single) If (x <= 0 Or y <= 0) Then

hypotenuse = "Erreur"

Else

hypotenuse = Sqr(x * x + y * y) End If

End Function

Après création de cette macro, la fonction hypotenuse peut être utilisée dans des instructions du type

=hypotenuse(3;7)

=hypotenuse(LC[-2];LC[-1])

=hypotenuse(A2;B2)

À priori, une fonction n’est disponible que dans le classeur dans lequel elle a été créée. Il est toutefois possible de la rendre utilisable dans n’importe quel classeur, via une procédure d’enregistrement (du classeur dans lequel on a créé la (les) fonction(s)) en tant queComplément d’Excel. Voici la procédure à suivre :

• Fichier > Enregistrer sous...

Format de fichier : Complément Excel (.xlam)

Choisir un dossier, et donner un nom explicite, par exempleMesFonctions

• Outils > Compléments Excel... > parcourir...

• SélectionnerMesFonctions.xlam > Ouvrir > OK Un exemple de fonction sans argument

On connaît la fonction PI(); voici la fonction e(): Function e()

e = 2.71828182845905 End Function

7

7 Une macro peut en appeler une autre

Méthode classique en programmation : « il faut diviser pour mieux régner ».

Il est en effet plus simple de décomposer un problème complexe en plusieurs problèmes plus simples, ce qui permet par exemple à plusieurs personnes de traiter chacune une partie.

L’instruction d’appel d’une macro est simplement... son nom.

Sub macro_principale() encoder_donnees calculer

imprimer End Sub

Sub encoder_donnees() ...

End Sub

Sub calculer() ...

End Sub

Sub imprimer() ...

End Sub

8

8 Domaine de validité et durée de vie des variables

Il y a trois domaines de validité pour les variables :

1 la macro ou la fonction (variables locales) ; 2 le module (variables globales) ;

3 l’application (variables publiques).

La durée de vie est la période pendant laquelle la variable conserve sa valeur.

Variables locales

Elles sont déclarées au niveau de la macro ou de la fonction au moyen de l’instruction Dim et n’ont de durée de vie que dans cette macro ou fonction (lorsque la macro se termine —End Sub— la variable est « oubliée »).

Variables globales

Elles sont déclarées dans le module, AVANT toute macro ou fonction, également au moyen de l’instruction Dim. Elles sont par conséquent accessibles dans toutes les macros ou fonctions du module, et les contenu peut y être modifié. Elles ont comme durée de vie toutes les macros ou fonction d’un module, et sont « oubliées » lors de l’exécution d’une macro ou fonction d’un autre module.

Option Explicit Sub principale()

Dim x As Integer x = 10

ajouter

MsgBox ("x= " & x) End Sub

MsgBox ("x= " & x) End Sub

Sub ajouter() x = x + 1 End Sub

Dans la situation de gauche, le contenu de x n’aura pas changé et vaudra toujours 10 ; dans celle de droite, x vaudra 11.

Variables publiques

Un programme peut parfois être réparti sur plusieurs feuilles de type Module. Si variables doivent être « partagées » par des macros de plusieurs modules, il faut les déclarer au moyen de l’instruction

Public nom_variable As Type_variable

Remarque

Les macros et fonctions sont publiques par défaut, ce qui explique que lors de l’affectation d’un bouton à une macro, on accède à toutes les macros de tous les modules. Les macros peuvent par conséquent être utilisées dans d’autres modules sans qu’il soit nécessaire de spécifier le mot Public.

Par contre, si l’on souhaite créer une macro dont la durée de vie se limite au seul module dans lequel elle a été créée, il faut la déclarer par l’instruction

Private sub nom_macro()

9

9 Application : gestion d’un journal de classe

Lorsque j’étais encore en activité (d’enseignement), on devait tenir à jour un « journal de classe », un cahier où il fallait renseigner, pour chaque classe et à chaque date de cours, le sujet de la leçon. En cas d’inspection, c’était un document justificatif important à montrer, mais aussi un document de travail personnel permettant de se rappeler des notions vues, des devoirs donnés, de voir l’évolution, bref, tout ce qui peut concerner un cours.

Voici venu le temps des nouvelles technologies ; renseignements pris, il semblerait que beaucoup d’écoles optent pour une application « plateforme numérique » qui gère aussi le journal de classe des enseignants... mais on fera quand-même l’exercice !

L’idée est la suivante : dans la première feuille du classeur que nous nommerons horaire, on reproduit l’horaire hebdomadaire dans lequel sont renseignés les jours, les heures, ainsi que les

intitulés de cours et/ou de classes. En cliquant sur un bouton, on voudrait activer la feuille correspondant à la classe ou au cours, avec, ou non, l’insertion automatique de la date du jour au bon endroit, et activation de la bonne cellule pour y écrire le sujet du cours.

Dans l’application, seuls les contenus des cellules avec les cours et/ou les classes sont impor-tants : ils ne peuvent pas contenir d’espace ; c’est la seule restriction. Peu importe l’endroit où se trouve le tableau, peu importe les mises en forme, bordures, couleurs, police, textes des jours, des heures.

Il faudra également une feuille pour chaque cours/classe différent, en l’occurrence pour l’exemple ci-dessus, une feuille 6A, une feuille 5B, et une feuille 5C-info. Il est impératif que le nom de la feuille soit absolument identique au texte du cours/classe dans la cellule de l’horaire. Par facilité, ces « préparatifs » peuvent être faits manuellement, au préalable.

On s’est limité au minimum nécessaire pour le contenu de chaque feuille ; l’essentiel est que l’on se souvienne de l’adresse de la cellule qui contiendra la première date, à savoir ici L3C1.

Toutefois, pour les mordus de l’automatisation, on détaillera la mise au point d’une macro pour créer une feuille correspondant au contenu de la cellule active de l’horaire, et en y inscrivant le minimum comme le montre la figure ci-avant.