PROGRAMMATION EN VBA(*) POUR EXCEL - EXERCICES U.F.R. D'INFORMATIQUE Christine MARTIN

 
CONTINUER À LIRE
AGROPARISTECH

 PROGRAMMATION EN VBA(*)
       POUR EXCEL
                                            EXERCICES

                             U.F.R. D’INFORMATIQUE
                                          Christine MARTIN
                                            Année 2012-2013

Document inspiré du cours de Juliette Dibie-Barthelemy (Janvier 2008)
* Visual Basic pour Applications                                        1
1 Premiers pas …

Nous allons créer une macro macro_entete qui écrit dans la cellule A1 le texte « EGE » en
caractères gras, dans la cellule B1 « Informations clients» et dans la cellule G1 la date du jour en
caractères italiques.

Pour cela nous allons utiliser un outil d’Excel qui permet de générer des programmes VBA par
conversion des actions élémentaires faites par l’utilisateur en différentes instructions VBA c'est-à-
dire dans un langage compréhensible par la machine.

Pour plus de détails et découvrir comment accéder à l’enregistreur, référez vous à la section 1.1 du
document joint.

Avant de commencer l’enregistrement, il faut se poser plusieurs questions :

   penser à la manière d’effectuer les opérations manuelles ;

   se demander quand commencer l’enregistrement. Dans notre cas, la sélection de la cellule A1
    fait partie de l’enregistrement puisqu’on veut que le texte « EGE » se trouve dans cette cellule. Si
    l’enregistrement ne commence pas par la sélection de la cellule A1, le texte tapé est écrit dans la
    cellule active au moment où l’enregistreur est lancé.

   se demander quand arrêter l’enregistrement.

Remarque : Si vous souhaitez qu’une macro soit utilisable dans Excel quels que soient les classeurs
ouverts, enregistrez là dans votre classeur personnel (cf. ENREGISTRER LA MACRO DANS). Pour ce module,
nous ferons les enregistrements dans le classeur courant.

Une fois votre macro enregistrée vérifiez que son comportement correspond à vos attentes en la
lançant (cf. section 1.1.2).

2 Références relatives

Il existe deux modes de repérages des cellules dans un programme VBA, le mode absolu et le mode
relatif. Dans l’exercice précédent, vous avez utilisé (sans le savoir) le mode absolu c'est-à-dire que
quel que soit l’état de votre système au moment où vous lancez votre macro, les textes seront
toujours écris dans les mêmes cellules (positionnement absolu). Or, dans certains cas, il est utile que
le résultat d’une macro dépende de ce qui a déjà été effectué auparavant et donc que le placement
des actions de la macro soit déterminé de manière relative par rapport à cela. La commande pour
accéder à ce mode est détaillée en section 1.1.1.

Exercices d’application :

                                                                                                      2
1. Enregistrer une macro nommée macro_mise_en_page qui écrit les éléments suivants :
       Produits, Quantités, Total en colonne à partir de la cellule active. Utiliser l’enregistreur de
       macro avec référence relative aux cellules.

    2. Enregistrer une macro nommée macro_copie qui copie le contenu de la cellule active
       dans la cellule qui se trouve dans la même colonne et 2 lignes plus bas que la cellule active.

    3. Enregistrer une macro nommée macro_lie qui la cellule active à la cellule en même place
       dans la feuille précédente.

    4. Enregistrer une macro nommée macro_stat qui fournit dans les cellules A12 et A13
       respectivement la moyenne et l’écart-type des nombres contenus dans les colonnes A1-A10.

    5. Enregistrer une macro nommée macro_batons qui insère dans la feuille courante le
       diagramme en bâton pour les cellules A1-A10.

3 Modifier ses macros … Environnement de développement
L’enregistreur de macros permet principalement de créer des macros simples et de découvrir les
instructions rattachées à une action donnée. Pour aller plus loin, il faut apprendre à se servir de
l’environnement de développement (cf. section 1.2) pour accéder aux programmes générés, les
analyser et les modifier en fonction de nos besoins.

Par exemple, la macro macro_mise_en_page qui vous avez enregistrée précédemment doit avoir à
peu près le code suivant :

        Sub macro_mise_en_page()
            ActiveCell.FormulaR1C1 = "Produits"
            ActiveCell.Offset(1, 0).Range("A1").Select
            ActiveCell.FormulaR1C1 = "Quantités"
            ActiveCell.Offset(1, 0).Range("A1").Select
            ActiveCell.FormulaR1C1 = "Total"
        End Sub

L'instruction ActiveCell.Offset(1,0).Range("A1").Select sélectionne (Select) une cellule (Range) qui est
sur une ligne en dessous et sur la même colonne (Offset(déplacement_ligne, déplacement_colonne))
que la cellule active (ActiveCell).

L'instruction ActiveCell.Offset(1,0).Range("A1").Select peut être remplacée par l’instruction
ActiveCell.Offset(1,0).Select.

Pour vous rendre compte de cela par vous-même, depuis l’éditeur VBA placez-vous sur la procédure
macro_mise_en_page et appuyez sur la touche F8. La première ligne de la macro est surlignée en
jaune. Si vous appuyez à nouveau sur F8, celle-ci est exécutée. Vous pouvez alors voir dans le
classeur quels en ont été les effets. Et en procédant de même pour toutes les instructions produites
découvrir leurs sens.

                                                                                                      3
1. Faîtes ainsi pour tous vos programmes enregistrés précédemment.

    2. Modifier ensuite la macro macro_mise_en_page pour que Remise soit écrit, en
       caractères gras et italiques, dans la cellule qui se trouve dans la colonne de droite et sur la
       ligne juste au dessus de celle de la cellule où est écrit Produits comme dans le schéma ci-
       dessous.

                                                      Remise
                            Produits
                            Quantités
                            Total

    3. Ecrire une nouvelle macro nommée macro_mep_absolue qui réalise les mêmes
       instructions mais toujours à partir de la cellule A3.

    4. Ecrire une macro macro_cout qui permet de calculer le coût d’un achat
       (quantité*prix_unitaire) à partir des valeurs contenues dans les cellules A1 et B1 de la feuille
       courante. Le résultat sera écrit dans la cellule C1.

    5. Expliquer ce que fait la macro suivante ?

                       Sub macro_selection()
                           Range("A1:B6").Select
                           Selection.Font.Bold = True
                           Selection.Value = "Bonjour"
                       End Sub

        Compléter cette macro pour que Bonsoir soit écrit dans la cellule B6, que le cadre contenant
        toutes les cellules renseignées soit coloré en rouge et que le texte de la première ligne soit
        en gras et en italique.
        Astuce : servez-vous de l’enregistreur de macro pour connaître, par exemple, les instructions
        permettant de faire un contour rouge.

4 Les objets Excel, les variables et les fonctions intégrées
Les macros enregistrées lors des exercices des sections précédentes nous ont permis de découvrir
quelques instructions utiles notamment pour la manipulation des cellules (sélection, décalage,
écriture, …). VBA permet plus généralement d’accéder à un très grand nombre d’entités (objets)
présentes sous Excel (classeur, feuille de calcul, cellules, menus, fonctions intégrées …) (cf. section 2).
La liste des objets disponibles et actions possibles est très grand et la connaître par cœur ne présente
pas d’intérêt. Il faut en revanche savoir où chercher les instructions nécessaires à la résolution d’un
problème. Comme on l’a vu précédemment, l’enregistreur de macro est un moyen mis à notre
disposition pour cela. Il existe de plus un outil de recherche nommé l’Explorateur d’Objets (cf. section
2.7).

Exercices d’application :

                                                                                                         4
1. Ecrire une macro qui affecte à la cellule B2 de la deuxième feuille de calcul de votre classeur
       courant la valeur de la cellule active. Puis qui sélectionne la cellule B2 de la première feuille
       de calcul. Testez votre macro.
    2. Ecrire une macro qui écrit en place identique dans la feuille suivante le résultat de la fonction
       exponentielle sur la valeur contenue dans la case active.

5 Les variables

Les variables permettent de stocker de l’information indépendamment des feuilles de calcul d’Excel
(cf. section 3.1). Comme indiqué dans le document joint, forcer toujours la déclaration des variables
en inscrivant en première ligne de votre module de code « Option Explicit ».

En vous servant de variables, écrivez une procédure qui permet de permuter les contenus des
cellules A1 et B1.

6 Les procédures avec paramètres
Jusqu’à présent nous n’avons créé que des procédures (ensemble nommé d’instructions ne
renvoyant pas de valeur) sans arguments c'est-à-dire ne nécessitant pas d’apport d’information
extérieure pour réaliser leurs tâches. Cependant, souvent, lorsque l’on souhaite que l’action d’une
procédure dépende d’un contexte, de l’information sur ce contexte doit être apportée en entrée de
la procédure sous forme de paramètres (cf. section 1.1.2).

Exercices d’application :

    1. En s’aidant éventuellement de l’aide en ligne de l’éditeur de Visual Basic mais sans tenter de
       l’exécuter, expliquer ce que fait cette procédure.

        Sub QueFaisJe(ByVal Sh As Object)
              Dim NbFeuilles As Integer
              Dim n As Integer
              Dim nom As String
              Dim chaine As String
              NbFeuilles = ThisWorkbook.Sheets.Count
              n = Sh.Index
              nom = Sh.Name
              chaine = "Feuille " & n & "/" & NbFeuilles & " : " & nom
              Range("A1").Value = chaine
        End Sub

    2. Ecrire une procédure permettant de lancer la procédure QueFaisJe.

    3. Modifier la macro macro_entete afin qu’elle prenne en paramètres le nom de spécialité
       et le titre à afficher.
       Testez votre procédure (attention elle n’est pas exécutable directement ! cf. section 1.1.2).

                                                                                                      5
7 Les fonctions
VBA offre la possibilité d’utiliser dans les procédures des fonctions intégrées d’Excel mais aussi de
créer ses propres fonctions (cf. section 3.2). A la différence des procédures, les fonctions permettent
de renvoyer un résultat soit à un autre programme soit directement à Excel si la fonction est utilisée
depuis une cellule (cf. section 3.2.2).

Par exemple, si vous êtes amenés à effectuer souvent un calcul qui suit une même formule et qui
n’est pas disponible a priori dans Excel, alors vous n’aurez qu’à créer la fonction correspondante,
une fois, dans un module de code de votre classeur personnel et ainsi chaque fois que vous aurez
besoin d’effectuer ce calcul et quels que soient les classeurs ouverts à ce moment là, votre fonction
sera disponible et utilisable.

Exercices d’application :

    1. Ecrire une fonction qui permet de calculer la surface d’un rectangle (hauteur*largeur) et la
       tester dans EXCEL.
    2. Ecrire une fonction permettant de calculer l’écart entre la valeur maximale et la valeur
       minimale d’une plage de cellules passée en argument à l’aide des fonctions intégrées d’EXCEL
       Max et Min et la tester dans EXCEL.

8 Les conditions
Fréquemment dans un programme on souhaite que certaines tâches (instructions) soient réalisées
dans certains cas et pas dans d’autres (cf. section 3.3).

Exercice d’application :

Ecrire une procédure qui teste si la cellule active est vide ou non. Si elle n’est pas vide, la procédure
affiche dans la cellule suivante le message : « la cellule à ma gauche n’est pas vide ! ».

Il existe en VBA une méthode qui indique si la cellule sur laquelle elle est appliquée est vide ou non.
Aidez-vous de l’explorateur d’objet pour identifier cette fonction (vide en anglais se dit « empty »).

9 Les répétitions
Il est fréquent en programmation d’avoir à répéter sous certaines conditions les mêmes actions, pour
cela VBA dispose de plusieurs éléments (cf. section 3.4).

Exercices d’application :

    1. Ecrire une procédure qui permet de calculer les éléments de détail d’une facture tant que les
       valeurs de prix et de quantité situées dans les colonnes A et B sont connues (les cellules ne
       sont pas vides) et inscrit les résultats dans la colonne C.

    2. Complétez votre procédure précédente pour prendre en compte les cas où les cellules ne
       contiendraient pas des nombres (aidez-vous de l’explorateur d’objets).
                                                                                                       6
3. Ecrire la fonction compte_lignes qui permet de compter le nombre de lignes de la plage
       de cellules MaPlage passée en argument et la tester dans EXCEL.

        Prototype : Function compte_lignes(MaPlage As Range) As Integer

        Vous pourrez utiliser la boucle For Each...Next pour parcourir les lignes de la plage de cellules
        MaPlage (propriété Rows de l’objet Range).

        Votre solution ne devra pas utiliser la méthode Count de l’objet Range.

    4. Ecrire une procédure, qui pour la plage de cellules active, écrit « pleine » dans toutes les
       cellules vides et efface le contenu de toutes les cellules pleines.

Les tableaux

Un tableau est une variable permettant de stocker plusieurs valeurs.

La déclaration d’un tableau précise le nombre d’éléments du tableau et éventuellement leur type :

        Dim NomTableau(dimension) [As Type]

On appelle taille d’un tableau, le nombre d’éléments du tableau.

Les éléments d’un tableau sont indexés de 0 à dimension–1. NomTableau(i) désigne le ième élément
du tableau de nom NomTableau, i devant être compris entre 0 et dimension–1.

Exemple :

Dim TabInt(10) As Integer                        ‘tableau de 10 entiers

TabInt(0)=12                                     ‘accès au premier élément du tableau

TabInt(9)=36                                     ‘accès au dernier élément du tableau

Les tableaux sont très utiles pour traiter des listes d’éléments. La fonction Array renvoie une variable
de type Variant contenant un tableau.

Exemple :

Dim ListeJours As Variant

ListeJours = Array("Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", _

"Samedi", "Dimanche")

                                                                                                       7
La fonction UBound renvoie la valeur maximale des index d’un tableau.

Exemple :

       UBound(ListeJours) renvoie 6.

Exercice d’application :

   1. Ecrire la fonction verifierJours(Jour As String) qui permet de vérifier que la chaîne de
      caractères passée en argument est bien un jour de la semaine et qui renvoie un booléen, et
      la tester dans EXCEL.

   2. Etant donné une liste de libellés pour les lignes et une liste de libellés pour les colonnes,
      écrire un programme (des procédures et/ou des fonctions) permettant leur mise en page à
      l'image de la procédure macro_mise_en_page précédente.

                                                                                                 8
Vous pouvez aussi lire