Vous êtes sur la page 1sur 27

Universit Libre de Bruxelles Section des sciences conomiques et Solvay Business School Anne acadmique 2004-2005

GUIDE DAPPRENTISSAGE DES MACROS dEXCEL


par Guy Mlard, Marc Colet et Hassane Njimi (avec la collaboration de Uwe Prasser) 2re dition, 21 mars 2005 bas sur "Guide dapprentissage des fonctions et des macros dExcel" 1re dition, 10 mars 2004 par Guy Mlard, Atika Cohen et Marc Colet

PREFACE
Ce texte constitue une introduction la macro-programmation en Excel 2003. Disponible depuis la version 5.0 d'Excel, le langage de programmation s'appelle Visual Basic for Applications (le langage de programmation des applications de Microsoft Office, en abrg VBA). Nous conseillons aux lecteurs intresss de consulter un ouvrage tel que "Visual Basic pour Applications 6", de Mikal Bidault, Editions CampusPress, Paris, 1999. Nous nous limitons quelques possibilits offertes par les macros afin dillustrer lalgorithmique et la programmation. Il faut noter que la macro-programmation VBA est disponible galement sous Word, PowerPoint, Outlook et FrontPage ( partir de la version 6 sous Office2000). VBA permet dautomatiser les tches, de crer des applications compltes, de scuriser vos saisies et vos documents, de crer de nouveaux menus et de nouvelles fonctions pour amliorer efficacement votre logiciel. VBA, langage puissant, souple et facile utiliser permet de raliser trs rapidement des applications qui vous feront conomiser du temps et de largent. Les applications VBA pour Excel sont abrites dans un document Excel ou classeur (appel "workbook") mais peuvent manipuler des informations situes dans d'autres documents de Microsoft Office. Plus gnralement, VBA doit fonctionner dans un environnement appropri. Par exemple un projet VBA pour Excel ncessite l'ouverture dans Excel d'un classeur Excel contenant les modules du programme. Une application VBA cre sous Excel ne pourra pas se lancer sur un poste si Excel nest pas install. Il existe galement un langage de programmation appel Visual Basic tout court, maintenant une partie de Visual Studio .NET, qui permet de dvelopper sous Microsoft Windows (Windows NT/2000/XP) des applications qui ne sont pas lies Microsoft Office. Le Visual Basic et le Visual Basic for Applications sont drivs du langage Basic qui existe depuis 1965 (Basic est l'acronyme de Beginner's All-purpose Symbolic Instruction Code). Il a t conu par Tom Kurtz et John Kemeny du Dartmouth College. Basic (sous les noms Basica ou GWBasic) tait le langage de programmation au premier temps des PC. Il a volu en passant par le Qbasic (inclus sous MS-DOS depuis la version 5.0). Les macro-programmes dExcel 4.0 n'taient pas bass sur Basic mais fonctionnent toujours dans les versions ultrieures d'Excel. Le langage Basic de VBA est compatible avec le Liberty Basic (illustr dans "Dbuter en Programmation", de Greg Perry, Editions CampusPress, Paris, 2002) et avec le S-Basic de la suite libre OpenOffice.org et de StarOffice de Sun. Toutefois, les objets (fentres, boutons et autres contrles) ainsi que leurs mthodes et leurs proprits ne sont pas compatibles.

CHAPITRE 1 VBA : L'EDITEUR DE MACRO


Lancez Excel. L'diteur de macro, ou VBE (Visual Basic Editor) est l'environnement de programmation de VBA. Il se lance par le menu "Outils-Macro-Visual-Basic-Editor" ou par le raccourci clavier "Alt+F11".

1.1 Les principales fentres de VBE :

1- Fentre VBAProject. Elle prsente les diffrents projets ouverts et permet de naviguer facilement entre vos diffrentes feuilles de codes VBA. 2 - Fentre Code. C'est l'endroit ou vous allez saisir votre code VBA.

3 - Fentre Proprits. Proprits de l'objet slectionn. 4- Fentre Excution. Elle permet de tester une partie du code. Elle peut s'avrer trs utile pour voir comment s'excutent certaines lignes de code. Il est fort probable que l'aspect de votre diteur de macros soit diffrent. Il est en effet personnalisable car chaque fentre peut tre masque puis raffiche par le menu "Affichage". Cependant, cette configuration vous permettra de dbuter de faon confortable l'criture de vos premires macros. 1.2 Configuration de lditeur de macros : Il est important de bien configurer l'diteur de macros. En effet, VBE peut vous aider dans l'criture de votre code et le mettre en forme de faon ce qu'il soit plus facile lire. Sous VBE, lancer le menu "Outils-Options" : 1 - Onglet Editeur :

Vrification automatique de la syntaxe : vrification automatiquement de la syntaxe lors de la saisie d' une ligne de code. Dclarations de variables obligatoires : sous VBA, la dclaration de variables n'est pas obligatoire. Cependant, je vous conseille de cocher cette option. De plus amples informations au sujet des variables seront disponibles dans le cours "Les variables". Si la case est coche, l'instruction "Option Explicit" est ajoute dans les dclarations gnrales de tout nouveau module. Complment automatique des instructions : cette option permet VBE de vous aider dans la saisie de votre code.

Vous comprendrez trs vite son utilit lorsque vous saisirez vos premires lignes de codes.

Info express automatique : encore une option trs utile. Elle affiche les diffrents arguments que possde la fonction que vous venez de taper.

Info-bulles automatique : indispensable lors d'un dboguage pas pas. Elle permet l'affichage de vos variables. Retrait automatique : permet VBE de placer chaque ligne de code au mme niveau que la ligne prcdente. Le retrait de lignes se fait par les touches "Tab" et "Shift+Tab". Cette option est ncessaire pour une bonne lecture du code VBA. Paramtres de la fentre : les 3 options sont intressantes. L'dition de texte par glisser-dplacer permet de dplacer l'aide de la souris le bloc de code slectionn, l'affichage du module complet par dfaut permet l'affichage de toutes les procdures d'un mme module et la sparation des procdures oblige VBE crer des traits entre chaque procdure.

2 - Onglet Format de l'diteur :

Cet onglet permet de changer la police et son format pour les diffrentes parties du code inscrit dans vos modules. On ne vous conseille pas de changer les paramtres par dfaut. Ces diffrentes options vous permettent de configurer votre convenance l'diteur de macros. Si vous dbutez, il est conseill de garder les options par dfaut.

CHAPITRE 2 A PROPOS DES MACROS


Les fonctions sont des outils de calcul que vous pouvez utiliser pour aider la prise de dcision, lexcution dactions et lobtention automatique de synthses de donnes. Excel propose deux types de fonctions: les fonctions de feuille de calcul (que vous avez dj utilises) et les fonctions macro. Vous pouvez utiliser les fonctions de feuille de calcul la fois dans les feuilles de calcul et

dans les macros. Par exemple, la fonction SUM (utilise dans le texte sur Excel) calcule la somme de plusieurs nombres; il sagit dune fonction feuille de calcul galement disponible dans une macro. Certaines fonctions ne sont disponibles que dans les feuilles macro. De nombreuses fonctions macro acceptent et renvoient galement des valeurs. Les macros sont des mini-programmes que lon dite dans des feuilles macro. Plusieurs macros peuvent tre dites dans une feuille. Signalons enfin que les oprateurs (+, - , / *, &, ^, ...) sont disponibles aussi bien dans les feuilles de calcul que dans les macros. Enregistrement des macros La manire la plus simple de crer une macro dans Excel est de l'enregistrer. Cela permet dj dautomatiser des tches et donc de les acclrer. L'enregistrement peut comporter des dplacements dans la feuille, des actions correspondant aux commandes des menus et l'tat final des botes de dialogues qui sont actives, y compris le recours aux fonctions et aux modules supplmentaires. Nanmoins il n'est pas possible de tout faire de cette manire. Ni les interactions (affichages de message, saisie de donnes l'excution), ni le contrle du programme (instructions pour raliser des conditions et des boucles) ne sont susceptibles d'tre enregistres parce qu'elles ne correspondent pas des commandes des menus. Pourtant, on recommande de commencer par enregistrer des squences d'oprations (ventuellement de manire spare), de modifier si ncessaire le programme VBA produit et de les relier ensuite dans l'application, ou mieux encore dans des procdures isoles qui seront ensuite assembles pour raliser l'application. Lors de l'enregistrement d'une macro, il est essentiel de choisir entre adressage absolu et adressage relatif. En adressage absolu, la ligne et la colonne des cellules sont enregistres chaque slection. En adressage relatif, ce sont seulement les dplacements en nombre de lignes et de colonnes, en plus ( droite ou vers le bas) ou en moins ( gauche ou vers le haut) qui sont enregistrs. A tout moment on peut passer de l'un l'autre des adressages en cliquant sur le bouton de droite de l'enregistreur de macro. Ecriture des macros Comme nous l'avons dit, la syntaxe des macros dExcel s'appuie sur le langage Basic. Dans ce texte, nous nous rfrons au langage de description dalgorithme (LDA) (tudi notamment dans le cours "Modlisation partie informatique" de G. Mlard, disponible aux Presses Universitaires de Bruxelles). Une comparaison dtaille est donne dans le chapitre 3 qui nest pas essentiel en premire lecture. Le lignes de commentaires commencent par une apostrophe (). Les lignes trop longues peuvent tre coupes en terminant chaque ligne sauf la dernire par un caractre soulign "_". On doit veiller ne pas couper un nom ou une constante en deux parties. La syntaxe dune ligne de commande est la suivante:
variable = expression

o la variable est parfois indispensable, parfois interdite ou encore facultative. Dans sa version la plus simple, une expression peut tre une constante (0, par exemple), une variable (var, par exemple) ou une fonction dExcel, par exemple:
FonctionXl( argument_1, argument_2, argument_3)

Si la variable est omise, on peut employer une procdure, de la forme


ProcedureXl argument_1 argument_2 argument_3

Le nombre d'arguments dpend de la fonction ou de la procdure. Certains arguments peuvent tre omis lors d'un appel de fonction. Ils peuvent alors tre indiqus par "," suivi de ",".

Excel vous informe du nombre et du type darguments dsirs. Dautre part, linterprteur des macros Excel contrle le nombre darguments ainsi que leur type lors de ldition de la macro. Exemples: 1. La fonction MsgBox affiche une bote de dialogue pour les entres de lutilisateur. Cest une fonction uniquement rserves aux macros: variable = MsgBox(texte_message, type_boutons, texte_titre) Trois arguments sont offerts mais un seul est obligatoire: texte_message : message affich dans la bote de dialogue (de type String); type_boutons : facultatif, nombre qui indique le type de boutons dans la bote de dialogue 0 ou vbOKOnly: bouton OK, 1 ou vbOKCancel: boutons OK et Cancel, 3 ou vbYesNoCancel: boutons Yes , No et Cancel, 4 ou vbYesNo: boutons Yes et No, ajouter 16 ou vbCritical, pour avoir en plus un symbole "X", ajouter 32 ou vbQuestion, pour avoir "?", ajouter 48 ou vbExclamation pour avoir "!", ajouter 64 ou vbInformation pour avoir "i" ; texte_titre : facultatif, titre de la bote de dialogue (de type String). La valeur de variable dpend du bouton enfonc par l'utilisateur: 1 (ou vbOK) si c'est OK, 2 (ou vbCancel) si c'est Cancel, 6 (ou vbYes) si c'est Yes, 7 (ou vbNo) si c'est No. On peut employer une instruction conditionnelle (voir exemple 3 ci-dessous). La prsence de variable n'est pas toujours indispensable, notamment pour afficher un message. Si on l'omet (ainsi que le signe "="), il faut employer la variante procdure de la fonction MsgBox qui s'crit de la mme manire mais sans les parenthses: MsgBox texte_message type_boutons texte_titre NB : les MsgBox peuvent simplement donner une information. La procdure est alors stoppe tant que l'utilisateur n'a pas cliqu sur le bouton. MsgBox "Bonjour"

Le texte peut-tre affich sur plusieurs lignes en utilisant le code retour chariot chr(13) ou le code retour ligne chr(10). MsgBox "Bonjour" & Chr(10) & "Il est " & Time

2. La fonction InputBox affiche une bote de dialogue contenant une zone de texte pour inviter l'utilisateur y saisir une information. variable = InputBox(texte_message, texte_titre, dfaut ) Trois arguments sont offerts mais un seul est obligatoire: texte_message : message affich dans la bote de dialogue (de type String); texte_titre : facultatif, titre de la bote de dialogue (de type String), dfaut : facultatif, valeur par dfaut qui apparat dans la zone de texte au moment de l'affichage. La valeur de variable dpend de la zone de texte saisie et est de type String. Elle sera ventuellement convertie en nombre lors du traitement. Si l'utilisateur clique sur le bouton Annuler, une erreur se produit. Elle doit tre capture par une clause "On Error" du Visual Basic. La prsence de la variable est ici indispensable. La variable prendra la valeur saisie au clavier. Par exemple:
nom = InputBox("Entrer votre nom", "Fentre dencodage", "Votre nom")

La variable nom est de type String. Elle est fixe "Votre nom" par dfaut et prendra la valeur saisie au clavier. On peut aussi employer
Age = InputBox("Entrer votre ge", , 20)

Contrairement la documentation, la valeur de la variable Age peut tre traite de manire numrique. Il nest pas ncessaire demployer une instruction AgeNum = Val(Age) pour la conversion numrique. La longueur maximum de texte_message est de 1024 caractres. Pour les crire lcran sur plusieurs lignes on peut sparer plusieurs chanes avec le retour chariot (Chr(13). 3. La structure conditionnelle (plus puissante que la fonction If interne dExcel) se prsente comme suit :
If condition Then bloc d'instructions Else bloc d'instructions End If

On peut complter cette instruction de contrle par une ou plusieurs clauses ElseIf. Exemple
If Age < 25 Then MsgBox "Vous avez droit une rduction pour jeunes" ElseIf Age >= 65 Then MsgBox "Vous avez droit une rduction troisime ge" Else MsgBox "Vous payez le prix plein" End If

On peut aussi omettre Else et le bloc d'instruction qui suit. On peut aussi utiliser la syntaxe simplifie et supprimer Then et End If mais alors le bloc d'instructions doit soit tre compos d'une seule instruction, soit tre compos de plusieurs instructions sur une seule ligne avec des ":" comme sparateurs.

CHAPITRE 3
3.1 INTRODUCTION

CREATION ET EXECUTION DE MACROS

VBA manipule les objets de l'application hte. Chaque objet possde des proprits et des mthodes. Les objets : Chaque objet reprsente un lment de l'application. Sous Excel, un classeur, une feuille de calcul, une cellule, un bouton, etc ... sont des objets. Par exemple, Excel reprsente l'objet Application, Workbook l'objet classeur, Worksheet l'objet feuille de calcul etc... Tous les objets de mme type forment une collection comme, par exemple, toutes les feuilles de calcul d'un classeur. Chaque lment est alors identifi par son nom ou par un index.

Pour faire rfrence la deuxime feuille (ici Sheet2), on va utiliser Worksheets(2) ou Worksheets("Sheet2") Chaque objet peut avoir ses propres objets. Par exemple, Excel possde des classeurs qui possdent des feuilles qui possdent des cellules. Pour faire rfrence une cellule, on pourrait ainsi utiliser : Application.Workbooks(1).Worksheets("Sheet2").Range("A1") Les proprits : Une proprit correspond une particularit de l'objet. La valeur d'une cellule, sa couleur, sa taille, ..., sont des proprits de l'objet Range. Les objets sont spars de leurs proprits par un point. On crira ainsi Cellule.Proprit = valeur, par exemple pour mettre la valeur 10 dans la cellule A1 : Range("A1").Value = 10 Une proprit peut galement faire rfrence un tat de l'objet. Par exemple, si on veut masquer la feuille de calcul "Sheet2", on crira : Worksheets("Sheet2").Visible = False Les mthodes :

On peut considrer qu'une mthode est une opration que ralise un objet. Les mthodes peuvent tre considres comme des verbes tels que ouvrir, fermer, slectionner, enregistrer, imprimer, effacer, etc... Les objets sont spars de leurs mthodes par un point. Par exemple, pour slectionner la feuille de calcul nomm "Feuil2", on crira : Worksheets("Sheet2").Select Lorsque l'on fait appel plusieurs proprits ou mthodes d'un mme objet, on fera appel au bloc d'instruction With Objet Instructions End With. Cette instruction rend le code souvent plus facile lire et plus rapide a excuter. 'Mettre la valeur 10 dans la cellule A1, la police en gras et en italique et copier la cellule. With Worksheets("Sheet2").Range("A1") .Value = 10 .Font.Bold = True .Font.Italic = True .Copy End With Ce vocabulaire peut paratre droutant mais deviendra trs rapidement familier lors de la cration de vos premires applications. Avant de commencer : Attention aux virus ! Bien qu'ils soient rares, il existe des virus qui s'attaquent des documents Excel. La plupart sont des virus de type macro-commande. C'est pour cette raison qu'Excel vous demande lorsqu'il ouvre un document ayant une macro-commande s'il doit les activer ou non. Si vous savez que vous avez cr des macros pour vos besoins, vous pouvez rpondre " Autoriser les macros : Enable ". Sinon, ne courez pas de risque et rpondez " Dsactiver les macros : Disable ". Les virus de macro commandes taient si "populaire" une priode que Microsoft a ragi en ajoutant un niveau de scurit sur les macro aux versions d'Excel 2000 et les suivantes. Du menu Tools, slectionnez les options Macro et Security. Vous pouvez choisir parmi trois niveaux de scurit. Niveau High Medium Description N'active pas les macros commandes inclus dans un fichier Excel. Vous demande l'autorisation pour activer les macro-commandes incluses avant l'ouverture du fichier. Ouvre le fichier Excel sans aucune vrification des macrocommandes. Expose votre ordinateur aux risques relis des macros commandes.

Low

C'est votre dcision de choisir le niveau de protection qui rpond vos besoins. On vous recommande de mettre le niveau de scurit Medium. Excel va vous demander l'autorisation d'ouvrir un fichier ayant des macros commandes. Il faut se protger lorsqu'on considre le nombre de virus qui se propagent sur l'Internet. C'est un compromis entre la scurit et une option pratique. Du rpertoire F:\MELARD, recopiez sur votre unit H: le fichier " EX03CH4.XLS". Ouvrez ce fichier et sauvez-le sous le nom VB1GgBbb.xls, o g est le numro de srie et bb, le numro de binme. Cest lexercice du chapitre 4 du Guide dApprentissage dExcel, partiellement rsolu.

10

Dans le champ D4:F6 de la feuille de travail Emprunt_unique , on a insr les donnes concernant trois modalits demprunt nommes Plan 1, Plan 2 et Plan3. Nous allons crer quatre macros. Trois seront obtenues par enregistrement. La quatrime sera crite. Les quatre macros porteront les noms suivants : Emprunt_Initial Emprunt__5_ans Rduction_Montant_Emprunt Il faudra recopier le champ D4:D6 sur le champ B4:B6. Il faudra recopier la cellule E6 dans la cellule B6. Il faudra recopier le champ F4:F6 sur le champ B4:B6.

Quantit_de_Limousine Il sagit de modifier, dans la feuille de travail emprunts_multiples , la Quantit des limousines acqurir figurant dans la cellule C7 pour parvenir lobjectif de 44 passagers dans la cellule B15 avec un total des mensualits infrieur ou gal 3700 dans la cellule B14. Revenez au classeur Excel. 3.2 ENREGISTREMENT DUNE MACRO

Enregistrons la macro Emprunt_Initial. Dans le menu Tools, cliquez sur Macro, Record a new macro et compltez le nom dans la zone Macro Name. Une petite fentre de contrle denregistrement souvre. Le bouton avec le carr permettra darrter lenregistrement. Entre-temps, la plupart de vos actions dans Excel seront enregistres. Slectionnez les cellules copier de D4 D6. Copiez la slection. Collez les valeurs (menu Edit Paste Special Values) dans la cellule B4. Arrtez lenregistrement. Vous pouvez vrifier la macro en lexcutant. Dans le menu Tools, cliquez sur Macro, Macro et slectionnez le nom Emprunt_Initial. Cliquez sur Run. Par curiosit, vous pouvez voir le code gnr comme suit. Dans le menu Tools, cliquez sur Macro, Macro et slectionnez le nom Emprunt_Initial. Cliquez sur Edit. La fentre du Visual Basic souvre. Certaines lignes pourraient tre supprimes. Ne supprimez rien maintenant. Ne fermez pas le Visual Basic mais retournez Excel (cliquez sur le bouton Excel sur la barre des tches ou sur le bouton Excel dans la barre doutils de Visual Basic. 3.3 ENREGISTREMENT DE DEUX AUTRES MACROS

Enregistrons la macro Emprunt__5_ans. Arrangez-vous pour que la cellule E6 soit copie sur la cellule B6. Vous pouvez vrifier la macro en lexcutant. Dans le menu Tools, cliquez sur Macro, Macro et slectionnez le nom Emprunt__5_ans. Cliquez sur Run. Consultez ensuite le code correspondant. Vous pouvez profiter de loccasion pour tendre la copie sur les cellules E4:E5. Remplacez E6 par E4:E6. Sauvez. Retournez Excel. Refaites la mme chose pour enregistrer la macro Rduction_Montant_Emprunt. 3.4 CREATION DUNE MACRO

La cellule B17 contient une formule qui permet dindiquer si la quantit des limousine acqurir sous contraintes (voir dtails des contraintes), est la bonne ou pas. Nous lavons cache (en employant un format de cellule ;;;). Nous allons crire une macro qui affiche le contenu de cette cellule en fonction de la valeur de la quantit des limousine acqurir dans la cellule C7 qui demande lutilisateur dentrer une nouvelle valeur qui est place dans la cellule C7.

11

La premire tape est ralise laide de la fonction MsgBox dans sa variante procdure. Un seul argument sera utilis : le texte du message. Il sera obtenu par concatnation de mots et de contenus de cellules. Les mots doivent tre placs entre guillemets. La concatnation emploie loprateur & entour despaces. Les valeurs de cellules doivent tre de la forme Range("B17").Value Remarque : Rapellons que Range("B17").Value signifie ce qui permet daccder la valeur contenue dans la cellule B17. Ci-dessus un exemple de message afficher.

Pour la saisie dune nouvelle valeur, on doit obtenir la fentre suivante

Pour y parvenir, utilisez la fonction InputBox. Ceci se fait comme suit : Range("C7").Value = InputBox("Entrez une autre valeur ") Si vous prenez got Visual Basic et aux macros, vous pouvez affecter la macro que vous venez de raliser un bouton dfinir dans votre feuille. Pour y parvenir, choisir dans le menu View , activez la commande ToolBars, puis choisir Form. Slectionnez Button puis suivre les instructions o lon vous demande de prciser quel macro doit tre associ le bouton. Sauvez le fichier toujours sous le mme nom VB1GgBbb. Essayez de trouver le bon nombre de chaque vhicule qui est commander.

12

CHAPITRE 4 COMPARAISON ENTRE LDA ET EXCEL VBA


4.1 TYPES DE VARIABLES

En LDA :
Variable ou Tableau Numerique ou Caractere ou Logique

Exemple de dclaration de variables :


Variable S, i : numrique Variable Nom, prenom : caractre Variable Trouve : logique Tableau Tableau Pays(200) : caractre Nhabitants(200) : numrique

Macros VBA: Les donnes ne doivent pas tre obligatoirement dclares. Dans un programme complexe, il est prfrable de le faire. Nous le ferons toujours ici sauf dans les extraits de programmes. Le nom des variables peut aller jusqu' 255 caractres. Il ne doit pas commencer par un chiffre et ne doit pas comporter les caractres suivants: espace, "@", "$", "#", ".", "!". Commencer le nom par une lettre (de prfrence majuscule). Lors d'une procdure, les variables servent stocker toutes sortes de donnes (des valeurs numriques, du texte, des valeurs logiques, des dates ...). Elles peuvent galement faire rfrence un objet. Suivant les donnes que la variable recevra, on lui affectera un type diffrent. Les diffrents types de variables de VB sont : Type de donnes: Octet Logique Entier Entier Long Dcimal simple Mot cl : Byte Boolean Integer Long Single Espace occup Plage de valeur 1 octet 2 octets 2 octets 4 octets 4 octets Entier de 0 255 True ou False Entier de -32 768 32 768 Entier de -2 147 483 648 et 2 147 483 647 2 147 483 648 et 2 147 483 647 -3,402823E38 -1,401298E-45 pour les valeurs ngatives, 1,401298E-45 3,402823E38 pour les valeurs positives. -1,79769313486E308 -4,940656458412E-324 pour les valeurs ngatives 4,94065645841247E324 et 1,79769313486231E308 pour les valeurs positives de -922 337 203 685 477,5808 et 922 337 203 685 477,5807 1er Janvier 100 au 31 dcembre 9999 +/-79 228 162 514 264 337 593 543 950 335 sans point dcimal

Dcimal Double

Double

8 octets

Montaire Date Decimal

Currency Date Decimal

8 octets 8 octets 12 octets

13

+/-7,9228162514264337593543950335 avec 28 dcimales. Objet Object 4 octets 10 octets + longueur de chane Longueur de la chane 16 octets toute rfrence des objets de 0 2 milliards de caractres

Chane de caractres String longueur variable Chane de caractres String longueur fixe Variant avec chiffres Variant avec caractres Dfini par l'utilisateur Variant Variant

1 65 400 caractres Valeur numrique jusqu'au type double.

Mme plage que pour un String de longueur 22 octets + longueur de la variable chane Variable Identique au type de donnes.

Type

Pour rendre obligatoire la dclaration de variables, placez l'instruction "Option Explicit" sur la premire ligne du module ou cochez l'option "Dclaration des variables obligatoires" dans le menu "Outils-Options" de l'diteur de macros. La dclaration explicite d'une variable se fait par le mot Dim (abrviation de Dimension). La syntaxe est "Dim NomDeLaVariable as Type". Dclaration explicite: (recommand)
Dim n As Long Dim chaine As String Dim logique as Boolean

Vous pouvez galement dclarer vos variables sur une mme ligne :
Dim n As Long, Dim chaine As String, Dim logique as Boolean

Dclaration par affectation: par dfaut de type Variant. ( viter)


n = 0 chaine = "texte initial" logique = true

Dclaration lors de la saisie: ( viter)


n = InputBox( "entrez le nombre n" ) chaine = InputBox( "entrez la chaine de caractre n", , "texte initial") logique = InputBox("Le tp est-il fini ? (true,false)", "", "true")

14

4.2

EXPRESSIONS ET INSTRUCTIONS DAFFECTATION LDA (ex: A B) +, -, *, / (exponentiation) et ou non > , <, , , , = + (ex: "Mr " + nom + " " + i) VBA = (ex: A=B) +, -, *, / ^ And Or Not >, <, >= , <= , <>, = & (ex: "Mr " & nom & " " & i)

Description Affectation oprateurs arithmtiques oprateurs logiques

oprateurs relationnels Oprateur de concatnation 4.3

QUELQUES FONCTIONS MATHEMATIQUES VBA =Abs(x) =Sqr(x) =Int(x) =Log(x), =Exp(x) =Sgn(x) =Sin(x), =Cos(x), =Tan(x), =Atn(x)

LDA valeur absolue |x| racine carre x partie entire x log nprien, exponentielle LN(x), EXP(x) Signe trigonomtriques SIN(x), COS(x), TAN(x), ATAN(x)

4.4 INSTRUCTIONS DE LECTURE/ECRITURE La lecture et lcriture est assez diffrente en LDA et dans les macros. En LDA et pour les langages de programmation classiques (FORTRAN, BASIC, PASCAL, C, C++ ...), les instructions sont gnralement les mmes que lon travaille avec le clavier ou un fichier (en entre) ou avec un fichier, lcran ou l'imprimante (en sortie). Avec Excel, les choses sont diffrentes. En effet, une macro peut communiquer des informations avec les autres feuilles. Ainsi, on peut tout aussi bien entrer des donnes dans une cellule que dans une bote de dialogue. Nous y reviendrons plus tard. LDA Lire Fichier,... Lire ( partir dun fichier) Saisir ... Saisie Ecrire Fichier,... Ecriture (sur fichier) Impression (imprimante LPT1) Imprimer Afficher Affichage (cran) Exemples.
Dim Nom As String Nom = InputBox(" Entrez votre Nom ---> ") MsgBox " Bonjour " & Nom

VBA Instruction INPUT (voir aide en ligne) Instruction INPUT (voir aide en ligne) Instruction PRINT (voir aide en ligne) Non disponible MsgBox(...)

4.5 LDA

STRUCTURE DALTERNATIVE VBA

15

Si condition alors ... ... sinon ... ... Finsi

If condition Then ... ... Else ... End If

S'il n'y a pas de clause Else et si le bloc comporte une seule instruction, on peut crire :
If condition Then instruction

LDA Selon que condition1 : ... condition2 : ... ... conditionK : ... autrement finselonque Exemple en LDA
Variable age : numrique Afficher "Entrer votre ge" Saisir age Si age < 25 alors

...

VBA If condition1 Then ... ElseIf condition2 ... ElseIf conditionK ... Else ... End If

Afficher "Vous avez droit une rduction pour jeunes"

sinon Si age >= 65 alors Afficher "Vous avez droit une rduction troisime ge" sinon Afficher "Vous payez le prix plein" finsi finsi Afficher "Votre ge est de ", age, " ans "

VBA
Dim Age As Single Age = InputBox("Entrer votre ge") If Age < 25 Then MsgBox "Vous avez droit une rduction pour jeunes" ElseIf Age >= 65 Then MsgBox "Vous avez droit une rduction troisime ge" Else MsgBox "Vous payez le prix plein" End If

16

4.6

STRUCTURE DE REPETITIVE AVEC CONDITION

Il existe plusieurs structures rptitives en VBA. Nous considrons ici la forme la plus gnrale qui est aussi la plus pratique dans les langages de programmation.
LDA VBA

Itrer bloc dinstructions sortir si condition bloc dinstructions Finitrer Exemple LDA

Do bloc dinstructions If condition Then Exit Do bloc dinstructions Loop

Variable n,somme,sentinelle,donnee : numrique n 0 somme 0 Afficher "Entrez la valeur sentinelle" Saisir sentinelle Afficher "Entrez une donne ou ", sentinelle, " pour terminer" Itrer Saisir donnee Sortir si sentinelle = donnee n n + 1 somme somme + donnee Afficher "Entrez une donne ou ", sentinelle, " pour terminer" finitrer Afficher "Somme des donnes= ",somme Afficher "Nombre de donnes encodes= ", n

Exemple VBA
Dim n As Integer Dim somme As Single, sentinelle As Single, donnee As Single n = 0 somme = 0 sentinelle = InputBox("Valeur sentinelle") Do donnee = InputBox("Entrez une donne ou " & sentinelle & _ " pour terminer") If sentinelle = donnee Then Exit Do n = n + 1 somme = somme + donnee End Do MsgBox "Somme des donnes= " & somme MsgBox "Nombre de donnes encodes= " & n

17

4.7

BOUCLE AVEC COMPTEUR


VBA For compteur = 1 To n ... ... ... Next compteur

LDA Pour compteur =1 n faire ... ... ... finpour

On peut aussi effectuer une boucle avec un pas. Dans le cas dune boucle de pas 1, on omet naturellement la clause "Step". Sil ny a quune boucle, on peut omettre le nom de la variable de comptage (ici compteur) dans l'instruction Next..
LDA Pour compteur =1 n par pas de 2 faire ... ... Finpour VBA For compteur = 1 To n Step 2 ... ... Next compteur

Exemple LDA
Variable n, cpteur,fact : numrique Saisie n Afficher "Calcul de la factorielle de N. N = ?", n Fact 1 Pour cpteur = 1 n faire Fact fact*cpteur finpour Afficher n, "!= ", fact

VBA
Dim n, cpteur As Integer Dim fact As Double 'C'est bien ncessaire pour un nombre aussi grand n = InputBox("Calcul de la factorielle de N. N = ?") fact = 1 For cpteur = 1 To n fact = fact * cpteur Next MsgBox n & "!= " & fact

Remarque. Pour les tableaux, l'indice de dbut par dfaut est 0 au lieu de 1. Pour que l'indice de dbut par dfaut soit 1, il faut mentionner, en dehors d'une procdure :
Option Base 1

18

CHAPITRE 5 Exercices de programmation

5.1 Familiarisation avec les programmes en VBA pour EXCEL Dans le rpertoire MELARD de lunit F: vous trouverez le classeur Excel Algos du Cours.xls . Faites en une copie dans votre unit H: . Ouvrez ce classeur avec EXCEL. Il contient neuf feuilles de travail EXCEL. Leurs noms sont ceux des diffrents sous-chapitres du chapitre 2, partie Algorithmique du cours, lexception de la feuille params qui contient les donnes relatives lun des programmes VBA. Sauvez le classeur sous le nom VB2GgBbb.xls. Ouvrez lditeur Visual Basic . Vous le trouverez dans le sous-menu Macro du menu Tools . Les modules Dans la partie gauche de la fentre vous pouvez visualisez larborescence des diffrentes catgories dobjets qui se trouvent dans le classeur. Il y a essentiellement les feuilles de travail, des formulaires (forms) et des modules. Nous reviendrons plus loin sur les formulaires. Les modules contiennent le code des programmes VBA. Pour faciliter lusage de ce classeur, nous avons cr huit modules, chacun de ces modules correspond une feuille de travail. Les programmes qui peuvent tres excuts partir dune feuille de travail sont donc tous crits dans le module correspondant la feuille. Ceci nest pas une obligation : toutes les fonctions et procdures crites dans nimporte quel module dun classeur sont accessibles partir de toute feuille de travail de ce classeur. Dans le classeur Algos du Cours on aurait donc peu crire toutes les procdures et fonction VBA dans un seul module. La rpartition en plusieurs modules est laisse lapprciation du dveloppeur. Le bon sens de celui-ci et son souci de faciliter lutilisation le guident pour organiser les modules. Parcourez successivement toutes les feuilles de travail et excuter les procdures en cliquant sur les boutons qui sy trouvent. Lisez dans les modules correspondants le code des procdures excutes. Efforcez-vous de comprendre leffet de chaque instruction VBA excute. Ceci peut vous aider tant pour comprendre les algorithmes que pour vous familiariser la programmation VBA. Sauvez souvent le classeur sous le nom VB2GgBbb.xls afin d'viter de perdre le travail ralis. Voici la liste des 8 modules, le nombre d'algorithmes, les pages du cours et ce qu'il faut faire : Squence Alternative Rptitive Compteur Accumulateur Complet Tableau 2 4 3 4 2 1 6 page 39 pages 40-42 pages 44-45 pages 46-47 pages 48-49 page 53 pages 55-58 changer les donnes changer les donnes changer un peu les programmes changer les textes affichs changer les noms de quelques variables corriger le cas o on entre 0 la premire fois 1. changer les dernires donnes et le nombre 2. simplement excuter les autres : changer les noms des pays Module 1 page 59 changer les donnes des deux matrices

19

Si vous voulez tester les exemples du cours plus votre aise, noubliez pas de prendre une copie sur disquette du classeur. Les formulaires utilisateur (userforms) Dans les chapitres prcdents, vous avez appris utiliser les botes de message (MsgBox) et les botes de saisie (InputBox). Lorsque lon doit saisir plusieurs donnes, ventuellement de types diffrents, utiliser une succession de botes de saisie peut tre inconfortable et obscurcir lutilisation dun dveloppement. Il vaut mieux alors utiliser un formulaire utilisateur. Celui-ci permet de saisir dans une seule fentre toutes les donnes. Dans le formulaire, le dveloppeur peut galement afficher toute linformation utile lutilisateur. Voir la feuille Alternatives , cliquer sur le bouton Formulaire . Nous ne vous demanderons pas de crer des formulaires utilisateur dans les exercices qui suivront, mais il est bon de savoir quils existent. 5.2 Programme corriger et excuter Il sagit dun programme effectuant un procd lmentaire de cryptographie. La cryptographie permet de transmettre des messages qui peuvent tre intercepts sans pouvoir rvler leur contenu. De tels algorithmes sont de nos jours employs sur lInternet pour transmettre des informations bancaires et financires, par exemple. Pour simplifier le document transmettre est compos seulement de chiffres, par exemple: 123456789012345678901234567890 (30 chiffres) L'expditeur spcifie une cl de 8 chiffres connue du destinataire, par exemple: 29022002 (pour le retenir: 29 fvrier 2002) Le cryptage consiste juxtaposer la cl autant de fois que ncessaire ici quatre fois (4x8 = 32 > 30): 29022002290220022902200229022002 et ajouter chiffre chiffre modulo 10, pour obtenir le message cl : document : message : 29022002290220022902200229022002 123456789012345678901234567890 313676701914545897923236757010

par exemple: chiffre 1: 2 + 1 = 3 chiffre 2: 9 + 2 = 11 donc 1 chiffre 3: 0 + 3 = 3 chiffre 29: 2 + 9 = 1 chiffre 30: 0 + 0 = 0 Le destinataire reoit le message et doit recomposer le document. Il procde par soustraction message - cl, chiffre par chiffre, modulo 10, donc en ajoutant 10 si la diffrence est strictement ngative : message : cl : rsultat : 313676701914545897923236757010 29022002290220022902200229022002 123456789012345678901234567890

par exemple: chiffre 1: 3 - 2 = 1

20

chiffre 2: 1 - 9 = -8 donc 2 chiffre 3: 3 - 0 = 3 chiffre 29: 1 - 2 = -1 donc 9 chiffre 30: 0 - 0 = 0 Dans votre unit H:, faites une copie du classeur CryptoVBA.xls qui se trouve dans le rpertoire MELARD de lunit F:. Ouvrez-le et sauvez-le chez vous sous le nom VB3GgBbb.xls. Le classeur contient une feuille de travail et un module VBA : feuille Crypto, module ModuleCrypto. Essayez le programme avec une longueur de 9. Vous devrez corriger le programme VBA qui est la traduction en VBA de lalgorithme contenu sous forme de commentaires dans le module. La feuille de travail et le module VBA contiennent toutes les informations ncessaires lexcution du travail. Efforcez-vous de bien comprendre chaque ligne du code VBA. Indications. L'algorithme est correct mais il y a 2 erreurs dans le programme. Notez que pour simplifier l'utilisation, on ne saisit pas la cl mais on la dfinit dans le programme. Pour viter de saisir le message plusieurs fois, vous pouvez procder dune manire similaire. Nous avons dj simplifi la sortie pour permettre une vrification plus aise. 5.3 Ecriture de programmes en VBA 5.3.1 Banques Dans cette section, nous allons voir comment crer un programme en VBA (un exemple de la programmation modulaire). On va utiliser un mlange de fonctions et de procdures. Lexemple quon va considr est celui que vous avez dj vu au chapitre 3 des exercices sur Excel. Il sagit du problme des banques d'information. On dispose des donnes relatives aux cots de connexion certaines banques d'informations ainsi que des donnes indiquant pour des utilisateurs de ces banques les dures de connexion et d'autres paramtres entrant dans le calcul du cot d'une connexion (nombre de rfrences consultes, plage horaire o se situe la connexion, etc.). La banque A: Le cot d'une connexion est proportionnel sa dure (exprime en minutes) et tient compte du nombre de rfrences consultes selon la formule suivante: cot = dure * prix_minute + nb_ref * prix_ref La banque B: On y dfinit trois prix diffrents en fonction de la plage horaire o se situe la connexion. De ce fait, le prix de la connexion est obtenu par la formule suivante: cot = dure_1 * prix_1 + dure_2 * prix_2 + dure_3 * prix_3 La banque C: Cette banque d'information pratique un taux rgressif en fonction de la dure de la connexion: 100% du prix de base pour les dix premires minutes, 90% pour les dix minutes suivantes, 75% pour les dix minutes suivantes et seulement 55% pour le reste du temps de connexion.

21

Rappel de l'algorithme utilis dans Excel: d dsigne la dure de connexion et p le prix de base d'une minute.
Si d < 10 cot = d * sinonsi d < 20 cot = 10 sinonsi d < 30 cot = 10 sinon cot = 10 finsi p * p + (d-10) * p * 0.9 * p + 10 * p * 0.9 + (d-20) * p * 0.75 * p + 10 * p * 0.9 + 10 * p * 0.75 + (d-30) * p * 0.55

La banque D: Pour y avoir accs, il faut y tre abonn et avoir pay une redevance (diffrente selon les utilisateurs). Cette redevance reprsente un avoir mensuel (non cumulable) en temps de connexion cette banque d'informations car seules les minutes de connexions supplmentaires sont factures au tarif indiqu. Ainsi, un utilisateur qui s'est connect pendant une dure donne exprime en minutes n'aura rien payer si la relation dure * prix_minute redevance est vrifie et ne payera que la diffrence dans le cas contraire. Notez qu'il existe dans VBA une fonction "max", comme dans Excel, qui vous permettra de dterminer lgamment et simplement la somme payer (allez voir dans votre fichier Excel la formule que vous avez utilis pour dterminer le cot de la Banque D) On se proposait dans l'exercice Excel de raliser un certain nombre de tches dont nous ne retiendrons que les suivantes (ne commencez pas maintenant; lisez plutt l'nonc jusqu'au bout): (1) Calculer, pour chaque utilisateur, le montant d pour les connexions qu'il a effectues chacune des banques d'informations durant une priode donne (un mois pour fixer les ides). (2) Calculer le montant global d pour chaque utilisateur (3) Calculer la somme due chaque banque par l'ensemble des utilisateurs, prsenter ces sommes dans un graphique de type histogramme La feuille de calcul tait compose de deux tableaux. Le premier contenait les cots de connexions par utilisateur et par banque d'informations ainsi que les totaux associs (nous considrions un exemple avec 7 utilisateurs) et se prsentait comme suit: TABLEAU 1. COUTS DES CONNEXIONS AUX BANQUES D'INFORMATIONS
Banque A Ut 1 Ut 2 ... Ut n TOTAL xxxx.xx xxx.xx Banque B xxx.xx xxx.xx Banque C xxxx.xx xxxx.xx Banque D xxxx.xx xxx.xx Total xxxxx.xx xxxxx.xx

xxxxx.xx

xxxxx.xx

xxxxx.xx

xxxx.xx

xxxxx.xx

Le deuxime tableau contenait les donnes du problme (tarifs des connexions et informations relatives aux utilisateurs) ainsi que la moyenne des utilisations par banque lors de la priode prcdente. Ce tableau ressemblait ceci :

22

TABLEAU 2. TARIF DES CONNEXIONS AUX BANQUES D'INFORMATIONS


Banques prix A min 30.5 A dure 152 328 ref 46.8 min_1 22.6 B min_2 35.7 B dure 54 34 min_3 52.4 C min 48.2 D min 32.6

RECAPITULATIF DES DUREES DE CONNEXION


Banques Usagers Ut 1 Ut 2 ... Ut n M-PRECED M-ACTUEL nb ref 327 290 dure 80 120 dure 40 38 C D dure d red 143 120 3450 0 0 0

Au lieu demployer Excel, on envisage d'crire un programme modulaire en VBA. Une partie du programme est crite dans le module "Modulebanques". Le traitement est dcoup en procdures et fonctions dont les noms sont les suivants : Sub Banques ( ) Procdure principale Function SaisieTarifs ( ) On saisit les donnes du tarif pour les quatre banques Function NomUtilisateur ( ) On saisi le nom d'un utilisateur Function AfficheDepUtilisateur (Utilisateur, DepMois) On affiche le nom de l'utilisateur et le total des dpenses du mois actuel d'un utilisateur donn. Function CoutBanqueA (PminA, PrefA) Il s'agit de saisir la dure de connexion, duree, et le nombre de rfrences, nbref, d'un utilisateur de la banque A et de calculer le cot correspondant: CoutBanqueA = PminA * duree + PrefA * nbref Function CoutBanqueB (P1B,P2B,P3B) Il s'agit de saisir les trois dures de connexion duree1, duree2 et duree3 pendant les trois types de plages horaires et de calculer le cot total correspondant Function CoutBanqueC (PC) Ici, on saisit la dure de connexion d'un utilisateur la banque C, duree, et on calcule le cot en se basant sur le tarif dgressif suivant: 100 % pour les 10 premires minutes, 90 % pour les 10 minutes suivantes, 75 % pour les 10 minutes suivantes et 55 % pour le reste du temps de connexion Function CoutBanqueD (PminD) Toujours pour un utilisateur, on saisit la dure de connexion la banque D, duree, et le montant de redevance qu'il a paye, redevance, qui reprsente un avoir mensuel (non cumulable) en temps de connexion car seules les minutes de connexion supplmentaires sont factures au tarif indiqu; l'utilisateur n'aura rien payer si duree*PminD < redevance

23

A titre d'exemple, la fonction CoutBanqueA se prsentera comme suit: Function CoutBanqueA (PminA as Double, PrefA as Double) as Double Dim Duree as Double, NbRef as Double Duree = 0 Nbref = 0 Duree = InputBox ("Banque A, dure de connexion : ") NbRef = InputBox ("Banque A, nombre de rfrences : ") CoutBanqueA = Duree*PminA + NbRef*PrefA End Function Les variables cres dans la fonction CoutBanqueA sont locales la fonction, comme Duree et NbRef. Travail faire : On demande 1. Dans votre unit H: , faites une copie du classeur BanquesVBA.xls qui se trouve dans le rpertoire MELARD de lunit F:. Ouvrez-le et sauvez-le chez vous sous le nom VB4GgBbb.xls. Le classeur contient une feuille de travail (Banques) et un module VBA (ModuleBanques). 2. Dans le module Banques, vous devrez crire un programme VBA (ensemble de procdures et fonctions) qui est la traduction en VBA des algorithmes contenus sous forme de commentaires dans le module. 3. D'crire dans le module ModuleBanques la fonction BanqueA telle que prsente si dessus en y ajoutant les instructions ncessaires pour s'assurer que Duree et NbRef soient suprieurs ou gaux 0 ; de tester le programme; 4. Toujours dans le mme module, de dtailler les fonctions relatives aux trois autres banques; 5. De tester votre programme avec les donnes utilises pour l'exercice Excel. 5.3.2 La billetterie du parc d'attraction WILABA

Votre tche est d'crire un programme pour traiter la billetterie journalire dans le parc dattraction 'WILABA' ouvert de 10h 20h. Il ny a pas de droit dentre, mais 10 attractions sont payantes. Toutes ces attractions durent 20 minutes. Une premire sance commence 10h et se termine 10h20, aprs une pose de 10 minutes commence la sance suivante et ainsi de suite jusqu 20h. Les heures de sances sont donc 10h, 10h30, 11h, 11h30, 12h, 12h30, 13h, 13h30, 14h, 14h30, 15h, 15h30, 16h, 16h30, 17h, 17h30, 18h, 18h30, 19h, 19h30, Au cours dune journe il y a donc 20 sances durant lesquelles fonctionnent chacune des 10 attractions payantes. Chaque attraction a sa capacit propre de spectateurs. La premire (la plus grande) 'Teteenbas' contient GBB places (cest--dire 150 places pour le binme 50 du groupe 1). Le nombre de places exact (minimum 60) des autres, ainsi que leur noms, est laiss votre apprciation. Le tarif est le mme pour toutes les attractions (10 EUR sans rduction et 6 EUR avec la carte avantage Wilaba+bonus+). On peut prendre des billets pour une attraction durant les 30 minutes qui prcdent la sance. En fait lalgorithme ne contiendra pas la notion de temps, mais devra permettre laide dune valeur sentinelle, introduite par la caissire, de passer dune sance lautre (par

24

exemple: en consultant sa montre 11h30, la caissire introduit cette valeur sentinelle pour clturer la vente de billets pour la sance 4 et commencer la vente pour la sance 5. Le programme doit, pour chaque demande de billet(s), saisir le numro dattraction, le nombre de places souhait et le tarif appliqu (on suppose un seul tarif appliqu par demande). Il affichera ensuite le prix d par le client. Le programme doit galement mettre jour le nombre de places libres par attraction et prvenir le client lorsquil ny a plus de place ou presque (moins de 20 places) afin dviter de placer des gens aux endroits quils ne souhaitent pas. La recette totale de la journe doit galement tre mise jour. A lheure de changer de sance, la caissire entre la sentinelle (par exemple une valeur ngative de numro dattraction). Le programme doit alors afficher l'cran la recette par attraction. La recette totale et la frquentation des attractions (en pourcentage) seront affiches lorsque les 20 sances auront t cltures. Vous rdigerez lalgorithme sous forme de commentaire dans un module VBA dans un fichier sauv sous le nom VB5GgBbb.xls, o g est votre numro de groupe et bb est votre numro de binme. Vous le traduirez en VBA. Nous vous demandons bien sr de le tester. 5.3.3 M. Olaire, dentiste (Examen dalgorithme de juin 2000)

M. Olaire est dentiste. Il a informatis une partie de la gestion de son cabinet dans Excel mais veut aller plus loin. Ses premiers essais sont infructueux au point qu'il s'arrache les cheveux (pas ses dents heureusement). Comme son fils a appris l'informatique l'Universit, il lui demande de l'aider. Celui-ci n'est pas en sciences conomiques et n'a pas de connaissances en algorithmique. Il vous demande donc de raliser l'algorithme pour lui, en langage de description d'algorithme (vous pouvez crire le programme directement en VBA si vous prfrez, mais veuillez ne pas mlanger). Les patients sont identifis par leur numro de scurit sociale (de 8 chiffres exactement). Un fichier PATIENTS.TXT sera lu en mmoire par la procdure LecturePatients que vous ne devez pas crire (vous pouvez donc supposer que les donnes sont dj en mmoire). Il comporte, pour chaque patient, les informations numriques suivantes: son numro de scurit sociale et la date de sa dernire visite (sous forme de nombre de jours couls depuis le 1er janvier 1980). Le numro de ligne est le numro d'inscription chez M. Olaire (entre 1 et 2000). Dans un autre fichier ADRESSES.TXT qui sera galement en mmoire grce la procdure LectureNomPrAdresses, la ligne i contient le nom, le prnom et l'adresse du ime patient de M. Olaire (sur 128 caractres). L'algorithme lit les deux fichiers (voir ci-dessous) et cre trois tableaux une dimension appels assez naturellement: NumSS, DateDernVisite et NomPrAdresse. Ils sont de type numrique sauf ce dernier. Notez que le numro de patient n'est pas enregistr dans un tableau puisqu'il n'est pas ncessaire. A partir d'une certaine ligne, les lments sont tous nuls parce que M. Olaire n'a pas encore 2000 patients. L'algorithme commence par afficher de manire rpte un menu offrant de quitter le programme ou d'effectuer une des deux actions suivantes. 1. Mettre jour la date de dernire visite. Le dentiste doit saisir le numro de scurit sociale. L'algorithme refuse absolument un numro de scurit sociale qui ne comporte pas exactement 8 chiffres. Quand le numro est accept, il consulte le tableau NumSS et dtermine la ligne i sur laquelle se trouvent les informations relatives au patient. L'lment correspondant de DateDernVisite est alors remplac par la date du jour (voir ci-dessous). Si le numro de scurit sociale n'existe pas dans le tableau NumSS, c'est que le patient n'est pas encore inscrit chez M. Olaire et cette inscription est alors effectue en remplaant la premire ligne contenant des zros des tableaux NumSS, et DateDernVisite et en compltant la mme ligne du tableau NomPrAdresse. Il faut videmment signaler si jamais il n'y avait plus de place dans le tableau.

25

2. Produire une lettre de rappel pour tous les patients dont la dernire visite date de plus de 180 jours. Ce nombre de jours s'obtient en calculant la diffrence entre l'lment de DateDernVisite et la date du jour (voir ci-dessous). Cette lettre se prsente comme ceci (n'crivez les instructions Imprimer que pour les lignes intressantes, celles indiques entre parenthses contenant de l'information variable selon le patient) "(nom, prnom et adresse) Chre Madame, Mademoiselle, Monsieur, Puis-je vous faire observer que votre dernire visite remonte il y a (nombre de jours) jours. Formule de politesse M. Olaire" On ne demande pas d'crire la version mise jour des deux fichiers PATIENTS.TXT et ADRESSES.TXT. Trois procdures sont fournies. Pour les utiliser, employez les instructions suivantes aux endroits appropris de votre algorithme: Effectuer LecturePatients( NumSS, DateDernVisite ) Effectuer LectureNomPrAdresses( NomPrAdresse ) Effectuer LectureDateDuJour( NJoursEcouls ) Indication. On conseille de dterminer le nombre de patients NbPat au dbut de l'algorithme. On demande 1. Dans votre unit H: , faites une copie du classeur MOlaireVBA.xls qui se trouve dans le rpertoire MELARD de lunit F:. Ouvrez-le et sauvez-le chez vous sous le nom VB6GgBbb.xls. Le classeur contient des feuille de travail correspondant aux deux fichiers mentionns (PATIENTS.TXT et ADRESSES.TXT). 2. Dans un module, vous devrez crire lalgorithme sous forme de commentaires. Un corrig de lalgorithme sera disponible sur luniversit virtuelle juste avant la dernire sance de VBA. 3. Vous devrez ensuite crire un programme VBA (ensemble de procdures et fonctions) qui est la traduction en VBA de lalgorithme contenu sous forme de commentaires dans le module. 4. De tester votre programme avec les donnes fournies.

Rsolution de lexercice 5.3.3 M. Olaire, dentiste


N.B. Nous donnons ici une solution modulaire. Une solution non modulaire tait aussi accepte. Algorithme "Gestion du cabinet de M. Olaire, dentiste" Tableau NumSS(2000), DateDernVisite(2000) : numrique Tableau NomPrAdresse(2000) : caractre Variable NbPat : numrique Effectuer LecturePatients (NumSS, DateDernVisite) Effectuer LectureNomPrAdresses (NomPrAdresse) Effectuer CalculNombrePatients(NumSS, NbPat) Effectuer AffichageMenu(NumSS, DateDernVisite, NomPrAdresse, NbPat) finalgo Procdure CalculNombrePatients(NumSS : entre, NbPat : sortie) Tableau NumSS(2000) : numrique Variable j, NbPat : numrique j <- 0 NbPat <- 2000 Itrer j <- j + 1 sortirsi NumSS(j) = 0 ou j = NbPat finitrer Si NumSS(j) > 0 alors Afficher 'Plus de place dans le tableau' sinon NbPat <- j - 1 finsi finprocdure Procdure AffichageMenu(NumSS, DateDernVisite, NomPrAdresse, NbPat : entre-sortie) Variable NbPat : numrique Tableau Numss(2000), DateDernVisite(2000) : numrique Tableau NomPrAdresse(2000) : caractre Itrer Afficher "Tapez 1 pour mettre jour la dernire date de visite" Afficher "Tapez 2 pour envoyer une lettre de rappel " Afficher "Tapez 0 pour sortir " Saisir n sortirsi n = 0 Si n = 1 alors Effectuer TraitementMiseAJour(NumSS, DateDernVisite, NomPrAdresse, NbPat) sinon Effectuer ProductionLettreDeRappel(NumSS, DateDernVisite, NomPrAdresse, NbPat) finsi finitrer finprocdure Procdure TraitementMiseAJour(NumSS, DateDernVisite, NomPrAdresse, NbPat : entre-sortie) Variable numro, i, NJoursEcouls, NbPat : numrique

27

Variable trouv : logique Tableau NumSS(2000), DateDernVisite(2000) : numrique Tableau NomPrAdresse(2000) : caractre Effectuer SaisieNumSS(numro) Effectuer LectureDateDuJour(NJoursEcouls) i <- 0 trouv <- faux Itrer i <- i + 1 trouv <- numro = NumSS(i) sortirsi trouv ou i = NbPat finitrer Si trouv alors DateDernVisite(i) <- NJoursEcouls sinon Si NbPat < 2000 alors NbPat <- NbPat + 1 NumSS(NbPat) <- numro DateDernVisite(NbPat) <- NJoursEcouls Afficher "Entrez le nom, prnom et adresse du patient" Saisir NomPrAdresse(NbPat) sinon Afficher "Plus de place dans le tableau. Le patient n'est pas ajout" finsi finsi finprocdure Procdure SaisieNumSS(numro : sortie) vvVariable numro : numrique Afficher "Entrez le numro de scurit sociale du patient" Itrer Saisir numro sortirsi numro > 1 et numro < 100000000 et numro = |_numro_| Afficher "Erreur. Le numro de scurit sociale doit tre entre 1 et 99999999" finitrer finprocdure Procdure ProductionLettreDeRappel(NumSS, DateDernVisite, NomPrAdresse, NbPat : entre) Variable nombre_de_jours, i, NJoursEcouls, NbPat : numrique Tableau NumSS000), DateDernVisite(2000) : numrique Tableau NomPrAdresse(2000) : caractre Effectuer LectureDateDuJour(NJoursEcouls) Pour i = 1 NbPat nombre_de_jours <- NJoursEcouls - DateDernVisite(i) Si nombre_de_jours > 180 alors Imprimer NomPrAdresse(i) Imprimer "Votre dernire visite remonte il y a ", nombre_de_jours, " jours" finsi finpour finprocdure