programmation en vba(*) pour excel

Transcription

programmation en vba(*) pour excel
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 cidessous.
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