PROGRAMMATION EN VBA(*) POUR EXCEL - EXERCICES U.F.R. D'INFORMATIQUE Christine MARTIN
←
→
Transcription du contenu de la page
Si votre navigateur ne rend pas la page correctement, lisez s'il vous plaît le contenu de la page ci-dessous
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