Visual Basic pour Application (VBA) http ://perso.wanadoo.fr/x.dupre/programmation/ Xavier Dupré



Documents pareils
1 TD 2 : Construction d'une chier Acrobat et envoi par

Programmation VBA/Excel. Programmation VBA. Pierre BONNET. Masters SMaRT & GSI - Supervision Industrielle P. Bonnet

Formation VBA 3 Interagir

1. Introduction Création d'une macro autonome Exécuter la macro pas à pas Modifier une macro... 5

FORMATION au VBA Pour EXCEL. Version 2007 & +

Recherche dans un tableau

Compte-rendu de projet de Système de gestion de base de données

Visual Basic for Applications

Traitement de texte : Quelques rappels de quelques notions de base

Créer une base de données

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

TABLEAU CROISE DYNAMIQUE

AGASC / BUREAU INFORMATION JEUNESSE Saint Laurent du Var Tel : bij@agasc.fr Word: Les tableaux.

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Excel. Identification. Informations sur vos besoins et objectifs. Notions fondamentales. Fiche de validation des besoins en formation Bureautique

Comment créer et utiliser une fonction

Guide pour la réalisation d'un document avec Open Office Writer 2.2

Guide de formation avec cas pratiques. Programmation. Philippe Moreau Patrick Morié. Daniel-Jean David

EXCEL TUTORIEL 2012/2013

Automatisation d'une Facture 4. Liste Déroulante Remises Case à cocher Calculs

Algorithmique et programmation : les bases (VBA) Corrigé

1. Introduction Création d'une requête...2

Utiliser une base de données

Cours Access 1) INTRODUCTION AU SGBD...4 2) LES TABLES...4

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Débuter avec OOo Base

Travaux Pratiques de Commande par ordinateur 1 TRAVAUX PRATIQUES

Cours Informatique Master STEP

TABLEAU CROISE DYNAMIQUE

Initiation à LabView : Les exemples d applications :

TD3 - Facturation avec archivage automatisé

Introduction à MATLAB R

Asset Management Software Client Module. Manuel d utilisation

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Télécom Nancy Année

Sub CalculAnnuite() Const TITRE As String = "Calcul d'annuité de remboursement d'un emprunt"

Initiation à VBA pour Excel. Philippe Bernard Ingénierie Economique et Financière Université Paris-Dauphine

Programmation Objet - Cours II

LibreOffice Calc : introduction aux tableaux croisés dynamiques

Programmation Visual Basic. Visite guidée d'un programme Visual Basic 6.0

TP : Shell Scripts. 1 Remarque générale. 2 Mise en jambe. 3 Avec des si. Systèmes et scripts

PROGRAMMATION EVENEMENTIELLE sur EXCEL

INSERER DES OBJETS - LE RUBAN INSERTION... 3 TABLEAUX

.NET - Classe de Log

RapidMiner. Data Mining. 1 Introduction. 2 Prise en main. Master Maths Finances 2010/ Présentation. 1.2 Ressources

Date M.P Libellé Catégorie S.Catégorie Crédit Débit Solde S.B

Note de cours. Introduction à Excel 2007

Guide de démarrage Janvier 2012

Formations 2015 Bureautique

SOMMAIRE. Travailler avec les requêtes... 3

Créer le schéma relationnel d une base de données ACCESS

EXCEL PERFECTIONNEMENT CALCULS AVANCES

GUIDE Excel (version débutante) Version 2013

MODE OPERATOIRE OPENOFFICE BASE

Excel 2010 Intermediaire

Guide de démarrage rapide Centre de copies et d'impression Bureau en Gros en ligne

Télécharger et Installer OpenOffice.org sous Windows

Excel 2007 Niveau 3 Page 1

Parcours FOAD Formation EXCEL 2010

Module SMS pour Microsoft Outlook MD et Outlook MD Express. Guide d'aide. Guide d'aide du module SMS de Rogers Page 1 sur 40 Tous droits réservés

L'instruction if permet d'exécuter des instructions différentes selon qu'une condition est vraie ou fausse. Sa forme de base est la suivante:

Cours Excel : les bases (bases, texte)

1. Qu'est-ce que SQL? La maintenance des bases de données Les manipulations des bases de données... 5

CATALOGUE DES FORMATIONS

Installation et paramétrage. Accès aux modèles, autotextes et clip- art partagés

Apprendre à manipuler le clavier Médiathèque de Bussy Saint-Georges APPRENDRE A MANIPULER LE CLAVIER

TUTORIAL REUTERS. Utilisation de l'utilitaire de recherche Reuters

Manuel du gestionnaire

Guide d'utilisation. OpenOffice Calc. AUTEUR INITIAL : VINCENT MEUNIER Publié sous licence Creative Commons

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Infolettre #12 : Office Live Workspace

UTILISER WORD. Présentation générale de Word. Voici quelques éléments à savoir en démarrant Word.

Microsoft Excel. Tableur

Programmation C++ (débutant)/instructions for, while et do...while

Création WEB avec DreamweaverMX

Support de TD ArcGIS Introduction à l automatisation et au développement avec ArcGIS 10.1 JEAN-MARC GILLIOT e année ingénieur

EXCEL PERFECTIONNEMENT SERVICE INFORMATIQUE. Version /11/05

UTILISATION DE L'APPLICATION «PARTAGE DE FICHIERS EN LIGNE»

Préparation à l examen EFA en Macro

Utiliser Access ou Excel pour gérer vos données

Chapitre 2 Devine mon nombre!

Algorithmique avec Algobox

Langage propre à Oracle basé sur ADA. Offre une extension procédurale à SQL

Introduction : Cadkey

Adobe Illustrator Logiciel de dessin vectoriel et de Cartographie Assistée par Ordinateur

Manuel utilisateur Netviewer one2one

INF2015 Développement de logiciels dans un environnement Agile. Examen intra 20 février :30 à 20:30

Guide d'installation du connecteur Outlook 4

Bernard HAMM, Évelyne LAVOISIER

Création d'un site dynamique en PHP avec Dreamweaver et MySQL

ACTIVITÉ DE PROGRAMMATION

Paginer les données côté serveur, mettre en cache côté client

Qlik Sense Cloud. Qlik Sense Copyright QlikTech International AB. Tous droits réservés.

Symantec Enterprise Vault

Programmer en JAVA. par Tama

Créer un tableau avec LibreOffice / Calc

Transcription:

Visual Basic pour Application (VBA) http ://perso.wanadoo.fr/x.dupre/programmation/ Xavier Dupré

Repères 1. Introduction............................................... 3 1.1 Visual Basic et macros...................................... 3 1.2 Première procédure........................................ 3 1.3 Macro liée à une feuille Excel.................................. 5 1.4 Erreurs.............................................. 6 1.5 Autres possibillités........................................ 7 2. Le langage VBA............................................ 9 2.1 Préliminaires........................................... 9 2.2 Variables et opérateurs...................................... 9 2.3 Achage.............................................. 13 2.4 Tests................................................ 14 2.5 Boucles.............................................. 15 2.6 Fonctions et procédures..................................... 16 2.7 Erreurs.............................................. 18 3. Exemple de fonctions en VBA sous Excel.............................. 19 La table des matières est détaillée à la n du document.

Chapitre 1 Introduction 1.1 Visual Basic et macros Excel est un logiciel très répandu dès qu'on manipule des chires. Certaines de ces manipulations reviennent très souvent et on éprouve le besoin de les automatiser. Les logiciels ont fait apparaître les macros : une succession d'opérations que l'utilisateur pouvait enregistrer puis reproduire. Dans Microsoft Oce, à chaque macro correspond un programme informatique qui dénit les opérations eectuées. Fig. 1.1: Une matrice sous Excel 4x4, on souhaite en calculer la trace. La gure 1.1 montre une matrice. On veut enregistrer une macro qui va mémoriser les opérations permettant d'entrer la formule de la trace de la matrice. La gure 1.2 montre les trois étapes qui permettent de créer cette macro. Une fois que la macro est enregistrée, Excel crée un code écrit en Visual Basic qui correspond à ces opérations. Pour le voir, on ouvre l'éditeur Visual Basic. 1.2 Première procédure On cherche ensuite à écrire une macro qui modie la matrice de façon à ce que la somme des coecients sur chaque ligne soit égale à 1. Il est dicile d'enregistrer la succession d'opérations comme dans le paragraphe précédent. En eet, la normalisation de la matrice nécessite de calculer d'abord la somme des coecients sur une ligne et ensuite de diviser chaque coecient par la somme obtenue pour sa ligne. Il est impossible de réaliser ce calcul directement sur la feuille Excel sans recopier la matrice à moins de programmer cette

1. Introduction 4 Fig. 1.2: On lance l'enregistrement d'une macro dans la première image, on lui donne un nom dans la seconde, on saisit la formule et on arrête l'enregistrement dans la troisième image. Fig. 1.3: On ouvre l'éditeur Visual Basic dans Excel (cette opération est la même dans Word, Access ou toute autre application de la gamme Microsoft Oce). Il faut ensuite cliquer sur Module1 pour voir apparaître le code de la macro. Les lignes commençant par une apostrophe sont des commentaires et ne sont pas pris en compte lors de l'exécution de la macro. La première de la macro signie que la case qui doit recevoir le résultat est sélectionnée. La seconde ligne est la saisie de la formule. La troisième ligne est un clic dans une case voisine. macro. On retourne donc dans l'éditeur Visual Basic pour y ajouter les lignes suivantes : 1 Sub normalisation() 2 ' cette fonction renormalise une matrice 4x4 3 Dim s As Double 4 Dim cel As String 5 Dim i As Long 6 Dim j As Long 7 8 For i = 1 To 4 9 s = 0 10 For j = 1 To 4 11 s = s + Worksheets("Feuil1").Cells(i, j) 12 Next 13 For j = 1 To 4 14 Worksheets("Feuil1").Cells(i, j) = Worksheets("Feuil1").Cells(i, j) / s

1. Introduction 5 15 Next 16 Next 17 End Sub Une fois cette étape terminée, on revient dans la fenêtre Excel. On souhaite ajouter un bouton à la barre des tâches et appeler la macro normalisation lorsqu'on clique sur ce bouton. Pour cela, il faut suivre les instructions de la gure 1.4. Fig. 1.4: On clique d'abord sur le clic droit de la souris au niveau de la barre des tâches puis sur Personnaliser (première image). Une fenêtre apparaît, il faut cliquer sur l'onglet Commande puis sur Macro (deuxième image). La troisième étape consiste à déplacer (on clique dessus et on relâche à l'endroit désiré) le bouton personnalisé dans une barre des tâches. Il s'insère alors dedans. A nouveau un clic droit de la souris sur ce nouveau bouton, puis on clique sur Aecter une macro (troisième image). Une dernière fenêtre apparaît (dernière image), il sut de sélectionner normalisation pour associer cette procédure au nouveau bouton. De retour dans Excel, on clique sur le nouveau bouton. La procédure s'exécute et la matrice est aussitôt modiée. 1.3 Macro liée à une feuille Excel Il est possible, au milieu d'une feuille Excel, d'insérer un bouton lui-même relié à une macro. Lorsque vous changez la valeur d'une cellule, Excel calcule à nouveau toutes les formules qui en dépendent. Parfois, ces calculs sont compliqués, et lorsqu'il faut changer dix valeurs, ils sont eectués dix fois. La manipulation

1. Introduction 6 d'excel s'en trouve ralentie. Il est alors possible d'insérer un bouton à l'intérieur d'une feuille Excel de sorte que, lorsque ce bouton est pressé, c'est une macro qui est exécutée et qui eectue ces coûteux calculs lorsque vous l'avez décidé. La gure 1.5 montre les étapes à suivre pour insérer un bouton dans une feuille de calcul. La gure 1.6 montre comment modier le nom du bouton et le rattacher à une macro. Fig. 1.5: La première étape consiste à dessiner le bouton dans la feuille de calcul. Il faut faire d'abord apparaître une barre d'outils nommé Control ToolBox en cliquant sur le bouton droit de la souris au niveau des barres d'outils (première image). Il faut ensuite préciser à Excel qu'on désire insérer un bouton (ou plus généralement un contrôle). On clique pour cela comme indiqué sur la seconde image pour être en Design Mode. On clique alors sur un icône ressemblant à un bouton (troisième image). Il ne reste plus qu'à dessiner le bouton sur la feuille (quatrième image). On clique à un endroit puis on maintient appuyé jusqu'à ce que le bouton soit assez grand. Il est possible par la suite de le déplacer (uniquement en Design Mode. (suite gure 1.6, page 7) 1.4 Erreurs Il arrive parfois qu'une procédure ne fonctionne pas ou plante. Dans le cas présent, pour faire planter la procédure renormalisation, il sut de modier la première ligne de la matrice pour n'y mettre que des zéros. Un nouveau clic sur le bouton associé à cette macro et une erreur est provoquée comme le montre la gure 1.7. Le logiciel Excel est assez souple puisqu'il autorise la programmation et les erreurs ne provoque pas l'arrêt d'excel.

1. Introduction 7 Fig. 1.6: Après avoir fait apparaître un menu local en cliquant sur le bouton droit de la souris au niveau du bouton, la première image de cette série montre où faut il aller pour modier le nom du bouton. Une fois que cela est fait, on fait apparaître de nouveau ce même menu local (seconde image) et on clique sur View Code pour faire apparaître le code de la macro associée au bouton. La macro apparaît dans l'éditeur Visual Basic (troisième image), il ne reste plus qu'à la dénir. A chaque fois que le bouton sera pressé, c'est cette macro qui sera exécutée. La dernière image est là pour rappeler qu'une fois toutes ces étapes terminées, il ne faut pas oublier de revenir dans Excel et de sortir du mode Design Mode pour utiliser normalement Excel et surtout pouvoir cliquer sur le bouton. 1.5 Autres possibillités Visual Basic permet la réalisation de petits programmes. Même si les calculs sont possibles, ils sont plus lents qu'avec un langage comme le C++. Néanmoins, l'avantage est qu'excel dispose d'une interface dans laquelle il est facile d'acher les résultats d'un calcul ou de construire un graphique. Il est même possible d'introduire des boîtes de dialogue. Excel n'est pas la seule application, Word, Access, Outlook sont toutes des applications qui peuvent être pilotées avec Visual Basic. Toutefois Excel et Access (base de données) sont les deux applications principales avec lesquels on écrit des programmes en VBA. Pour Excel, je citerai le livre [Riva2005]. Il illustre l'utilisation de VBA et Excel au travers de la réalisation d'un pricer de produits nanciers. Il s'étend peu sur le langage VBA mais le livre commence par un résumé sur le langage et les objets manipulés dans les programmes qui suivent en exemple.

1. Introduction 8 Fig. 1.7: Une erreur survient car la somme des coecients de la première ligne est nulle ce qui implique une division par zéro. C'est opération est impossible et provoque l'ouverture de la fenêtre de la première image. Après avoir cliqué sur Débogage, on se retrouve dans l'éditeur Visual Basic avec une ligne en jaune : c'est la ligne qui a provoqué l'erreur. Le menu Achage (ou View en anglais) permet de faire apparaître une fenêtre Watch. Cette fenêtre facilite la mise au point des programmes car lorsque le programme s'arrête en cours d'exécution, il est possible d'acher le contenu des variables en cours d'utilisation.

Chapitre 2 Le langage VBA Le VBA est semblable à tout autre langage de programmation, il contient des boucles, tests, fonctions ou encore procédures. Il dière un peu par les types de variables qu'il propose, les objets qu'il manipule, liés aux applications Microsoft Oce. Ce chapitre résume la syntaxe de ce langage. Tout programme écrit en VBA peut être réparti sur plusieurs modules bien que ceux-ci soient enregistrés dans un seul chier (une feuille Excel, un document Word,...). Il ne faut pas oublier l'aide fournie par Microsoft. Lorsque vous avez un doute sur une fonction ou un motclé, il vous sut de l'écrire et d'appuyer sur la touche F1. Vous aurez alors automatiquement l'aide associé à ce mot, s'il existe. Une autre manière d'obtenir des informations sur ce langage consiste à enregistrer une macro en rapport avec la tâche à programmer et d'extraire du code VBA produit par Microsoft Oce les informations désirées. 2.1 Préliminaires Les commentaires commencent par une apostrophe et se termine par la n de la ligne. Il n'y a pas de séparateur d'instructions en VBA, le langage impose une instruction par ligne. Lorsque l'une d'elle est trop longue et qu'il est préférable pour des raisons de lisibilité d'étendre une instruction sur plusieurs lignes, chacune d'elles excepté la dernière doit se terminer par _. MsgBox "première partie" & _ "seconde partie\n" & _ "troisième partie" 2.2 Variables et opérateurs 2.2.1 Types prédénis La déclaration d'une variable se fait toujours selon le même schéma : Dim nom_variable as nom_type Les principaux types de variables sont regroupés dans la table 2.1. Voici quelques exemples de déclarations :

2. Le langage VBA 10 Dim a As Integer Dim s As String Dim v As Variant Le langage VBA nécessite la déclaration des variables avant leur utilisation. Toutefois, lorsqu'elle n'est pas présente, Excel ou tout autre application de Microsoft Oce ne remarque pas toujours l'erreur car il est possible que le programme ait un sens même dans ce cas. Il est donc conseillé d'ajouter au début de tout module l'instruction Option Explicit. De cette manière, l'oubli d'une déclaration sera détecté avant même l'exécution du programme. VBA autorise également les tableaux. Ils possèdent une ou plusieurs dimensions. Le premier indice est 0 et le dernier dim1. La déclaration se fait comme suit : Dim nom_variable (dim1, dim2,...) as nom_type VBA permet aussi de changer les indices d'un tableau de debut à fin inclus : Dim nom_variable (debut To fin,...) as nom_type Pour accéder à un élément du tableau, il faut utiliser les parenthèses. Quelques exemples : ' mois est un tableau de chaînes de caractères ' dont les indices vont de 0 à 12 inclus Dim Mois(12) As String ' Matrice est un tableau à deux dimensions d'entiers Dim Matrice(3, 4) As Integer ' Matrice2 est un tableau de réels à deux dimensions pour lesquels ' les indices désirés sont explicitement spécifiés Dim Matrice2(1 To 5, 4 To 9, 3 To 5) As Double ' accès à un paramètre Dim t(3 To 6) As Integer t(3) = 4 type dénition Byte octet, entier de 0 à 255 Boolean booléen, True ou False Integer entier de -32768 à 32768 Long entier de -2.147.483.648 et 2.147.483.647 Double réel, 14 chires de précision, exposant allant jusqu'à 308 Date date String chaîne de caractères Variant équivalent à tout type, en particulier les tableaux Tab. 2.1: Principaux types de variables en VBA.

2. Le langage VBA 11 2.2.2 Opérateur Les opérations sont les opérations standards +,-,/,*, ˆ (puissance), Mod (congruence). On peut concaténer les chaînes de caractères grâce à l'opérateur &. 3 + 4 ' vaut 7 31 Mod 5 ' vaut 1 2^4 ' vaut 16 "un" & "deux" ' vaut undeux Les opérateurs de comparaisons sont <,>,<=,>=,= 1. Les opérations logiques And et Or permettent de combiner les comparaisons. ((3 < 4) And (5 < 6)) Or (2 > 1) Remarque 2.2.1: chaîne de caractères, caractères spéciaux Lorsqu'on veut insérer un passage à la ligne dans une chaîne de caractères, il faut concaténer le symbol vbcrlf. s = "première ligne" & vbcrlf & "seconde ligne" 2.2.3 Conversion Les conversions sont parfois implicitement eectuées. Lorsqu'elles ne marchent pas, il faudra faire appel à des fonctions de conversions explicites. Pour faire simple, il en existe deux qui sont souvent utilisées : 1. La fonction Str convertit n'importe quoi en chaîne de caractères. 2. La fonction Val convertit n'importe quoi en une valeur numérique. Exemple : Dim s As String Dim a As Double s = Str (3.14) a = Val ("3.14") 2.2.4 Types dénis par l'utilisation Il est possible de créer des types en combinant plusieurs types déjà existant, comme les structures en langage C. On utilise le mot-clé Type et la syntaxe obéit au format suivant : Type Contacts Nom As String Prenom As String Age As Integer End Type Sub procedure () Dim ct As Contacts 1 L'opérateur de comparaison ne contient qu'un seul signe =.

2. Le langage VBA 12 ct.nom = "Microsoft" ct.prenom = "VBA" ct.age = 10 ' environ End Sub Cet exemple fait apparaître le mot-clé Sub qui désigne le début d'une procédure 2. La dénition d'un type ne peut être faite à l'intérieur d'un sous-programme (fonction ou procédure). Lorsque le nom de la variable est trop long 3 ou simplement qu'on désire éviter sa répétition, on utilise le mot-clé With et la syntaxe équivalente suivante : Type Contacts Nom As String Prenom As String Age As Integer End Type Sub essai() Dim ct As Contacts With ct.nom = "Microsoft".Prenom = "VBA".Age = 10 End With End Sub Il n'est pas possible avec le mot-clé Type de dénir une classe mais le paragraphe suivant aborde ce point. 2.2.5 Classes La déclaration d'une classe s'eectue dans un module à part : un module de classe. La gure 2.1 montre comment créer un module de classe. A l'intérieur de ce module de classe, les attributs de la classe sont déclarés comme une variable globale via le mot-clé Public. Voici un exemple de module de classe incluant un attribut et une méthode. Son nom est ClassNom : Public nom As String Sub essai() nom = "inconnu" End Sub La déclaration des variables de types classes dière aussi de celle des autres types, il faut ajouter le mot-clé New. New Dim c As New ClassNom c.nom = "eeee" c.essai 2 ou fonction ne retournant aucun résultat 3 cas fréquent lorsqu'on manipule les objets de Microsoft

2. Le langage VBA 13 Fig. 2.1: Création d'un module de classe en cliquant sur le clic droit de la souris dans la fenêtre VBAProject. La première image montre comment créer le module de classe. La seconde et la troisième montrent comment donner un nom à la classe créée. Le nom choisi est ici ClassNom. VBA ore la possibilité d'ajouter un constructeur et un destructeur. Ils possèdent des noms particuliers : Private Sub Class_initialize() ' code du constructeur End Sub Private Sub Class_Terminate() ' code du destructeur End Sub 2.3 Achage L'achage du résultat d'un calcul dépend de l'application dans laquelle on exécute le programme VBA. Ce sera dans la case d'une feuille Excel, dans un paragraphe d'un document Word, dans un mail d'outlook, dans une table d'access. Avant d'aborder ces applications, il existe un moyen simple de faire apparaître à l'écran un message à l'intérieur d'une boîte de dialogue. La gure 2.2 montre ce qui surgit à l'écran. MsgBox "message" Lorsque le message est long, il est nécessaire d'insérer des sauts de lignes, il faut utiliser le symbole vbcrlf (voir remarque 2.2.1). La boîte de dialogue peut inclure plusieurs boutons en ajoutant un second paramètre lors de l'appel de la fonction MsgBox.

2. Le langage VBA 14 Fig. 2.2: Boîte de dialogue dans laquelle apparaît message. Le programme s'arrête puis reprend lorsque le bouton OK est pressé. Reponse = MsgBox ("Voulez-vous continuer?", vbyesno) Les diérentes valeurs possibles sont vbabortretryignore, vbokcancel, vbretrycancel, vbyesno, vbyesnocancel. La valeur retournée dépend du bouton pressé, cette valeur peut être vbok, vbcancel, vbabort, vbretry, vbignore, vbyes, vbno. Il est aussi possible de demander un renseignement à l'utilisateur avec la fonction InputBox. Le résultat est une chaîne de caractères. C'est le moyen le plus simple mais VBA ore la possibilité de dénir des boîtes de dialogue plus complexe appelées formulaire qui permettent de saisir plusieurs informations dans la même fenêtre. Dim Message As String Message = InputBox("intitulé de la question", "nom de la boîte de dialogue", _ "réponse par défaut") 2.4 Tests 2.4.1 Tests avec If Les tests sont écrits grâce aux mots-clé If et Then : If condition Then ' faire.. End If S'il n'y qu'une instruction à exécuter lorsque le test est vérié, il est possible de l'écrire sur une ligne et la dernière ligne End If disparaît : If condition Then ' faire Il peut y avoir une contre partie : If condition Then ' faire.. Else ' sinon faire... End If On peut aussi enchaîner les tests :

2. Le langage VBA 15 If condition1 Then ' faire.. ElseIf condition2 Then ' faire... Else ' sinon faire... End If 2.4.2 Tests avec Select Case Il existe une autre manière d'écrire des tests lorsque les instructions à exécuter dépendent de la valeur d'une variable discrète. Dim NiveauEau As Integer Dim Mention As String NiveauEau = 10 Select Case NiveauEau Case 0 Mention = "sec" Case 1 To 5 Mention = "presque sec" Case 6 To 10 Mention = "normal" Case 11 To 15 Mention = "trop d'eau" Case 16 To 19 Mention = "inondations" Case Else Mention = "on déménage" End Select 2.5 Boucles 2.5.1 Boucle For Dim s as Integer Dim i as Integer ' déclarer la variable de la boucle s = 0 For i = 1 To 10 s = s + 1 Next i ' passer au i suivant Il est possible de faire en sorte que la variable de boucle soit incrémentée d'une valeur positive ou négative à chaque itération. Dim s as Integer Dim i as Integer ' déclarer la variable de la boucle s = 0

2. Le langage VBA 16 For i = 1 To 10 Step 2 ' i = 1 3 5... 9 s = s + 1 Next i ' passer au i suivant Pour sortir de la boucle For avant sa n prévue, il faut utiliser l'instruction Exit For. 2.5.2 Boucle While Dim s as Integer Dim i as Integer ' déclarer la variable de la boucle s = 0 i = 1 While i <= 10 s = s + 1 i = i + 1 Wend Il n'est pas possible de sortir d'une boucle While. 2.5.3 Boucle Loop Dim s as Integer Dim i as Integer ' déclarer la variable de la boucle s = 0 i = 1 Do While i <= 10 s = s + 1 i = i + 1 Loop Pour sortir de la boucle Do While avant sa n prévue, il faut utiliser l'instruction Exit Do. Même chose mais la condition est placée et évaluée à la n de la boucle : Dim s as Integer Dim i as Integer ' déclarer la variable de la boucle s = 0 i = 1 Do s = s + 1 i = i + 1 Loop While i <= 10 2.6 Fonctions et procédures 2.6.1 Procédures C'est une fonction qui ne retourne pas de résultat.

2. Le langage VBA 17 Sub exemple_procedure () ' code de la procédure End Sub Il est possible de sortie prématurément de la procédure en écrivant Exit Sub. Contrairement à d'autres langages, il ne faut pas mettre de parenthèses autour des paramètres d'une procédure lorsqu'on l'appelle. Sub exemple_procedure (ByVal param1 As Long) ' code de la procédure End Sub Sub main () ' appel de la procédure exemple_procedure 3 End Sub 2.6.2 Fonctions Function exemple_fonction () As Integer ' code de la procédure... ' retourner le résultat exemple_fonction = End Function Il est possible de sortir prématurément de la procédure en écrivant Exit Function. Toutefois, avant d'exécuter une telle instruction (qui est facultative), il ne faut pas oublier de préciser quel est son résultat en écrivant le nom de la fonction suivant du signe = et du résultat à retourner. 2.6.3 Variables statiques Les variables statiques sont créées une seule fois au cours de l'exécution du programme et conservent la dernière valeur qui leur a été aectée lorsque le programme quitte la procédure ou la fonction qui la contient. Au prochain appel de cette procédure ou fonction, la variable statique a retenu sa précédente valeur. Sub proc () Static i As Integer End Sub 2.6.4 Passages des paramètres Comme dans tous les langages, il existe manières de transmettre des paramètres à une fonction : 1. Le passage par valeur : les paramètres sont recopiés et peuvent être modiés dans la fonction ou la procédure sans conséquence à l'extérieur du sous-programme. 2. Le passage par adresse : les paramètres ne sont pas recopiés. Lorsqu'ils sont modiés dans la fonction ou la procédure, ces modications demeurent après que le sous-programme est terminé. Dans l'exemple qui suit, le premier paramètre est passé par valeur, le second par référence.

2. Le langage VBA 18 Function exemple_fonction (ByVal s As String, ByRef v As Variant) As Long '... End Function En règle générale, les petits paramètres (Long, Double, String) sont passés par valeur car leur copie ne coûte pas grand-chose. Les paramètres plus gros comme les tableaux ou n'importe quel objet Microsoft Oce, sont passés par référence car leur copie est coûteuse en temps d'exécution. Il arrive même que certains objet n'accepte pas les copies et donc les passages par valeur. Les paramètres passés par valeur acceptent des valeurs par défaut. 2.6.5 Surnom : Set Certaines variables ont parfois des noms longs qu'il est ennuyeux de recopier à chaque utilisation. Il est possible de leur donner un surnom grâce au mot-clé Set. Dim nom_tres_tres_long As String Dim s As String Set s = nom_tres_tres_long ' par la suite, s et nom_tres_tres_long désignent la même variable 2.7 Erreurs Les exceptions n'existent pas en VBA mais un autre mécanisme le remplace. Sub proc () On Error Goto erreur ' ' code susceptible de produire une erreur ' Exit Sub erreur: ' ' en cas d'erreur ' End Sub

Chapitre 3 Exemple de fonctions en VBA sous Excel 1 ' 2 ' divise une chaîne de caractères en plusieurs petites séparés par une chaîne 3 ' séparatrice 4 ' 5 ' @param str chaîne à diviser 6 ' @param sep chaîne séparatrice 7 ' @return tableau de chaîne de caractères 8 ' 9 Function SplitString(str As String, sep As String) As Variant 10 11 Dim res As Variant 12 Dim l, lsep As Long 13 Dim k As Long 14 15 lsep = Len(sep) 16 l = Len(str) 17 18 If l < lsep Then 19 SplitString = res 20 Exit Function 21 End If 22 23 Dim occ As Long 24 occ = 0 25 26 For k = 1 To l - lsep + 1 27 If Mid(str, k, lsep) = sep Then 28 occ = occ + 1 29 End If 30 Next 31 32 ReDim res(occ) 33 34 Dim last As Long

3. Exemple de fonctions en VBA sous Excel 20 35 last = 1 36 37 occ = 0 38 For k = 1 To l - lsep + 1 39 If Mid(str, k, lsep) = sep Then 40 If k > last Then 41 res(occ) = Mid(str, last, k - last) 42 End If 43 last = k + lsep 44 occ = occ + 1 45 End If 46 Next 47 48 If last <= l Then 49 res(occ) = Mid(str, last, l - last + 1) 50 End If 51 52 SplitString = res 53 54 End Function 55 56 ' 57 ' retourne la dimension d'un tableau 58 ' 59 ' @param arr tableau 60 ' @return dimension du tableau 61 ' 62 Function HalArrayDimension(ByRef arr As Variant) As Long 63 On Error GoTo FinalDimension 64 Dim dimnum As Long 65 Dim ErrorCheck As Long 66 For dimnum = 1 To 60000 67 ErrorCheck = LBound(arr, dimnum) 68 Next dimnum 69 HalArrayDimension = dimnum - 1 70 Exit Function 71 FinalDimension: 72 HalArrayDimension = dimnum - 1 73 End Function 74 75 ' 76 ' copie un tableau dans une table à partir des indices x,y, 77 ' si le tableau est à une dimension, copie le tableau verticalement, 78 ' termine le tableau par une ligne blanche 79 ' 80 ' @param feuille nom de la feuille 81 ' @param y ligne 82 ' @param x colonne 83 ' @param arr tableau 84 '

3. Exemple de fonctions en VBA sous Excel 21 85 Sub HalArrayCopy(ByRef feuille As String, ByVal y As Long, ByVal x As Long, ByRef arr As Variant 86 87 If (VarType(arr) & vbarray) > 0 Then 88 89 Dim d As Long 90 d = HalArrayDimension(arr) 91 92 If d = 2 Then 93 94 Dim ddu1 As Long 95 Dim ddl1 As Long 96 Dim ddu2 As Long 97 Dim ddl2 As Long 98 99 ddu1 = UBound(arr, 1) 100 ddl1 = LBound(arr, 1) 101 ddu2 = UBound(arr, 2) 102 ddl2 = LBound(arr, 2) 103 104 If Not IsEmpty(arr) Then 105 106 Worksheets(feuille).Range(Cells(y, x), Cells(y + ddu1 - ddl1, x + ddu2 - ddl2)) 107 Worksheets(feuille).Range(Cells(y + ddu1 - ddl1 + 1, x), _ 108 Cells(y + ddu1 - ddl1 + 1, x + ddu2 - ddl2)) _ 109.ClearContents 110 111 End If 112 113 ElseIf d = 1 Then 114 115 Dim ddu As Long 116 Dim ddl As Long 117 118 ddu = UBound(arr, 1) 119 ddl = LBound(arr, 1) 120 121 If Not IsEmpty(arr) Then 122 Worksheets(feuille).Range(Cells(y, x), Cells(y + ddu - ddl, x)) = arr 123 Worksheets(feuille).Range(Cells(y + ddu - ddl + 1, x), Cells(y + ddu - ddl + 1, 124 End If 125 End If 126 127 Else 128 129 Dim ta As String 130 Dim res As Long 131 res = MsgBox("arr is not an array", vbokonly, "Error", ta, 1000) 132 133 End If 134

3. Exemple de fonctions en VBA sous Excel 22 135 End Sub 136 137 ' 138 ' retourne le nom de la feuille activée 139 ' 140 ' @return nom de la feuille activée 141 ' 142 Function HalGetSheetActivated() As String 143 Dim sh 144 For Each sh In Windows(1).SelectedSheets 145 HalGetSheetActivated = sh.name 146 Next 147 End Function 148 149 ' 150 ' fonction retournant la liste des cases sélectionnées 151 ' 152 ' @param i tableau contenant les lignes 153 ' @param j tableau contenant les colonnes 154 ' @param f tableau contenant les feuilles correspondantes 155 ' @return nombre de cases sélectionnées 156 ' 157 Function HalSelectionCellGet(ByRef i As Variant, ByRef j As Variant) As Long 158 159 Dim nb As Long 160 Dim ch 161 nb = 0 162 For Each ch In Selection 163 nb = nb + 1 164 Next 165 166 ReDim i(nb) 167 ReDim j(nb) 168 ReDim f(nb) 169 170 nb = 1 171 172 For Each ch In Selection 173 i(nb) = ch.row 174 j(nb) = ch.column 175 nb = nb + 1 176 Next ch 177 178 HalSelectionCellGet = nb - 1 179 180 End Function 181 182 ' 183 ' crée une barre d'outils si elle n'existe pas 184 '

3. Exemple de fonctions en VBA sous Excel 23 185 ' @param name nom de la barre d'outils 186 ' 187 Sub HalCreateToolBarName(name As String) 188 On Error GoTo createcommandbar 189 Dim mybar 190 Set mybar = CommandBars(name) 191 Exit Sub 192 createcommandbar: 193 Set mybar = CommandBars.Add(name:=name, Position:=msoBarFloating, Temporary:=False) 194 With mybar 195.Width = 39 196.Visible = True 197.Height = 20 198.RowIndex = msobarrowfirst 199 End With 200 End Sub 201 202 ' 203 ' cherche un bouton dont la légende est... dans une barre d'outils 204 ' 205 ' @param name barre d'outils 206 ' @param str nom du bouton à chercher 207 ' @return vrai ou faux 208 ' 209 Function HalSearchToolBar(name As String, str As String) As Boolean 210 On Error GoTo createcommandbar 211 Dim mybar 212 Dim b 213 Set mybar = CommandBars(name) 214 For Each b In mybar.controls 215 If b.caption = str Then 216 HalSearchToolBar = True 217 Exit Function 218 End If 219 Next 220 HalSearchToolBar = False 221 Exit Function 222 createcommandbar: 223 HalSearchToolBar = False 224 End Function 225 226 227 ' 228 ' positionne les boutons en colonne dans une barre d'outils 229 ' 230 ' @param name barre d'outils 231 ' 232 Sub HalColumnToolBar(name As String) 233 234 CommandBars(name).Position = msobarfloating

3. Exemple de fonctions en VBA sous Excel 24 235 CommandBars(name).Width = 1 236 237 ' Dim HalControl As CommandBarButton 238 ' For Each HalControl In CommandBars(name).Controls 239 ' Next 240 241 End Sub 242 243 ' 244 ' crée un bouton dans une barre d'outils si celui-ci n'existe pas 245 ' 246 ' @param name nom de la barre d'outils 247 ' @param func nom de la fonction à appeler lorsque le bouton est e 248 ' @param cap légende 249 ' 250 Sub HalCreateToolBarButtonName(name As String, func As String, cap As String) 251 HalCreateToolBarName name 252 Dim mybar 253 Set mybar = CommandBars(name) 254 255 If Not HalSearchToolBar(name, cap) Then 256 Dim mybut 257 Set mybut = mybar.controls.add(type:=msocontrolbutton) 258 With mybut 259.BeginGroup = True 260.Caption = cap 261.FaceId = 0 262.OnAction = func 263.Style = msobuttoniconandcaption 264 End With 265 HalColumnToolBar name 266 Else 267 Set mybut = mybar.controls(cap) 268 With mybut 269 '.BeginGroup = True 270 '.Caption = cap 271 '.FaceId = 0 272.OnAction = func 273 '.Style = msobuttoniconandcaption 274 End With 275 End If 276 End Sub 277 278 ' 279 ' recherche la première case vide dans une colonne 280 ' 281 ' @param str feuille de calcul 282 ' @param i ligne 283 ' @param j colonne 284 ' @return ligne de la première case vide

3. Exemple de fonctions en VBA sous Excel 25 285 ' 286 Function HalLastLine(str As String, ByVal i As Long, ByVal j As Long) As Long 287 288 Dim e As Boolean 289 e = True 290 291 While e 292 If IsEmpty(Worksheets(str).Cells(i, j)) Or Worksheets(str).Cells(i, j) = "" Then 293 e = False 294 Else 295 i = i + 1 296 End If 297 Wend 298 299 HalLastLine = i 300 301 End Function 302 303 ' 304 ' vérifie si une colonne est vide ou non 305 ' 306 ' @param f feuille de calcul 307 ' @param i première ligne 308 ' @param j colonne 309 ' @param last dernière ligne 310 ' @return true, la colonne est vide, false, la colonne n'est pas vide 311 ' 312 Function HalEmptyColumn(f As String, ByVal i As Long, ByVal j As Long, ByVal last As Long) As Bo 313 314 Dim res 315 Dim v 316 317 res = Worksheets(f).Range(Cells(i, j), Cells(last, j)) 318 319 On Error GoTo impossible: 320 v = Application.WorksheetFunction.var(res) 321 322 If v = 0 Then 323 HalEmptyColumn = True 324 Else 325 HalEmptyColumn = False 326 End If 327 328 Exit Function 329 330 impossible: 331 332 HalEmptyColumn = True 333 334 End Function

3. Exemple de fonctions en VBA sous Excel 26 335 336 ' 337 ' vérifie si un tableau possède une colonne vide 338 ' 339 ' @param f feuille de calcul 340 ' @param i première ligne 341 ' @param j colonne 342 ' @param last dernière ligne 343 ' @param lastc dernière colonne 344 ' @return -1 ou l'indice de la colonne qui pose problème 345 ' 346 Function HalCheckRange(f As String, ByVal i As Long, ByVal j As Long, ByVal last As Long, ByVal 347 Dim k As Long 348 For k = j To lastc 349 350 If HalEmptyColumn(f, i, k, last) Then 351 HalCheckRange = k - j + 1 352 Exit Function 353 End If 354 Next 355 356 HalCheckRange = -1 357 End Function 358 359 ' 360 ' lit ou écrit un paramètre statique 361 ' 362 ' @param k1 clé 1 363 ' @param k2 clé 2 364 ' @param k nom 365 ' @param v valeur 366 ' @param def valeur par défaut 367 ' @param m true pour modifier, false pour obtenir la valeur 368 ' 369 Sub StaticParameter(k1 As String, k2 As String, k As String, ByRef v As String, _ 370 def As String, m As Boolean) 371 372 Dim key1 As Variant 373 Dim key2 As Variant 374 Dim name As Variant 375 Dim value As Variant 376 Dim b As Variant 377 Dim r As Long 378 379 key1 = k1 380 key2 = k2 381 name = k 382 value = v 383 b = m 384

3. Exemple de fonctions en VBA sous Excel 27 385 r = ExtHalStaticVariable(key1, key2, name, value, b) 386 If Not b Then 387 If r = 0 Then 388 v = def 389 Else 390 v = value 391 End If 392 End If 393 394 End Sub 395

Bibliographie [Riva2005] Fabrice Riva, Applications Financières sous Excel en Visual Basic, Economica (2005)

Table des gures 1.1 Une matrice sous Excel 4x4, on souhaite en calculer la trace.................. 3 1.2 On lance l'enregistrement d'une macro dans la première image, on lui donne un nom dans la seconde, on saisit la formule et on arrête l'enregistrement dans la troisième image.... 4 1.3 On ouvre l'éditeur Visual Basic dans Excel (cette opération est la même dans Word, Access ou toute autre application de la gamme Microsoft Oce). Il faut ensuite cliquer sur Module1 pour voir apparaître le code de la macro. Les lignes commençant par une apostrophe sont des commentaires et ne sont pas pris en compte lors de l'exécution de la macro. La première de la macro signie que la case qui doit recevoir le résultat est sélectionnée. La seconde ligne est la saisie de la formule. La troisième ligne est un clic dans une case voisine........ 4 1.4 On clique d'abord sur le clic droit de la souris au niveau de la barre des tâches puis sur Personnaliser (première image). Une fenêtre apparaît, il faut cliquer sur l'onglet Commande puis sur Macro (deuxième image). La troisième étape consiste à déplacer (on clique dessus et on relâche à l'endroit désiré) le bouton personnalisé dans une barre des tâches. Il s'insère alors dedans. A nouveau un clic droit de la souris sur ce nouveau bouton, puis on clique sur Aecter une macro (troisième image). Une dernière fenêtre apparaît (dernière image), il sut de sélectionner normalisation pour associer cette procédure au nouveau bouton. De retour dans Excel, on clique sur le nouveau bouton. La procédure s'exécute et la matrice est aussitôt modiée....................................... 5 1.5 La première étape consiste à dessiner le bouton dans la feuille de calcul. Il faut faire d'abord apparaître une barre d'outils nommé Control ToolBox en cliquant sur le bouton droit de la souris au niveau des barres d'outils (première image). Il faut ensuite préciser à Excel qu'on désire insérer un bouton (ou plus généralement un contrôle). On clique pour cela comme indiqué sur la seconde image pour être en Design Mode. On clique alors sur un icône ressemblant à un bouton (troisième image). Il ne reste plus qu'à dessiner le bouton sur la feuille (quatrième image). On clique à un endroit puis on maintient appuyé jusqu'à ce que le bouton soit assez grand. Il est possible par la suite de le déplacer (uniquement en Design Mode. (suite gure 1.6, page 7)................................. 6 1.6 Après avoir fait apparaître un menu local en cliquant sur le bouton droit de la souris au niveau du bouton, la première image de cette série montre où faut il aller pour modier le nom du bouton. Une fois que cela est fait, on fait apparaître de nouveau ce même menu local (seconde image) et on clique sur View Code pour faire apparaître le code de la macro associée au bouton. La macro apparaît dans l'éditeur Visual Basic (troisième image), il ne reste plus qu'à la dénir. A chaque fois que le bouton sera pressé, c'est cette macro qui sera exécutée. La dernière image est là pour rappeler qu'une fois toutes ces étapes terminées, il ne faut pas oublier de revenir dans Excel et de sortir du mode Design Mode pour utiliser normalement Excel et surtout pouvoir cliquer sur le bouton.................. 7

Table des gures 30 1.7 Une erreur survient car la somme des coecients de la première ligne est nulle ce qui implique une division par zéro. C'est opération est impossible et provoque l'ouverture de la fenêtre de la première image. Après avoir cliqué sur Débogage, on se retrouve dans l'éditeur Visual Basic avec une ligne en jaune : c'est la ligne qui a provoqué l'erreur. Le menu Achage (ou View en anglais) permet de faire apparaître une fenêtre Watch. Cette fenêtre facilite la mise au point des programmes car lorsque le programme s'arrête en cours d'exécution, il est possible d'acher le contenu des variables en cours d'utilisation............. 8 2.1 Création d'un module de classe en cliquant sur le clic droit de la souris dans la fenêtre VBAProject. La première image montre comment créer le module de classe. La seconde et la troisième montrent comment donner un nom à la classe créée. Le nom choisi est ici ClassNom.............................................. 13 2.2 Boîte de dialogue dans laquelle apparaît message. Le programme s'arrête puis reprend lorsque le bouton OK est pressé.................................. 14

Liste des tableaux 2.1 Principaux types de variables en VBA.............................. 10

Table des matières 1. Introduction............................................... 3 1.1 Visual Basic et macros...................................... 3 1.2 Première procédure........................................ 3 1.3 Macro liée à une feuille Excel.................................. 5 1.4 Erreurs.............................................. 6 1.5 Autres possibillités........................................ 7 2. Le langage VBA............................................ 9 2.1 Préliminaires........................................... 9 2.2 Variables et opérateurs...................................... 9 2.2.1 Types prédénis..................................... 9 2.2.2 Opérateur......................................... 11 2.2.3 Conversion........................................ 11 2.2.4 Types dénis par l'utilisation.............................. 11 2.2.5 Classes........................................... 12 2.3 Achage.............................................. 13 2.4 Tests................................................ 14 2.4.1 Tests avec If....................................... 14 2.4.2 Tests avec Select Case................................. 15 2.5 Boucles.............................................. 15 2.5.1 Boucle For........................................ 15 2.5.2 Boucle While....................................... 16 2.5.3 Boucle Loop........................................ 16 2.6 Fonctions et procédures..................................... 16 2.6.1 Procédures........................................ 16 2.6.2 Fonctions......................................... 17 2.6.3 Variables statiques.................................... 17 2.6.4 Passages des paramètres................................. 17

Table des matières 33 2.6.5 Surnom : Set....................................... 18 2.7 Erreurs.............................................. 18 3. Exemple de fonctions en VBA sous Excel.............................. 19

Index B barre d'outils..................................6 boucle....................................... 15 bouton........................................ 6 C classe attribut.................................. 12 méthode................................. 12 commentaire.................................. 9 constructeur................................. 13 contrôle....................................... 6 D destruteur....................................13 F fonction InputBox................................ 14 MsgBox..................................13 formulaire.................................... 14 L ligne trop longue.............................. 9 M macro......................................... 3 module........................................9 classe.................................... 12 mot-clé...................................... 12 And..................................... 11 As........................................ 9 Case..................................... 15 Dim.......................................9 Do....................................... 16 Else......................................14 ElseIf.................................... 14 Error.................................... 18 Exit..................................... 16 For...................................... 15 Function................................. 17 Goto.....................................18 If........................................ 14 Loop.....................................16 Mod..................................... 11 Next..................................... 15 On.......................................18 Or....................................... 11 Select.................................... 15 Set...................................... 18 Static.................................... 17 Sub...................................... 16 Then.................................... 14 Type.....................................11 Wend.................................... 16 While.................................... 16 With.....................................12 O opérateur.................................... 11 P paramètre passage.................................. 17 valeur par défaut.........................18 passage par adresse.............................. 17 par valeur................................17 procédure..................................... 3 R remarque chaîne de caractères, caractères spéciaux. 11 références Riva2005.............................. 7, 28 T type Boolean..................................10 Byte..................................... 10 Date..................................... 10 Double...................................10 34

Index 35 Integer...................................10 Long.....................................10 String....................................10 Variant.................................. 10 V variable déclaration...............................10 globale...................................12 type..................................... 10 VBA.......................................... 3