Mathieu Boudreault
Slection (ou activation) dun classeur ou dune feuille de calcul Mthodes Activate et Select...............................................................................................................................31 Sauvegarde dun classeur Excel Mthodes SaveAs et Save .......................................32 Fermeture dun classeur Excel Mthode Close ............................................................32 Dclaration de variables......................................................................................................33 Rappel provenant des sections prcdentes...................................................................33 Dclaration de variables scalaires ...................................................................................33 Dclaration de variables matrices....................................................................................34 Assigner et obtenir des valeurs dune variable matrice....................................................35 Redim ..............................................................................................................................36 Cration de routines et de fonctions personnelles ..............................................................36 Enregistrer une macro .....................................................................................................36 Cration de routines personnelles ...................................................................................38 Appel de routines personnelles .......................................................................................39 Cration de fonctions personnelles .................................................................................39 Appel de fonctions personnelles ......................................................................................40 Programmation conditionnelle.............................................................................................41 Crer une condition .........................................................................................................42 Programmation conditionnelle simple ..............................................................................43 Programmation conditionnelle par cas.............................................................................44 Programmation itrative ......................................................................................................44 Itration simple (For Next)............................................................................................45 Itration conditionnelle (While Wend)...........................................................................45 Gestion des botes de dialogue...........................................................................................46 Bote de dialogue InputBox ..............................................................................................46 Bote de dialogue MsgBox ...............................................................................................47 Une vue densemble de lditeur Visual Basic ........................................................................50 Trucs de dbogage .............................................................................................................50 Commande Excuter .......................................................................................................50 Excuter Pas pas..........................................................................................................51 Points darrt ...................................................................................................................52 Fentre espions ...............................................................................................................53 Messages derreurs.............................................................................................................54 Erreurs de compilation.....................................................................................................54 Erreurs dexcution..........................................................................................................54 Erreurs logiques ..............................................................................................................55 Suite de lexemple Construction du tableau de primes ........................................................56 lments de programmation avance en Visual Basic pour Excel .........................................59 Objet WorksheetFunction ....................................................................................................59 Utiliser une fonction publique Visual Basic cre par le programmeur lintrieur dun classeur...............................................................................................................................60 Crer une fonction publique en 3 tapes simples............................................................60 Exemple complet .............................................................................................................61 Dclaration de variables de type Object ..............................................................................61 Dclaration de variables de type Object ..........................................................................62 Assignation dans une variable de type Object .................................................................62 Mthode InputBox ...............................................................................................................62 Anciens travaux pratiques de lanne 2000 ............................................................................64
Travail pratique # 1 .............................................................................................................64 Contexte ..........................................................................................................................64 Solution............................................................................................................................64 Travail pratique # 2 .............................................................................................................66 Contexte ..........................................................................................................................66 Solution............................................................................................................................67 Travail pratique # 3 .............................................................................................................68 Contexte ..........................................................................................................................68 Solution............................................................................................................................69 Travail pratique # 4 .............................................................................................................72 Contexte ..........................................................................................................................72 Solution............................................................................................................................72 Travail pratique # 5 .............................................................................................................75 Contexte ..........................................................................................................................75 Solution............................................................................................................................75 Rfrences .............................................................................................................................78
Introduction
Bien que le logiciel Microsoft Excel soit un outil trs puissant aux capacits touchant plusieurs domaines tels que les mathmatiques, la finance, lingnierie, etc., il ne peut malheureusement tout faire. Cest grce la programmation en Visual Basic pour Excel que les utilisateurs les plus avancs pourront adapter Microsoft Excel leur besoin. Il est alors possible de combiner plusieurs des outils dExcel et de les amliorer, de les complmenter, crer plusieurs commandes et outils supplmentaires, etc. En actuariat, Visual Basic pour Excel intervient dans tous les domaines connexes : rgime de retraite, assurance gnrale, assurance vie, et mme en recherche. Ce document se veut une prsentation des fonctions de base dExcel et dune introduction la programmation en Visual Basic pour Excel. Vous verrez quune fois les connaissances de base sont acquises en programmation, la marche nest pas si haute pour passer de Visual Basic Visual Basic pour Excel. Il a t bti de telle sorte quil peut agir comme document de rfrence dans le futur. Dans ce document, vous verrez le fonctionnement de base de Microsoft Excel, la construction de tableaux, lutilisation de formules et de fonctions, etc. Ensuite, une fois ces notions bien matrises, il est ainsi plus facile de manipuler les objets Excel de la mme faon que les objets Visual Basic. Vous dcouvrirez ensuite la programmation en Visual Basic, lutilisation des objets Excel, etc. Toutes les notions amenes sont accompagnes dexemples. Vous retrouverez aussi la fin, quelques exemples complets et les travaux pratiques de lanne 2000 (avec solutions). Tout au long du document, si vous voulez en savoir plus, je vous invite consulter laide de Microsoft Excel et Visual Basic pour Excel. Afin de mieux avancer de faon autonome en Visual Basic pour Excel, il est fortement recommand de bien comprendre les notions dobjets, mthodes et proprits. De cette faon, il est ainsi beaucoup plus facile dutiliser de nouveaux objets autrefois inconnus pour soi. Je tiens aussi remercier MM. Yan Bergeron, Simon Gamache et Frdrick Guillot pour laide quils mont apporte dans la compltion du document. Leur contribution a t grandement apprcie.
Dfinitions
Cellule (Cell) : lment dun tableau. Classeur (Workbook) : Ensemble de feuilles de calculs. Un fichier Excel (.xls) est un classeur. Feuille de calcul (Worksheet) : Ensemble de donnes et dquations organises en tableaux. Plage (Range) : Ensemble de cellules.
Interface
Regardons ensemble la construction de linterface principale dExcel.
Les barres doutils et de menus permettent daccder aux principales fonctionnalits dExcel. En haut, on retrouve les diffrents menus dExcel. Fichier (File) : Fonctionnalits de gestion de fichier. Par exemple, ouverture, fermeture, sauvegarde, mise en page, etc. dition (Edit) : Fonctionnalits ddition (modification) des donnes. On y retrouve par exemple les fonctions trs utiles Copier, Couper, Coller et Effacer. Affichage (View) : Fonctionnalits permettant de modifier laffichage du fichier en cours. Insertion (Insert) : Fonctionnalits dajout dobjets lintrieur du classeur. On peut ajouter une image, un graphique, une fonction Excel, etc. Format (Format) : Fonctionnalits de formatage dun lment dExcel. Le formatage peut tre de modifier la police et la taille du texte, la couleur de fond de la cellule, etc. En bref, il sagit des outils qui permettent de modifier lapparence dun lment dExcel. Outils (Tools) : Fonctionnalits permettant daccder aux diffrents outils de Microsoft Excel tels que le correcteur dorthographe, cration de macros, solveur (outil doptimisation), etc. Donnes (Data) : Fonctionnalits de gestion des donnes, comme le tri des donnes, etc. Ensuite, on retrouve la barre doutil principale et de formatage. Avec ces boutons, il est possible daccder aux fonctionnalits les plus communes dExcel. Dautres barres doutils sont aussi disponibles. Il suffit daller dans le menu Affichage et ensuite pointer vers Barre doutils.
Fentre de saisie
Cest cet endroit que les donnes et les formules peuvent tre saisies. On remarque gauche ladresse de la cellule. Ladresse dune cellule est toujours compose dune lettre suivie dun chiffre. La lettre reprsente la colonne et le chiffre reprsente la ligne. Par exemple, G10 correspond la cellule situe la 7e colonne et 10e ligne.
Feuille de calcul
Voici linterface principale dune feuille de calcul. Cest lintrieur de cette zone que sont situes les donnes et les quations. Dans le bas gauche, les onglets permettent de basculer entre les diffrentes feuilles de calcul. Il est possible dajouter des feuilles en cliquant avec le bouton droit de la souris et en choisissant Insertion. Il suffit ensuite de slectionner Feuille. Vous pouvez aussi renommer vos feuilles de calcul en double-cliquant sur le nom actuel de celle-ci.
Barre dtat
Diffrents messages sont affichs dans la barre dtat selon le contexte.
35 36 37 38 39 40
Il sagit en fait dentre de donnes. La cellule suprieure gauche de ce tableau doit tre en A1. ltat brut, votre tableau devrait ressembler celui-ci.
10
Solution (en utilisant une des 3 faons) Cellules A1 jusqu B1 Alignement : Horizontal centr, Vertical centr, Retour la ligne automatique Police : Arial, 12 pts, Gras Bordure : Contour 3 pts Arrire-plan : Couleur cyan Cellules A2 jusqu B7 Alignement : Horizontal centr Police : Arial, 12 pts Bordure : Contour 3 pts, Ligne au centre : 1 pt Arrire-plan : Couleur jaune Cellules B2 jusqu B7 Nombre : Nombre de dcimales : 3 Modifiez la largeur des colonnes (ou la hauteur des lignes) en amenant la souris sur le ct gauche (ou haut) de la feuille de calcul. Le curseur devrait changer de forme, vous indiquant que vous pourrez ajuster la largeur ou hauteur dune colonne ou ligne.
11
2. Cliquez sur la poigne de la slection et maintenez le bouton gauche de la souris enfonc. Voici la fameuse poigne de slection :
3. Glissez la souris jusqu ce que le nombre 40 apparaisse. Pour entrer les probabilits de dcs, puisque le pas de la squence est de 0.005, il est aussi possible dutiliser ce truc. Il y aussi une autre faon de procder pour entrer les probabilits de dcs. Rptez les tapes 1 et 2 prcdentes pour la colonne B (probabilits de dcs). Au lieu de glisser la poigne jusquen bas, double-cliquez sur celle-ci. Note importante : le tout dernier truc fonctionne seulement si des donnes sont prsentes dans la colonne sa gauche.
CELLULE : Correspond ladresse dUNE cellule. Important : il est impossible dexcuter une quation avec une plage de cellules. Oprateur mathmatique : Les oprateurs sont : Addition : + Soustraction : Multiplication : * Division : / Exposant : ^ Parenthses : ( ) Note : La priorit des oprations est respecte. Exemple # 1 Dans la cellule E2, entrez : =2+3 Le rsultat, 5 saffichera dans la cellule E2.
12
Exemple # 2 Dans la cellule E3, entrez 10, en F3, entrez 3. Si dans la cellule E4 vous tapez : =14+E3^F3, vous aurez le rsultat 1014. Note importante Pour saisir une quation, vous pouvez entrer directement au clavier =14+E3^F3 ou vous pouvez entrer =14+ au clavier, ensuite, laide des flches du clavier, dplacer la cellule slectionne vers E3, ensuite saisir ^ au clavier et ensuite choisir la cellule F3 laide des flches. Poursuivons maintenant lexemple principal. Premirement, effacez le contenu des cellules E3:F4 et ensuite, insrez deux lignes audessus du tableau. Il y a diffrentes faons dy parvenir. Vous pouvez tout simplement dplacer le tableau vers le bas de deux lignes (couper, coller) ou aller dans le menu Insertion et choisir Ligne (rptez 2 fois pour deux lignes). Il faut reproduire le tableau suivant
Il est important de savoir que si vous modifiez le contenu de la cellule C1, les primes doivent aussi se mettre jour. Cette exigence implique que dans les cellules C4:C9 il doit y avoir une quation. Par exemple, en C4, lquation saisir est : =C1*B4. En C5, il faut saisir, =C1*B5, etc. Un peu long et redondant nest-ce pas ?
13
Comme vous pouvez le constater, le calcul de la prime a fonctionn que pour la cellule C4. Pourquoi ? Il est trs important de comprendre la prochaine section.
14
Exemple : Vous dsirez construire une table de multiplication des 5 premiers nombres naturels. Vous devez obtenir ce rsultat :
Vous devriez tre assez laise pour formater ce tableau. Regardons ensemble comment obtenir cette table sans avoir crire 25 quations diffrentes. Si en C5, vous entrez =B5*C4 et que vous appliquez cette formule toutes les cellules du tableau, vous obtiendrez la table suivante :
Pour obtenir le rsultat voulu, il faut entrer en C5, lquation suivante : =$B5*C$4. Ici, on veut maintenir fixe la rfrence la colonne B et maintenir fixe la rfrence la ligne 4. Le reste doit varier selon la position. Appliquez maintenant cette quation toutes les cellules du tableau laide de la poigne.
Procdez de la mme faon pour la cellule C1 que vous nommerez prestation. Ensuite, dans la cellule C4, entrez la formule =prob*prestation. Vous obtiendrez le mme rsultat que prcdemment. En plus, si vous descendez la formule laide de la poigne, vous obtiendrez les primes exactes pour tout ge.
15
Insertion de fonctions
Il y aussi une deuxime faon deffectuer des calculs avec Excel : lutilisation de fonctions. Une fonction est une formule prdfinie qui effectue un calcul laide des arguments de la fonction. Pour utiliser une fonction on doit utiliser la syntaxe suivante. Syntaxe =NOMFONCTION(argument1 ; argument2 ; argument3 ;) On peut aussi accder la liste des fonctions ainsi qu leur description soit en allant dans le menu Insertion, Fonction ou en appuyant sur la touche fx dans la barre doutils. Les arguments dune fonction reprsentent ce que la fonction a besoin pour retourner une valeur. Ils peuvent tre de diffrents types : nombre, logique (boolen), etc. Dans Excel, ces arguments peuvent aussi faire rfrence une cellule ou une plage de cellules. Il est aussi possible dutiliser les rfrences relatives et absolues. Exemple Les notes de 50 tudiants sont entres dans les cellules A5:A54. On veut obtenir la moyenne et lcart type. Pour calculer la moyenne, au lieu dentrer la formule =(A5+A6+A7++A54)/50, nous utiliserons la fonction MOYENNE. =MOYENNE(A5:A54) Mme principe pour calculer lcart-type des notes de la classe. Nous utiliserons la fonction =ECARTYPE(A5:A54) Remarques Il est possible dimbriquer des fonctions lintrieur dune autre fonction. Les oprations mathmatiques peuvent tre utilises lintrieur dune fonction et avec une fonction. Exemple : Calculer la variance des notes du groupe. On entre la fonction =ECARTYPE(A5:A54)^2. Voici un exemple combinant les deux remarques. On dsire calculer la probabilit quun tudiant pris au hasard ait plus que 70% son examen. On suppose que la distribution des notes est normale. La fonction entrer est =1-LOI.NORMALE(0.70 ; MOYENNE(A5:A54) ; ECARTYPE(A5:A54) ; VRAI) Ici, la fonction LOI.NORMALE retourne la fonction de rpartition ou de densit dune loi normale. Dans cet exemple, il sagit de la fonction de rpartition (VRAI) dune loi normale, valu 0.70, avec paramtres mu = MOYENNE(A5:A54) et sigma = ECARTYPE(A5:A54).
16
Installation du solveur
Si le mot "Solveur" ne figure pas dans la liste droulante du menu "Outils", il vous faudra installer le solveur. Voici la procdure pour installer le solveur : (1) Choisir "Macro complmentaire" dans le menu "Outils" ; (2) Cocher solveur; (3) Appuyer sur "OK".
Utiliser le solveur
Pour rsoudre un problme avec le solveur, il faut commencer par monter un classeur Excel en reliant certaines cellules par les formules de votre problme. Par exemple, si on cherche la solution du systme d'quations suivant : i )2 x + y + z = 3
ii ) x y z = 3 iii )3x + 2 y + 3 z = 3
Il pourrait tre intressant de construire ce type de feuille Excel :
17
Remarque Initialement, on a pos que x = 1, y = 1 et z = 3, . Ce ne sont que des valeurs fictives qui seront par la suite ajustes par le solveur pour satisfaire au systme d'quations linaire. La seconde tape consiste dcortiquer le problme en dterminant les cellules qui sont : (1) optimiser (minimiser, maximiser ou galiser); (2) Variables; (3) Sujettes une contrainte d'optimisation. Dans notre exemple, la cellule C4 pourrait tre arbitrairement choisie comme une cellule maximiser, les cellules C4, C5 et C6 seraient les cellules variables (celles que le solveur devra rajuster pour que le systme d'quations soit respect) et les cellules C11, C12 et C13 seront sujettes des contraintes (ces cellules doivent tre gales 3 pour que le systme d'quation soit satisfait). tant donn les contraintes mises en place, le fait de maximiser arbitrairement la cellule C4 ne modifie en rien le rsultat. Lorsque la feuille Excel est dcortique, il ne reste plus qu' entrer les paramtres dans le solveur et excuter ce dernier. Dans notre exemple, voici comment il faudrait entrer les paramtres du solveur :
18
La solution du systme d'quations est sans aucun doute x = 2, y = -1,2 et z = 2. Attention : Lorsque le problme est plus complexe, le solveur peut ne pas converger vers la solution la premire excution. Dans ce cas, on peut excuter le solveur une ou plusieurs autres fois ou modifier le nombre d'itrations maximal dans les options du solveur.
Exemple d'application
Un dentiste souhaite modliser le nombre d'obturations dans la bouche d'un patient en fonction de l'ge de celui-ci. Lors de son avant-midi de travail, il a observ 5 bouches et inscrit ses observations dans le tableau suivant : Patient i 1 2 3 4 5 Le dentiste suppose que Nombre d'obturations dans la bouche du patient i (Yi) 3 5 2 7 2 ge du patient i (Xi) 13 28 15 22 10
= X + ln( X ) + X , Y i i i i
o , et sont des constantes. Le dentiste souhaite dterminer la valeur de ces constantes
19
Le dentiste a un patient de 32 ans cet aprs midi, selon ses observations de l'avant-midi et selon son modle mathmatique, il peut s'attendre ce que ce patient ait 7 obturations en bouche !
20
Dfinitions
Objet : lment de programmation ayant des proprits, pouvant excuter certaines actions et pouvant interagir avec dautres objets. Un objet peut en contenir un autre et peut aussi appartenir dautres objets. Proprit : Caractristique ou attribut propre un certain objet. Mthode : Action que peut excuter un objet. Observons ce que pourrait tre un objet sans penser la programmation. Par exemple, une voiture. Effectivement, une voiture peut avoir certaines caractristiques (couleur, longueur, largeur, puissance, consommation, etc.) La voiture peut aussi excuter certaines actions (avancer, reculer, etc) et peut aussi interagir avec certains autres lments (la voiture interagit avec la route, etc.). Une radio, qui est aussi un objet en soi ayant des proprits, peut tre contenu dans une voiture et aussi tre contenu dans une maison (objet). Collection ou classe : Ensemble dobjets ou dautres collections. Hirarchie : Faon dordonner les objets et les collections. Exemple : ClasseSuperieure.ClasseInferieure.Objet.Propriete = True. Ici, on a que lobjet appartient la classe infrieure, qui elle appartient la classe suprieure. Sa proprit est fixe True. Variable : Espace en mmoire rserv pour y stocker de linformation. Une variable peut tre de plusieurs types : numrique (entier, rel), boolen (ou logique), texte (ou chane de caractres, aussi appel string).
21
Premirement, la dclaration qui alloue ou rserve un espace en mmoire. Deuximement, le stockage utilise lespace qui lui est rserv pour conserver linformation voulue. Il est aussi fortement recommand de donner un nom intelligent ses variables. Un principe fondamental : le nom dune variable devrait reflter son contenu. 4. Code principal. a. Obtenir les donnes ncessaires au calcul; b. Effectuer le calcul; c. Afficher le rsultat. 5. Une fois le programme et les sous-programmes bien rds, il est fortement recommand de bien documenter celui-ci. Lidal est de bien dcrire le rle de chaque sous-programme ainsi que leurs arguments. Les lignes de code moins intuitives (par exemple, les clairs de gnie) devraient aussi tre bien dcrites. Une question se poser lorsquon documente ses routines : en lisant le code ainsi que le texte, est-ce que mes collgues seraient en mesure de bien comprendre lide principale de ma programmation ainsi que les principales tapes de mon code ? videmment, rpondre par la ngative cette question devrait vous inciter continuer la documentation.
22
Note : Puisque la plupart du temps en Excel nous manipulons des chiffres, il nest pas ncessaire dutiliser une commande comme Val ou CDbl pour convertir du texte en nombre. Voici une vue densemble des objets et collections les plus couramment utiliss en Visual Basic pour Excel. Noubliez pas quune collection est un ensemble dobjets ou dautres collections pouvant avoir certaines proprits et pouvant aussi interagir avec dautres lments.
Objets et collections Visual Basic pour Excel Workbooks (Objet et collection)
Workbook (Objet)
Range (Objet)
Worksheet (Objet)
23
Pour dbuter la programmation, il suffit de slectionner la feuille Excel dans laquelle la routine sera compose et daller dans le menu Affichage, Code. Nous voulons reproduire le mme tableau que dans la section prcdente. Pour ce faire, nous pouvons crer une macro Excel qui fera ce boulot.
24
Nous allons construire ce qui est inclus dans les cellules B1:C1. La construction du contenu des autres cellules sera explique un peu plus loin.
Sub CreerTableau() 'Ces deux lignes servent saisir l'information dans les cellules Range("B1").Value = "Prestation de dcs" Range("C1").Value = 10000 'Ces lignes servent changer l'apparence du contenu des cellules Range("B1:C1").Font.Name = "Arial" Range("B1:C1").Font.Size = 12 Range("B1:C1").Interior.ColorIndex = 34 Range("B1:C1").Borders(xlEdgeTop).Weight = xlMedium Range("B1:C1").Borders(xlEdgeBottom).Weight = xlMedium Range("B1:C1").Borders(xlEdgeLeft).Weight = xlMedium Range("B1:C1").Borders(xlEdgeRight).Weight = xlMedium Range("B1").Font.Bold = True Range("C1").Style = "Currency" 'Ces lignes servent modifier la largeur des colonnes Columns("B").ColumnWidth = 25 Columns("C").ColumnWidth = 15 End Sub
Il est important de comprendre le fonctionnement de lobjet Range. Premirement, cet objet correspond une plage de cellules ou une cellule. Cet objet a certaines proprits (Value, Style) et contient aussi certains objets (Font, Interior, Borders). Ces derniers ont leurs propres proprits ou attributs (Name, Size, Interior, Weight). Remarquez aussi la hirarchie entre les diffrents objets. Par exemple, la proprit Name appartient lobjet Font qui lui appartient lobjet Range. Cette hirarchie est dfinie avec les points. En lisant de gauche droite nous pouvons dire Lobjet Range contient lobjet Font qui lui a la proprit Name qui a t fixe Arial. Note : Lobjet Font nappartient pas qu lobjet Range ; il peut aussi servir par exemple, lobjet ChartTitle qui est aussi un objet.
25
Retourne un objet de type Range correspondant la plage de cellule ou cellule correspondante. Exemple
Range("A1") Stocke en mmoire le contenu de la cellule A1 et ses proprits Range("A1:B6") Stocke en mmoire le contenu de la plage A1:B6 et ses proprits Range("A1,C4,D6") Stocke en mmoire le contenu des cellules A1,C4,D6, etc. Range("A1:B6, C3:D4") Stocke en mmoire le contenu des plages A1:B6 et C4:D4, etc.
Columns ou Rows
Syntaxe
Columns("lettre de colonne") Columns(# de colonne) Rows(# de ligne)
Retourne un objet de type Range correspondant la colonne spcifie ou la ligne spcifie. Exemple
Columns("C") Stocke en mmoire le contenu de la colonne C et ses proprits Columns(3) Row(10) Columns("C").Font.Bold = True Appliquera le style gras toutes les cellules de la colonne C.
26
Selection
Syntaxe
Selection
Retourne un objet de type Range correspondant la cellule ou la plage de cellules slectionne. Exemple
Selection.Font.Bold = True slectionne Applique la mise en forme gras la plage
ActiveCell
Syntaxe
ActiveCell
Retourne un objet de type Range correspondant la cellule active. Par exemple, si la cellule A1 est active, la saisie dinformation au clavier se fera alors pour la cellule A1. Exemple
ActiveCell.Font.Bold = True slectionne Applique la mise en forme gras la cellule
Offset
Syntaxe
ObjetRange.Offset(position relative en ligne, position relative en colonne)
Retourne un objet de type Range correspondant la cellule positionne de faon relative ObjetRange. Exemple
Range("C8").Offset(-1,-2).Value quivaut Range("A7").Value
27
Cells
Syntaxe
ObjetRangeOUWorksheet.Cells(position en ligne, position en colonne) ObjetRangeOUWorksheet.Cells(ime cellule)
Activate
Syntaxe
ObjetRangeCellule.Activate
Mthode qui permet dactiver une cellule. Par exemple, si la cellule A1 est active, la saisie dinformation au clavier se fera alors pour la cellule A1. Exemple
Range("A1").Activate
Select
Syntaxe
ObjetRange.Select
Mthode qui permet de slectionner une cellule ou une plage de cellule. Exemple
Range("A1:A15,C2:C26").Select
Remarque
Pour obtenir le contenu (valeurs ou textes) compris dans un certain objet Range et le stocker lintrieur dune variable, il faut avoir un objet Range comprenant QUUNE seule cellule.
28
La proprit Value ne sapplique que si lobjet Range correspond UNE cellule. Il est quand mme possible dobtenir les valeurs contenues dans une plage de cellules avec la proprit Cells. Il faut par contre itrer sur toutes les lignes et les colonnes de la plage. Dans le cas o lobjet Range correspond UNE cellule, il nest pas ncessaire dutiliser la proprit Value pour obtenir le contenu de la cellule.
29
Nous poursuivrons lexemple du tableau aprs avoir regard la programmation conditionnelle et les itrations.
Workbooks
Syntaxe
Workbooks("nom du classeur") Workbooks(# du classeur)
Retourne un objet de type Workbook (classeur) correspondant au nom de classeur spcifi. Avec un objet Workbook en mmoire, il est ainsi possible dexcuter certaines mthodes applicables aux classeurs tels que son ouverture, sauvegarde, fermeture, etc. Remarque La spcification du nom du classeur nest pas obligatoire (par exemple si vous voulez utiliser certaines mthodes relatives aux classeurs en gnral, vous verrez plus loin). Par contre, si vous devez manipuler un classeur spcifique, largument devient obligatoire. Exemple
Workbooks("Classeur1") Retourne un objet de type Workbook correspondant au classeur Classeur1. Vous pourrez donc manipuler le classeur Classeur1 (fermer, sauvegarder, etc.) Workbooks(1) Mme chose, mais correspond au premier classeur ouvert.
30
ActiveWorkbook
Syntaxe
ActiveWorkbook
Retourne un objet de type Workbook correspondant au classeur prsentement actif (slectionn). Exemple
ActiveWorkbook.Close Ferme le classeur actif
Worksheets ou Sheets
Syntaxe
Worksheets("nom de la feuille de calcul") Worksheets(# de la feuille de calcul) Sheets("nom de la feuille de calcul") Sheets(# de la feuille de calcul)
Retourne un objet de type Worksheet (feuille de calcul) correspondant au nom de la feuille de calcul spcifi. Avec un objet Worksheet en mmoire, il est ainsi possible dexcuter certaines mthodes applicables aux feuilles de calculs. Remarque La spcification du nom de la feuille de calcul nest pas obligatoire (par exemple si vous voulez utiliser certaines mthodes relatives aux feuilles en gnral). Par contre, si vous devez manipuler une feuille de calcul spcifique, largument devient obligatoire. Exemple
Sheets("Feuil1") Retourne un objet de type Worksheet correspondant la feuille de calcul Feuil1 Worksheets("Donnees").Range("A1").Value Permet dobtenir le contenu de la cellule A1. La cellule A1 est un objet de type Range. Un objet de type Range appartient un objet de type Worksheet (Worksheets("Donnees") permet dobtenir un objet de type Worksheet correspondant la feuille Donnees). Puis, Value est une proprit associe un objet de type Range (Range("A1") permet dobtenir un objet Range correspondant la cellule A1).
31
ActiveSheet
Syntaxe
ActiveSheet
Retourne un objet de type Worksheet correspondant la feuille de calcul prsentement active (slectionne). Exemple
ActiveSheet.Cells(1,1).Value Retourne le contenu de la cellule A1 de la feuille active.
La commande ci-haut vous permettra douvrir le classeur nomm Classeur dans le dossier Mes documents sur le disque C.
Slection (ou activation) dun classeur ou dune feuille de calcul Mthodes Activate et Select
Afin de pouvoir accder linformation contenue dans une feuille ou dans un classeur donn, il est essentiel de slectionner la feuille ou le classeur dans lequel les commandes excutes sappliqueront.
32
Exemple
Workbooks("Classeur1").Activate
Exemple
Sheets("feuil1").Select
Exemple
ActiveWorkbook.SaveAs Filename:="C:\Mes documents\classeur1.xls"
Cette mthode vous permet de sauvegarder le classeur actif sous le nom classeur1.xls dans le dossier Mes documents sur le disque C. Syntaxe - Sauvegarder un fichier existant
ObjetWorkbook.Save
Exemple
Workbooks("Classeur1").Save
33
Exemple Voici la commande qui vous permettra de fermer un classeur dont lutilisation nest plus requise.
Workbooks("Classeur1").Close
Dclaration de variables
Rappel provenant des sections prcdentes
Variable : Espace en mmoire rserv pour y stocker de linformation. Une variable peut tre de plusieurs types : numrique (entier, rel), boolen (ou logique), texte (ou chane de caractres, aussi appel string). Dans lutilisation des variables, il y a toujours deux tapes ncessaires. Premirement, la dclaration qui alloue ou rserve un espace en mmoire. Deuximement, le stockage utilise lespace qui lui est rserv pour conserver linformation voulue.
Variables dont le contenu est conserv tant et aussi longtemps que le programme principal nest pas interrompu (porte de niveau module)
Private scalaire as Type Private scalaire1, scalaire2, , scalaireN as Type Private scalaire1 as Type1, scalaire2 as Type2, , scalaireN as TypeN
Remarque Les variables porte de niveau module doivent tre dclares avant toutes les procdures du module.
34
Types de donnes (Tableau tir du livre Excel 2000 et Visual Basic pour Applications 6) Types de donnes Valeurs acceptes Mmoire occupe Byte Nombre entier compris entre 0 et 255 1 octet Integer Nombre entier compris entre -32768 et 32768 2 octets Long Nombre entier compris entre 2147483648 et 4 octets 2147483647 Simple Nombre virgule flottante compris dans 4 octets 3.403E38 Double Nombre virgule flottante compris dans 8 octets 1.7977E308 Currency Nombre virgule fixe avec quinze chiffres pour 8 octets la partie entire et quatre chiffres pour la partie dcimales compris dans 922337203685477.5808 Il existe aussi les types de donnes String (chanes de caractres), Date, etc. Exemple
Private salaire as Double Variable porte de niveau module Sub calculeBonus() Dim bonus as Double Variable porte de niveau procdure End Sub
Lgende bi1 reprsente ladresse de la borne infrieure de la 1re dimension du tableau. bs1 reprsente ladresse de la borne suprieure de la 1re dimension du tableau. n1 reprsente le nombre dlments dans la 1re dimension du tableau.
35
Remarques Les bi1, bs1, n1, etc. doivent tre des nombres entiers entrs par le programmeur. Ils ne peuvent reprsenter le contenu dune variable. Si aucune adresse nest dfinie, Visual Basic utilisera celle spcifie par Option Base. Si la ligne Option Base nest pas prsente et que les adresses des bornes ne sont pas dfinies, les bornes iront de 0 jusqu ni-1 Si les dimensions dune variable tableau ne sont pas dfinies, aucun contenu ne peut y tre stock tant et aussi longtemps que Visual Basic ne connat pas ses dimensions. Vous pouvez redfinir les dimensions dune variable tableau laide de la commande ReDim (voir plus loin). Exemple # 1 quoi pourraient servir les adresses des variables matrice ? Disons que vous simulez la performance dun indice boursier entre 2003 et 2050. Dclarer la variable de cette faon
Dim IndicesBoursiers(2003 to 2050) as Double
Exemple # 2
Option Base 1 Sub NomRoutine() Dim Tableau4dimensions(10, 20, 30, 40) as Integer End Sub
est quivalent
Sub NomRoutine() Dim Tableau4dimensions(1 to 10, 1 to 20, 1 to 30, 1 to 40) as Integer End Sub
36
Exemple (suite)
Range("C1").Value = TableStandard(2,3) Affiche dans la cellule C1 le contenu de la variable TableStandard la ligne 2, colonne 3.
Redim
Nous avons mentionn plus tt que les dimensions dune variable matrice doivent tre spcifies explicitement (nombres entrs directement par le programmeur) ou pas spcifies du tout. Linstruction Redim permet de redimensionner une variable matrice. Contrairement linstruction Dim, Redim peut accepter le contenu dune variable. Syntaxe
ReDim Tableau(bi1 to bs1,bi2 to bs2,, biN to bsN) as Type ReDim Tableau(n1,n2,, nN) as Type
Exemple
Dim nbresim as Integer Dim Simulations() as Double nbresim = 1000 Redim Simulations(2003 to 2003 + nbresim - 1) as Double car Dim Simulations(2003 to 2003 + nbresim - 1) as Double est illgal
37
Il sagit maintenant de donner un nom la macro sous Nom de la macro. Il est possible dattribuer une touche de raccourci cette macro. Gnralement, lenregistrement de la macro se fait dans Ce classeur. Il est possible dentrer une brve description de la macro. 2. Appuyez sur OK. La barre doutils Arrt de lenregistrement saffiche, indiquant que lenregistrement de la macro est en cours. Il ne reste plus qu excuter (dans lordre) tout ce qui doit se retrouver dans la macro. Par exemple, quelquun pourrait crire le chiffre 28 dans la cellule A1, changer le format de cellule en montaire pour obtenir 28,00 $ (bouton droit sur la cellule, Format de cellule, slection de Montaire sous longlet Nombre, ok), mettre la cellule en gras, pour ensuite arrter lenregistrement en appuyant sur le bouton carr de la barre doutils Arrt de lenregistrement. Une fois la macro enregistre, il est possible de lutiliser. 3. Effacez tout ce qui se trouve dans la cellule A1 (dition, Effacer, tout). 4. Choisissez Macro, puis Macros du menu Outils. La bote de dialogue Macro saffiche, vous permettant daller chercher la macro cre.
Il est possible daller voir la programmation qui a t ncessaire la cration de cette macro, et ce de deux faons. Vous pouvez retourner la bote de dialogue Macro (montre ci-haut), et slectionner Modifier. Lditeur Visual Basic souvrira et montrera les codes. Vous pouvez galement tout simplement ouvrir Visual Basic en cliquant sur Macro, Visual Basic Editor du menu Outils.
38
Sub Macro1() ' ' Macro1 Macro ' Macro enregistre le 2002-11-18 par James Bond ' ' Range("A1").Select ActiveCell.FormulaR1C1 = "28" Range("A1").Select Selection.NumberFormat = "#,##0.00 $" Selection.Font.Bold = True End Sub
Finalement, il est possible dinsrer un bouton dans la feuille Excel qui, lorsquon appuie dessus, excute une macro. 1. Sous le menu Affichage, slectionnez Barre doutils, Formulaires. Une bote outils apparat, que vous pouvez insrer dans la Barre doutils et de menus en haut de lcran. 2. Cliquez sur Bouton, reprsent par un petit bouton gris. Votre curseur devient une croix. Il vous suffit maintenant de dessiner un bouton de la taille dsire. Excel ouvre ensuite automatiquement la bote de dialogue Affecter une macro. Vous pouvez maintenant slectionner la macro que vous venez de crer et appuyer sur OK. Le bouton est maintenant fonctionnel, et excutera la macro lorsque lutilisateur appuie dessus. noter quil est possible de changer le texte apparaissant sur le bouton, en cliquant dessus avec le bouton droit, puis le gauche. Note importante : Les macros que vous affectez un bouton ne doivent pas recevoir darguments obligatoires.
Remarques Un peu comme une variable, la routine peut avoir une porte prive ou publique, cest-dire tre disponible un certain module Excel ou tous les modules. Si le mot private ou public est omis, la routine sera publique. Il nest pas ncessaire de spcifier des arguments la routine. Vous pouvez aussi spcifier des arguments optionnels avec des valeurs par dfaut. Voir la faon de procder dans les fonctions personnelles, plus loin. Il est galement possible dassigner un bouton une procdure cre de cette faon si la routine na aucun argument obligatoire.
39
Exemple
Routine simple, de porte publique, sans arguments. Sub Programme() Instructions End Sub Routine plus complexe, de porte prive, avec argument. Private Sub Initialisation(NomFichier as String) Instructions End Sub
Exemple
Premire faon, Instruction Call Call Programme Call Initialisation("autoexec.bat") Deuxime faon Programme Initialisation "autoexec.bat"
40
Remarques Un peu comme une variable, la fonction peut avoir une porte prive ou publique, cest--dire tre disponible un certain module Excel ou tous les modules. Si le mot private ou public est omis, la routine sera prive. Pour que la fonction puisse retourner une valeur, on doit absolument retrouver au moins une ligne de code ayant NomDeLaFonction = expression. Sinon la fonction retourne 0 et est inutile. La dclaration des arguments se fait la plupart du temps de la premire faon, cest-dire, NomArgument As Type. Un argument peut aussi tre optionnel, cest--dire que lutilisateur pourrait appeler la fonction de faon correcte sans spcifier de valeur pour cet argument. Par contre, une valeur par dfaut doit tre prsente. Une valeur par dfaut est une valeur utilise par un programme si lutilisateur nen spcifie aucune. Les arguments optionnels doivent tre dclars la fin. La structure des arguments prsente dans cette section sapplique aussi aux routines. Exemple Voici la cration dune fonction avec un argument qui spcifie une valeur par dfaut. Nous verrons comment appeler des fonctions avec des arguments par dfaut et la diffrence. Plus bas, la mme fonction est prsente, sans argument optionnel.
'Cet exemple, extrmement simplifi de la ralit, calcule la cotisation la RRQ. 'L'argument taux est optionnel Function CotisationRRQAvecTauxOpt(salaire As Double, Optional taux As Double = 0.035) As Double CotisationRRQAvecTauxOpt = salaire * taux End Function 'L'argument taux nest PAS optionnel Function CotisationRRQSansTauxOpt (salaire As Double, taux As Double) As Double CotisationRRQSansTauxOpt = salaire * taux End Function
41
MaCotisation = CotisationRRQAvecTauxOpt(MonSalaire, 0.04) Il y a 1800 dans la variable MaCotisation. Appel de la fonction SANS taux OPTIONNEL MaCotisation = CotisationRRQSansTauxOpt(MonSalaire, 0.04) Il y aura toujours 1800 dans la variable MaCotisation. Appel de la fonction SANS taux OPTIONNEL MaCotisation = CotisationRRQSansTauxOpt(MonSalaire) Retourne une erreur car le second argument nest pas optionnel.
Programmation conditionnelle
La programmation conditionnelle permet dexcuter certaines commandes selon la ralisation de certains vnements ou lobtention de certains rsultats. Pour mieux comprendre les diffrentes possibilits, le programmeur peut utiliser un diagramme de flux. Vous remarquerez que la programmation conditionnelle lintrieur de Visual Basic pour applications est la mme qu lintrieur de Visual Basic. Exemple de diagramme de flux
SI mon argent de poche est infrieur 20$ ALORS VRAI je mangerai au McDonalds FAUX SINON, je mangerai la Cage aux Sports
Toute programmation conditionnelle ncessite la construction dune condition. Que ce soit en Visual Basic ou tout autre langage, une condition est forme par une ou plusieurs comparaisons. On forme une comparaison laide des oprateurs de comparaison et on relie les comparaisons avec les oprateurs logiques.
42
Oprateurs logiques Les oprateurs logiques servent unir les comparaisons pour former une condition. And Or ET (intersection) OU (union)
Notons tout dabord OPcomp pour oprateur de comparaison et OPlog pour oprateur logique. Syntaxe
Element1 OPcomp Element2 OPlog Element3 OPcomp Element4 OPlog
Remarque Lutilisation de parenthses permet de dterminer un certain ordre entre les conditions. Exemple
Ce programme dtermine si un tudiant va tre engag dans la firme dactuaires ABC Dim nbreexams as Integer Dim moyenne as Double Dim cyclesuperieur as Boolean nbreexams = 3 moyenne = 3.23 cyclesuperieur = False Exemples de condition pour engager un tudiant (nest pas bas sur la ralit exemple fictif) Lemployeur veut que ltudiant ait au moins 2 examens professionnels ET une moyenne cumulative dau moins 3. La condition est donc : nbreexams >= 2 And moyenne >= 3 Retourne vrai car VRAI ET VRAI = VRAI Lemployeur considre quun diplme de cycle suprieur quivaut aux deux examens. La condition est donc : (nbreexams >= 2 Or cyclesuperieur = True) And moyenne >= 3 Retourne vrai car (VRAI OU FAUX = VRAI) ET VRAI = VRAI nbreexams = 1
43
cyclesuperieur = True moyenne = 3.51 Lemployeur veut que ltudiant ait au moins 2 examens professionnels ET une moyenne cumulative dau moins 3. La condition est donc : nbreexams >= 2 And moyenne >= 3 Retourne faux car FAUX ET VRAI = FAUX Lemployeur considre quun diplme de cycle suprieur quivaut aux deux examens. La condition est donc : (nbreexams >= 2 Or cyclesuperieur = True) And moyenne >= 3 Retourne vrai car (FAUX OU VRAI = VRAI) ET VRAI = VRAI
Remarques
Peu importe la complexit de la condition, celle-ci doit tre vraie pour excuter les commandes en (1). Il est aussi possible dimbriquer plusieurs blocs If.
Syntaxe
If condition1 Then commandes si condition1 est vraie If condition2 Then commandes si condition1 Else commandes si condition1 End If Else commandes si condition1 est fausse If condition3 Then commandes si condition1 Else commandes si condition1 End If End If
On peut aussi laisser tomber le Else dans le cas o le programme ne devrait rien faire si la condition nest pas respecte.
44
Remarques Une condition partielle peut tre : nombre si la comparaison quivaut variable = nombre nombre1,nombre2 si la comparaison quivaut variable = nombre1 Or variable =
nombre2
nombre1 to nombreN si la comparaison quivaut variable = nombre1 Or variable = nombre2 Or Or variable = nombreN
Is OPcomp nombre si la comparaison quivaut variable OPcomp nombre Un exemple viendra claircir le tout.
(Exemple tir de laide de Visual Basic)
Select Case performance Case 1 si performance=1 Bonus = Salaire * 0.1 Case 2, 3 si performance = Bonus = Salaire * 0.09 Case 4 To 6 si performance Bonus = Salaire * 0.07 Case Is > 8 si performance Bonus = 100 Case Else si performance = Bonus = 0 End Select
Programmation itrative
Il arrive trs frquemment en programmation que certaines instructions doivent tre rptes constamment. Le nombre de rptitions peut soit tre fixe davance par une variable ou constante, ou le nombre de rptitions peut tre conditionnel lvolution dune certaine condition. Dans le premier cas, on utilisera les itrations simples, dans le second, les itrations conditionnelles.
45
Remarques Litration illustre dans la syntaxe produira (bornesup-borneinf+1) itrations. Pour rpter n fois une certaine instruction, la forme la plus commune ditration simple est
For compteur = 1 to n Instructions Next compteur
Il est galement possible dutiliser un compteur avec un pas diffrent de 1. En effet, si on inscrit For compteur = borneinf to bornesup Step s, la variable compteur prendra comme valeurs : borneinf, borneinf +s, borneinf +2s, etc. et litration arrtera une fois que la borne suprieure sera rencontre.
Remarques Les instructions dinitialisation sont celles qui permettent dentrer dans la boucle et celles qui donnent une certaine information (tel quun compteur). Un des lments formant la condition DOIT se mettre jour lintrieur de litration. La condition est btie de la mme faon qu laide de la programmation conditionnelle. Si vous voulez utiliser un compteur, vous devrez le crer (en dclarant une variable) et lincrmenter vous-mmes lintrieur de la boucle. Attention aux boucles linfini ! Assurez-vous quil est possible que la condition passe de vrai faux un jour !
46
Arguments
"question pose" "titre de la boite" "valeur par dfaut"
est le texte qui apparatra dans la bote de dialogue, qui est gnralement une question pose lutilisateur. est facultatif et reprsente le titre de la bote de dialogue; sil est omis, le nom de lapplication apparatra. est lui aussi facultatif, correspond au texte apparaissant par dfaut dans la zone de texte lors de laffichage de la bote de dialogue.
Exemple Admettons que lon veuille obtenir le salaire annuel de lutilisateur. Cette procdure stockerait le salaire obtenu de lutilisateur dans la variable salaire :
Sub Salaire_annuel() Dim salaire As Single salaire = InputBox("Veuillez entrer votre salaire annuel:", _ "Saisie du salaire de l'utilisateur", 50000) End Sub
47
noter quil est possible dinsrer des variables dans la fonction InputBox avec loprateur de concatnation & . Par exemple, si le nom de lutilisateur est inscrit dans la cellule A1, on pourrait avoir le programme suivant :
Sub Salaire_annuel() Dim salaire As Single Dim nom As String nom = Range("a1") salaire = InputBox(" " & nom & ": Veuillez entrer votre salaire annuel:", _ "Saisie du salaire de l'utilisateur", 150000) End Sub
Arguments
"Message" Icne "Titre de la bote"
est le texte qui apparatra dans la bote de dialogue. Est en quelque sorte le message destin lutilisateur est facultatif et reprsente un nombre entier. Ce nombre correspond licne choisie dans la bote de dialogue. est lui aussi facultatif, correspond au titre de la bote de dialogue.
Exemple
Sub Investigation() MsgBox "Cet employ n'est plus rentable." End Sub
48
Il est galement possible dobtenir des informations de la part de lutilisateur avec la bote MsgBox, lorsquil sagit de rpondre une question par laffirmative ou la ngative. Syntaxe Obtenir une information simple
Variable = MsgBox("Message", BoutonsEtIcone, "Titre de la bote")
Arguments
"Message" BoutonsEtIcone
"Titre de la bote"
est le texte qui apparatra dans la bote de dialogue. Est en quelque sorte le message destin lutilisateur est facultatif et reprsente un nombre entier. Ce nombre correspond aux boutons et icnes qui apparatront dans la bote de dialogue. Voir tableau plus bas. est lui aussi facultatif, correspond au titre de la bote de dialogue.
Remarques
La variable Variable est de type Integer. Largument BoutonsEtIcone peut sentrer de plusieurs faons. Voici un tableau qui les rsume : Constante Bouton
vbOKnly vbOKCancel vbAbortRetryIgnore vbYesNoCancel vbYesNo vbRetryCancel
Valeur Description 0 1 2 3 4 5 16 32 48 64 0 256 512 768 OK OK et Annuler Abandonner, Ressayer et Ignorer Oui, Non et Annuler Oui et Non Ressayer et Annuler Message critique Question Stop Information Premier bouton Deuxime bouton Troisime Bouton Quatrime bouton
Symbole ou Icne
vbCritical vbQuestion vbExclamation vbInformation
49
Il est possible de combiner boutons et icnes en additionnant les valeurs de la colonne du centre. Voir exemple. Lorsque lutilisateur appuie sur une touche (oui, non, annuler, etc.), la commande MsgBox retourne une valeur entire. Les valeurs sont rsumes dans le tableau suivant. Bouton Constante Valeur vbOK OK 1 vbCancel Annuler 2 vbAbort Abandonner 3 vbRetry Ressayer 4 vbIgnore Ignorer 5 vbYes Oui 6 vbNo Non 7 Ce tableau se lit de la faon suivante : si lutilisateur appuie sur le bouton Oui, alors MsgBox retourne la valeur 6. La variable Variable a donc le nombre 6 stock.
Note : Ces deux tableaux sont tirs du livre Excel 2000 et Visual Basic pour Applications 6 Exemple Si par exemple nous dsirons afficher une bote de dialogue contenant le symbole Question , dans laquelle lutilisateur pourra rpondre la question pose par Oui ou Non , largument BoutonsEtIcone sera gal 36 : 4 pour les boutons + 32 pour le symbole. Les trois instructions suivantes sont quivalentes et produisent la mme bote :
reponse = MsgBox("Autre recherche?", 36, "Recherche") reponse = MsgBox("Autre recherche?", 32 + 4, "Recherche") reponse = MsgBox("Autre recherche?", vbYesNo + vbQuestion, "Recherche")
Dans les instructions prcdentes, la variable reponse contient la rponse de lutilisateur la question. Cette rponse est en fait un chiffre; le programme interprtera ensuite ce chiffre et agira en consquence, selon les dsirs du programmeur. Exemple tir du livre Excel 2000 et Visual Basic pour Applications 6.
50
Trucs de dbogage
Commande Excuter
La commande Excuter permet de mettre en marche la macro construite avec VBA. Il existe deux faons de procder lexcution de la macro. La faon la plus rapide consiste appuyer sur la touche situe dans le haut de la fentre de commande. Pour excuter la macro sans accder lditeur VBA, on doit choisir Outils/Macro/Macros comme lillustre la figure suivante :
51
Il ne suffit que denfoncer le bouton Excuter pour excuter la macro souhaite. Il est galement possible dexcuter une macro laide de la touche F5.
52
Si vous tes convaincu de lexactitude de votre programme jusqu une certaine ligne, positionnez votre curseur cette ligne, appuyez sur CTRL+F8 (appuyez sur CTRL et maintenez enfonc, puis appuyez sur F8). Visual Basic aura excut les lignes avant le curseur et est prt excuter les prochaines lignes, pas--pas, avec vous. Truc : lors de la lecture pas pas dune procdure, il peut tre intressant de voir ce que contiennent les variables au fur et mesure quelles se remplissent. Lorsque vous excutez une procdure en mode pas pas, vous navez qu placer le curseur de la souris pour voir ce que contient une variable.
Points darrt
Les points darrt permettent dinterrompe lexcution dun programme sur une instruction prcise. Cette possibilit est particulirement intressante lorsque vous souponnez lorigine dune erreur. Vous pouvez ainsi excuter normalement toutes les instructions ne posant pas de problmes et dfinir un point darrt pour une instruction dont vous ntes pas sr. La procdure adopter afin dinsrer un point darrt est simple : 1. Placez le curseur sur linstruction voulue; 2. Choisir la commande Basculer le point darrt du menu Dbogage ou appuyer sur la touche F9; 3. Pour supprimer le point darrt, procder de la mme faon que pour insrer un point darrt. Autre technique Il suffit de cliquer en marge de linstruction gauche (zone grise). Linstruction en question sera mise en vidence en rouge vin, et un rond rouge vin viendra se placer en marge. Pour enlever le point darrt, il suffit de cliquer dessus nouveau. Voici une brve illustration :
53
Fentre espions
Les espions permettent despionner les valeurs de variables ou de toute expression renvoyant une valeur dans un contexte dtermin. Voici la procdure adopter pour crer un espion : (1) Choisissez la commande Fentre espions du menu Affichage; La fentre suivante apparatra :
(2) Mettre en surbrillance la variable espionner dans la fentre de code, cliquer sur cette variable et la glisser dans la fentre espions en maintenant enfonce la touche de gauche de la souris. Dans lexemple prcdent, on obtiendrait le rsultat suivant :
En excutant le code en mode pas--pas ou laide de points darrt, vous serez en mesure de voir le contenu des variables (places dans la fentre espion) se mettre jour.
54
Messages derreurs
Le dbogage consiste donc rgler les erreurs directement lies au code du programme et indpendantes de lenvironnement dans lequel sexcute le programme. Trois principaux types derreurs peuvent affecter un programme VBA soit les erreurs de compilation, les erreurs dexcution et les erreurs logiques.
Erreurs de compilation
Ce type derreur survient lorsque VBA rencontre une instruction quil ne reconnat pas; par exemple, lorsquun mot cl contient une faute dorthographe. On remarque que ce type derreur est gnralement le plus frquent. Si on se rfre lexemple prcdent, on aurait pu obtenir ce message derreur :
Erreurs dexcution
Ce type derreur survient aprs que la compilation du programme a t effectue avec russite. Une erreur dexcution peut par exemple, tre lie lutilisation de donnes incompatibles. Dans notre exemple, si on avait dclarer la variable nom comme un double, on aurait obtenu le message derreur suivant si on avait entr un nom en lettres lors de lexcution du programme.
55
Dans la fentre ci-dessus le bouton Fin permet de terminer lexcution du programme, le bouton Dbogage met en surbrillance la ligne de code o VBA dtecte une erreur et le bouton Aide affiche la rubrique daide associ lerreur reconnue.
Erreurs logiques
Ce type derreur est le plus ardu corriger. Contrairement aux erreurs de compilation et dexcution, elles laissent le programme sexcuter. Le rsultat obtenu ne sera pas celui que vous escomptiez. Les erreurs logiques dcoulent gnralement dune lacune de lalgorithme. Une combinaison de la mthode pas pas et de lutilisation des espions est une bonne mthode pour contrer ce type derreurs.
56
'Avec ce programme, les cellules C4:C9 ne seront pas mises jour si on change 'la prestation de dcs. Il faudra excuter le programme chaque fois que la prestation 'change. 'Cette routine est fonction d'une pretation de dcs optionnelle Sub CreerTableau(Optional Prestation As Double = 10000) 'Ces deux lignes servent saisir l'information dans les cellules Range("B1").Value = "Prestation de dcs" Range("C1").Value = Prestation 'Ces lignes servent changer l'apparence du contenu des cellules With Range("B1:C1") .Font.Name = "Arial" .Font.Size = 12 .Interior.ColorIndex = 34 .Borders(xlEdgeTop).Weight = xlMedium .Borders(xlEdgeBottom).Weight = xlMedium .Borders(xlEdgeLeft).Weight = xlMedium .Borders(xlEdgeRight).Weight = xlMedium End With Range("B1").Font.Bold = True Range("C1").Style = "Currency" 'Ces lignes servent modifier la largeur des colonnes Columns("B").ColumnWidth = 25 Columns("C").ColumnWidth = 15 'Ces lignes servent Range("A3").Value = Range("B3").Value = dge x" Range("C3").Value = x" entrer le texte "x" "Probabilit de dcs dans la prochaine anne dun individu "Prime assurance temporaire un an mis l'individu d'ge
57
Dim PlagePrimes As Range Set PlagePrimes = Range("C4:C9") For i = 0 To 5 Cells(4 + i, 1) = 35 + i Cells(4 + i, 2) = 0.015 + 0.005 * i PlagePrimes.Cells(i + 1).Value = Prestation * Cells(4 + i, 2).Value Next i 'Les prochaines lignes servent formatter le tableau (sans la bordure) Dim PlageTitre As Range Dim PlageContenu As Range Set PlageTitre = Range("A3:C3") Set PlageContenu = Range("A4:C9") PlageTitre.Font.Name = Arial PlageTitre.Font.Size = 12 PlageTitre.Font.Bold = True PlageTitre.WrapText = True PlageTitre.VerticalAlignment = xlVAlignCenter PlageTitre.HorizontalAlignment = xlHAlignCenter PlageTitre.Interior.ColorIndex = 34 With PlageContenu .Font.Name = Arial .Font.Size = 12 .HorizontalAlignment = xlHAlignCenter .Interior.ColorIndex = 6 .Columns(2).NumberFormat = "0.000" .Columns(3).Style = "currency" End With 'Les prochaines lignes appliquent la bordure With Range("A3:C9") .Borders(xlEdgeTop).Weight = xlThick .Borders(xlEdgeBottom).Weight = xlThick .Borders(xlEdgeLeft).Weight = xlThick .Borders(xlEdgeRight).Weight = xlThick End With With Range("A3:B9") .Borders(xlEdgeTop).Weight = xlThick .Borders(xlEdgeBottom).Weight = xlThick .Borders(xlEdgeLeft).Weight = xlThick .Borders(xlEdgeRight).Weight = xlThick End With With Range("A4:C9") .Borders(xlEdgeTop).Weight = xlThick .Borders(xlEdgeBottom).Weight = xlThick .Borders(xlEdgeLeft).Weight = xlThick .Borders(xlEdgeRight).Weight = xlThick End With Range("A3:A9").Borders(xlEdgeRight).Weight = xlThin 'Les valeurs xlThin, xlThick, etc. sont des nombres dont la valeur
58
'a dja t stocke en mmoire dans ces constantes systmes. End Sub 'Cette routine permet d'appeler la routine CreerTableau avec une nouvelle 'prestation de dcs Sub PRINCIPAL() CreerTableau 15000 End Sub
Remarques Pour que les cellules C4:C9 soient mises jour ds que lon modifie la prestation de dcs, on peut enlever la ligne
PlagePrimes.Cells(i + 1).Value = Prestation * Cells(4 + i, 2).Value
Vous pouvez aussi mettre en pratique toutes vos connaissances de Visual Basic et Visual Basic pour Excel en faisant lexercice actuariel # 5 et en parcourant rapidement les travaux pratiques de lanne 2000.
59
Syntaxe
VariableScalaire = WorksheetFunction.NomFonction(argument1,argument2,)
Remarques Le nom de la fonction est toujours en anglais, peu importe la langue dExcel. VariableScalaire doit tre du mme type que loutput de la fonction NomFonction. Argument1, etc. sont les arguments associs NomFonction. Ceux-ci peuvent tre le contenu de variables (de type correspondant) ou tre des objets de type Range (dont le contenu est de type correspondant). Fonctions les plus utilises (NomFonction) Fonctions mathmatiques de base SUM calcule la somme des lments AVERAGE calcule la moyenne des lments MDETERM calcule le dterminant dune matrice Fonctions statistiques MIN retourne le minimum des lments MAX retourne le maximum des lments MEDIAN retourne la mdiane des lments STDEV calcule lcart-type des lments (en supposant chantillon)
60
STDEVP calcule lcart-type des lments (en supposant population) CORREL calcule le coefficient de corrlation entre deux sries de donnes SKEW calcule le coefficient dasymtrie (skewness) des lments KURT calcule le coefficient daplatissement (kurtosis) des lments Toutes les distributions (NORMDIST, POISSON, TDIST, GAMMADIST, etc.) Fonctions financires Fonctions logiques etc.
Nous vous invitons consulter laide dExcel pour une liste de toutes les fonctions et de leurs arguments. Remarque Lorsque certaines fonctions retournent des vecteurs ou des matrices de valeurs comme MMULT (multiplie deux matrices) et MINVERSE (inverse une matrice), lutilisation de WorksheetFunction devient un peu plus corse, mais toujours possible. Il faut remplacer VariableScalaire par une variable multi-dimension de type variable (Variant). Ceci dpend par contre de la version utilise de Microsoft Excel.
Utiliser une fonction publique Visual Basic cre par le programmeur lintrieur dun classeur
Il est possible de rendre disponible lintrieur dune feuille de calcul toute fonction publique que vous avez cre pralablement. En effet, toutes les fonctions Excel pr installes comme SOMME, MOYENNE, etc. sont en fait que des fonctions publiques cres lintrieur de Visual Basic. Par contre, vous navez pas accs ces fonctions pr installes.
3. Crer une fonction publique de la mme faon que vous avez bti toute fonction ou sous-routine.
61
Exemple complet
Dans Excel, il existe une panoplie de fonctions pr installes qui nous permettent dobtenir la distribution de probabilit de plusieurs lois. Nous allons crer le mme type de fonction, pour la loi uniforme continue. Excutez les deux premires tapes de la section prcdente, puis utilisez le code cidessous. Cet exemple permet de bien matriser lutilisation de lobjet WorksheetFunction, la programmation conditionnelle par cas ainsi que la structure With End With.
Public Function UniformContDist(x As Double, a As Double, b As Double, cumulative As Boolean) 'a est la borne 'b est la borne 'cumulative est 'la fonction de infrieure de la distribution uniforme suprieure de la distribution uniforme un argument de type booleen. Si true alors la fonction calculera rpartition x. Sinon, la fonction de densit sera value x.
Select Case cumulative Case True With WorksheetFunction UniformContDist = .Min(.Max((x - a) / (b - a), 0), 1) End With Case False UniformContDist = 1 / (b - a) End Select End Function
Ensuite, retournez dans une feuille de calcul Excel. Dans la cellule A1, entrez =UniformContDist(5 ; 3 ; 7 ; TRUE) et vous obtiendrez 0.50. Ceci est bel et bien la fonction de rpartition dune loi uniforme centre sur lintervalle [3,7] valu 5. Entrez la mme fonction, mais remplacez TRUE par FALSE et vous obtiendrez 0.25, soit la fonction de densit. Vous pouvez aussi insrer cette fonction dans une cellule en allant dans le menu Insertion, Fonction. Vous trouverez UniformContDist dans la section Fonctions personnalises. Noubliez pas qu lintrieur de cette fonction vous avez la libert de tout crer comme si ctait une autre fonction ou une autre routine, rendant cette fonctionnalit de Visual Basic, trs utile dans plusieurs situations.
62
Exemple La feuille avec laquelle nous travaillons le plus souvent est la feuille Principale. Par contre, plusieurs donnes vitales sont stockes dans la feuille Donnees et il est souvent ncessaire dy faire rfrence. Il est possible dutiliser la structure With End With, par contre il faut utiliser celle-ci chaque rfrence. Nous utiliserons donc une variable de type Objet pour y faire rfrence. suivre un peu plus loin pour stocker lobjet dans la variable.
Dim MaPlageRef as Range
Exemple (suite)
Set MaPlage = ActiveWorkbook.Worksheets("Donnees").Range("A1:C1")
Remarque
ObjetDeTypeNomObjet doit tre une instruction qui retourne un objet de type NomObjet.
Mthode InputBox
Nous avons vu un peu plus tt que la fonction InputBox permettait lutilisateur de saisir une information lorsque celle-ci tait demande. Cette information tait stocke directement dans une variable standard. La mthode InputBox quant elle permet lutilisateur de saisir une information qui est considre par Visual Basic comme tant un objet. Par exemple, cette information peut tre une plage une cellule, une formule, etc. Syntaxe
Application.InputBox(Prompt, Title, Default, Left, Top, HelpFile, HelpContextId, Type)
Arguments
Prompt Title Default Left
(Requis) Reprsente le texte qui sera affich. Par exemple, Slectionnez une plage de cellules. (Optionnel) Reprsente le titre de la bote de dialogue. (Optionnel) Reprsente la valeur par dfaut dans la zone de saisie. (Optionnel) Position horizontale de la bote de dialogue par rapport au coin suprieur gauche de lcran.
63
(Optionnel) Position verticale de la bote de dialogue par rapport au coin suprieur gauche de lcran. (Optionnel) Spcifie le nom du fichier daide associ la bote de dialogue (Optionnel) Spcifie lidentification de la page daide associ au fichier daide spcifi avec HelpFile. (Optionnel) Type de donnes allant tre entres par lutilisateur. Reprsente un nombre. Type de donnes acceptes par la mthode InputBox Valeur de type 0 1 2 4 8 16 64 Type de donne retourn par InputBox Formule Valeur numrique Chane de caractres Valeur logique (Vrai ou Faux) Objet de type Range Valeur derreur Tableau de valeurs (Array)
Exemple Nous allons btir une bote de dialogue qui permettra lutilisateur de spcifier une plage de cellules.
Sub Dialogue() Dim MaPlage As Range Dclare une variable de type objet Range
Set MaPlage = Application.InputBox(Prompt:="Slectionnez une plage de cellules", Title:="Bote de dialogue", Type:=8) Assigne dans la variable objet MaPlage la plage saisie par lutilisateur On peut donc travailler avec la plage de cellules spcifie par lutilisateur. MsgBox MaPlage.Cells(2, 1) Affiche llment situ la 2e ligne, 1re colonne de la plage spcifie par lutilisateur MaPlage.Font.Size = 20 Applique la taille de police 20 la plage spcifie par lutilisateur. End Sub
64
Travail pratique # 1
Contexte
On voudrait calculer lesprance de la variable alatoire Z qui se dfinit comme tant, E[X ] . E [Z ] = E [Y ] La variable alatoire X peut seulement prendre les valeurs 1 et 2, tandis que la variable alatoire Y peut prendre les valeurs 2 et 4. Vous devez demander lutilisateur, en utilisant la fonction InputBox, de fournir Pr(X=1) et Pr(Y=2). Votre programme devra calculer le reste. La rponse devra tre affiche laide dun MsgBox.
Solution
Sub Esperance() '****************************************************************************** 'Description du programme : Calculer l'esprance de la variable Z partir de l'esprance de X et Y. 'L'esprance de X et Y sont calcules partir de deux probabilits saisies par l'utilisateur. ' 'Pr-conditions : L'utilisateur devra fournir pour P(X=1) et P(Y=2) des valeurs de probabilits situes entre 0 et 1. 'Post-conditions : Le rsultat final sera un nombre, qui correspondra l'esprance de Z et sera affich. '******************************************************************************
'****************************************************************************** ' Dclaration des variables ' Variables dont le contenu est fourni par l'utilisateur Dim v_px1 As Double 'P(X=1) : variable d'entre (Input) ==> probabilit que l'vnement X prenne la valeur 1 Dim v_py2 As Double 'P(Y=2) : variable d'entre (Input) ==> probabilit que l'vnement Y prenne la valeur 2 ' Variables dont le contenu est calcul Dim v_px2 As Double 'P(X=2) : variable intermdiaire de traitement ==> probabilit que l'vnement X prenne la valeur 2 Dim v_py4 As Double 'P(Y=4) : variable intermdiaire de traitement ==> probabilit que l'vnement Y prenne la valeur 4 Dim v_ex As Double 'E(X) : variable intermdiaire de traitement ==> esprance mathmatique de l'vnement X Dim v_ey As Double 'E(Y) : variable intermdiaire de traitement ==> esprance mathmatique de l'vnement Y Dim v_ez As Double 'E(Z) : variable de sortie (Output) ==> esprance mathmatique de l'vnement Z ' Les valeurs possibles de X et Y auraient pu tre entres dans des constantes l'aide de la commande Const '****************************************************************************** ' Si on suppose que la pr-condition est satisfaite... '******************************************************************************
65
' 1re tape : Obtenir les donnes de l'utilisateur ' Donnes fournies par l'utilisateur ' - P(X=1) ' - P(Y=2) ' Entre des donnes par l'utilisateur On Error GoTo Erreur 'Gestion des erreurs 1: v_px1 = InputBox("Veuillez entrer la probabilit que X soit gal 1." & Chr(10) & "P(X=1) ?" & Chr(10) & "N.B. P(X=1) doit tre compris entre 0 et 1.", "P(X=1) ?", "0,5") Select Case v_px1 ' Validation de la probabilit de X=1 Case Is < 0 MsgBox "La valeur de P(X=1) doit tre suprieure 0.", vbOKOnly + vbExclamation, "Erreur !" GoTo 1: Case Is > 1 MsgBox "La valeur de P(X=1) doit tre infrieure 1.", vbOKOnly + vbExclamation, "Erreur !" GoTo 1: Case Else GoTo 2: End Select '******** 2: v_py2 = InputBox("Veuillez entrer la probabilit que Y soit gal 2." & Chr(10) & "P(Y=2) ?" & Chr(10) & "N.B. P(Y=2) doit tre compris entre 0 et 1.", "P(Y=2) ?", "0,5") Select Case v_py2 ' Validation de la probabilit de Y=2 Case Is < 0 MsgBox "La valeur de P(Y=2) doit tre suprieure 0.", vbOKOnly + vbExclamation, "Erreur !" GoTo 2: Case Is > 1 MsgBox "La valeur de P(Y=2) doit tre infrieure 1.", vbOKOnly + vbExclamation, "Erreur !" GoTo 2: Case Else GoTo 3: End Select ' Avec plus de notions en programmation, au lieu de supposer que les valeurs entres sont correctes, le programme ferait ' lui-mme cette vrification ==> Chose qui a t faite avec les Select Case ' P(X=1) est stock dans v_px1 et P(Y=2) est stock dans v_py2 '******************************************************************************
'****************************************************************************** ' 2e tape : Calculs... ' a) P(X=2) ' b) P(Y=4) ' c) E(X) ' d) E(Y) ' e) E(Z) ' Donnes calcules et autognres ' - P(X=2) = 1 - P(X=1) ' - P(Y=4) = 1 - P(Y=2) ' - Esprance de X E(X) = 1*P(X=1) + 2*P(X=2)
66
' - Esprance de Y E(Y) = 2*P(Y=2) + 4*P(Y=4) ' - Esprance de Z E(Z) = E(X)/E(Y) 3: v_px2 = 1 - v_px1 'a) v_py4 = 1 - v_py2 'b) v_ex = v_px1 + 2 * v_px2 'c) v_ey = 2 * v_py2 + 4 * v_py4 'd) v_ez = v_ex / v_ey 'e) ' En calculant P(X=2) et P(Y=4) en faisant respectivement 1 - P(X=1) et 1 - P(Y=2), il est vident que la somme des ' probabilits pour X et Y va donner 1 pour chacun. ' P(X=2) est stock dans v_px2 ' P(Y=4) est stock dans v_py4 ' E(X) est stock dans v_ex ' E(Y) est stock dans v_ey ' E(Z) est stock dans v_ez ==> sera le rsultat affich en 3. '******************************************************************************
'****************************************************************************** ' 3. Afficher le rsultat MsgBox "L'esprance mathmatique de Z = " & v_ez, vbInformation + vbOKOnly, "E(Z) = " & Round(v_ez, 2) '****************************************************************************** Exit Sub 'Post-condition satisfaite : Le rsultat (esprance de Z) a t affich et correspond un nombre. Gestion des erreurs Erreur: MsgBox "Le programme a renvoy une erreur." & Chr(10) & "L'utilisateur n'a pas entr un nombre ou a appuy sur Annuler", vbOKOnly + vbExclamation, "Erreur inattendue !" End Sub
Travail pratique # 2
Contexte
Votre programme devra calculer la valeur actuelle dun seul paiement, en connaissant le taux dintrt et le temps. Ces donnes doivent tre entres par lutilisateur dans une feuille de calcul Excel. Avant dexcuter le calcul, le programme doit avertir (MsgBox) lutilisateur de la dmarche suivre pour assurer le bon fonctionnement du programme. Voici dailleurs ce quoi il pourrait ressembler.
Vous ntes pas obligs dutiliser un bouton tel que sur lillustration.
67
Solution
'****************************************************************************** 'DESCRIPTION DU PROGRAMME : Renvoyer la valeur actuelle d'un paiement lorsque le taux d'intrt est i ' et la dure est de n 'PR-CONDITIONS : 'a) On suppose que l'utilisateur a compris le message d'avertissement et qu'il entrera les donnes dans les bonnes cellules 'b) Le paiement vf actualiser doit tre un nombre rel positif 'c) Le taux d'intrt i doit tre un nombre rel positif, o 10% correspond au nombre 10. 'd) La dure n doit tre aussi un nombre rel positif, o n est un nombre d'annes et la partie dcimale, des fractions d'une anne 'POST-CONDITION : La valeur actuelle du paiement est affiche dans 2 cellules droite de la dernire, et correspond un 'nombre rel positif. '****************************************************************************** '****************************************************************************** 'Dclarations des variables et constantes Private p_vf As Double ' variable d'entre (Input) ==> correspond la valeur future du paiement actualiser Private p_i As Double ' variable d'entre (Input) ==> correspond au taux d'actualisation (taux d'intrt) Private p_n As Double ' variable d'entre (Input) ==> correspond au nombre d'annes Private p_va As Double ' variable de sortie (Output) ==> correspond la valeur actuelle du paiement '****************************************************************************** Sub PRINCIPAL() MsgBox "Pour bien utiliser ce programme il faut... " & Chr(10) & "1) Entrer le paiement actualiser dans la cellule B4. " & Chr(10) _ & "2) Entrer le taux d'intrt dans la cellule C4 sous cette forme : 10 pour 10%, 5 pour 5%, etc..." & Chr(10) & _ "3) Entrer le nombre d'annes dans la cellule D4.", vbOKOnly + vbExclamation, "Avertissement !" 'A: Pr-conditions a) d) satisfaites Call Obtenir Call Calcul Call Afficher End Sub '****************************************************************************** ' 1re tape : Obtenir les donnes de l'utilisateur Sub Obtenir() Range("A1").Activate p_vf = ActiveCell.Offset(3, 1).Value 'Aurait pu tre : Range("B4").Value p_i = ActiveCell.Offset(3, 2).Value / 100 'Aurait pu tre : Range("C4").Value / 100 p_n = ActiveCell.Offset(3, 3).Value 'Aurait pu tre : Range("D4").Value 'A: La valeur du paiement est stocke dans p_vf, le taux d'intrt est stock dans p_i, et le nombre d'annes est stock dans p_n End Sub '****************************************************************************** ' 2e tape : Calculer la valeur actuelle... en rfrence avec la fonction Sub Calcul() p_va = ValActuelle(p_vf, p_n, p_i) 'A: La valeur actuelle du paiement est stocke dans p_va
68
End Sub '****************************************************************************** ' 3e tape : Afficher la valeur actuelle Sub Afficher() ActiveCell.Offset(3, 5) = Round(p_va, 2) End Sub ' A: Post-condition satisfaite : la valeur actuelle du paiement est affich dans la bonne cellule '****************************************************************************** ' PR-CONDITIONS DE LA FONCTION ' Le contenu de l'argument fv doit tre un nombre rel positif ' Le contenu de l'argument n doit tre un nombre rel positif ' Le contenu de l'argument i doit tre un nombre rel positif, o 10% = 0,1 ' POST-CONDITIONS DE LA FONCTION ' ValActuelle renvoie la valeur actuelle du paiement (fv) plac pendant n annes au taux d'intrt i. ' Il s'agit d'un nombre rel positif. Function ValActuelle(fv, n, i) ' Description des arguments ' fv : correspond la valeur future du paiement ' n : correspond au nombre d'annes pour actualiser le paiement ' i : correspond au taux d'intrt ' A: Pr-condition satisfaite car la pr-condition de la procdure suppose les mmes pr-conditions que pour la ' fonction ValActuelle = fv * (1 + i) ^ (-n) ' A: Post-condition satisfaite : la valeur actuelle est calcule. End Function
Travail pratique # 3
Contexte
Vous travaillez dans une compagnie dassurance automobile et vous tes chargs de la tarification dun produit dassurance. On vous demande de btir un programme qui calculera les primes selon certaines caractristiques de lassur tels que lge, le sexe, et la ville. Lassur peut aussi choisir certaines mesures de rduction du risque telles quune franchise (dductible) et une limite de couverture. On suppose que la distribution dun sinistre est exponentielle avec quations
f X ( x ) = e x
La prime pure est donc
d +L
PP =
(x d ) f (x )dx + Lf (x )dx
X X d +L
69
PP =
e d e ( d + L )
Lassur choisit ses modalits de couverture (limite et franchise). Selon ses caractristiques, la prime brute est calcule de la faon suivante.
Le type de ville habit par lassur dtermine le paramtre lambda. Lambda vaut 1/10000 pour une petite ville, 1/15000 pour une moyenne ville et 1/20000 pour une grande ville. Ensuite, on calcule la prime pure (PP) avec les quations prcdentes. Lge et le sexe dtermineront le facteur dajustement appliquer la prime. Le facteur de dpart est 1. Un assur masculin a une surprime de 10% et un assur fminin, un rabais de 15% par rapport la prime de base. Un assur g entre : o 16 et 25 ans : surprime de 20% o 26 et 40 ans : aucune surprime o 41 59 ans : rabais de 10% o 60 ans 100 ans : surprime de 10% Les facteurs sont additifs, cest--dire quun homme de 20 ans a une surprime de (20%+10%=30%). Les lments comme la franchise (compris entre 0 et 1000$), la limite de couverture (compris entre 5000$ et 50000$), lge, le sexe et la ville doivent tre obtenus laide de 5 InputBox. La rponse doit tre affiche avec un MsgBox.
Solution
'****************************************************************************** 'DESCRIPTION DU PROGRAMME : Le programme doit calculer la valeur de la prime d'assurance-automobile en tenant compte ' de certains facteurs tels que la limite de couverture, la franchise, la ville, l'ge et le sexe de l'assur. 'PR-CONDITIONS : 'a) La limite de couverture doit tre un nombre entier positif compris entre 5 000 et 50 000$ 'b) La franchise doit tre un nombre entier positif compris entre 0 et 1 000$ 'c) L'utilisateur doit entrer 1 s'il habite dans une petite ville, 2 s'il s'agit d'une moyenne ville et 3 dans le cas ' d'une grande ville 'd) L'ge doit tre un entier positif compris entre 16 et 100. 'e) L'utilisateur doit entrer M ou m s'il est un homme, ou F ou f si elle est une femme. 'NOTE: PUISQUE LE PROGRAMME PRINCIPAL EST DIVIS EN SOUS-PROGRAMMES, SELON LES TAPES DE L'ALGORITHME, LES PR ET POST 'CONDITIONS S'APPLIQUENT DONC POUR TOUTES LES PROCDURES. 'POST-CONDITION : La valeur de la prime est un nombre rel positif affich dans un MsgBox. '****************************************************************************** '******************************************************************************
70
'Dclarations des variables et constantes Private v_limite As Long 'variable d'entre (EN) ==> contient la limite de couverture de l'assur Private v_deductible As Long 'variable d'entre (EN) ==> contient la franchise de l'assur Private v_ville As Byte 'variable d'entre (EN) ==> contient le numro de la type de ville qu'habite l'assur Private v_age As Byte 'variable d'entre (EN) ==> contient l'ge de l'assur Private v_sexe As String * 1 'variable d'entre (EN) ==> contient le sexe de l'assur (M ou m ou F ou f) Private v_lambda As Double ' variable intermdiaire de calcul ==> contient le facteur lambda qui dpend du type de ville ' habite par l'assur Private v_facteur As Double 'variable intermdiaire de calcul ==> contient un facteur d'augmentation ou de diminution de ' la prime selon l'ge ou le sexe de l'assur Private v_prime As Double ' variable de sortie (SO) ==> contient la prime calcule et ajuste par le facteur '****************************************************************************** Sub PRINCIPAL() ' Procdure qui appelle toutes les sous-routines (tapes de l'algorithme) Call Obtenir Call Calcul Call Afficher End Sub '****************************************************************************** Sub Obtenir() ' 1re tape : Obtenir les donnes de l'utilisateur MsgBox "Bienvenue au programme de calcul des primes d'assurance-automobile" & Chr(10) & "Veuillez rpondre aux questions qui vont suivre", vbInformation + vbOKOnly, "Bienvenue !" v_limite = InputBox("Veuillez entrer une limite de couverture d'assurance." & Chr(10) & "N.B. Cette limite doit tre comprise entre 5 000$ et 50 000$", "Limite de couverture", 50000) 'A: Pr-condition a) satisfaite. La limite de couverture est un nombre entier positif compris entre 5 000 et 50 000$ et ' est stock dans v_limite v_deductible = InputBox("Veuillez entrer le dductible (franchise)." & Chr(10) & "N.B. Cette franchise doit tre comprise entre 0$ et 1000$", "Franchise", 500) 'A: Pr-condition b) satisfaite. La franchise (dductible) est un nombre entier positif compris entre 0 et 1 000$ et ' est stock dans v_deductible v_ville = InputBox("Veuillez entrer le type de ville dans lequel vous vivez." & Chr(10) & "Choix de rponses :" & Chr(10) & _ "1) Petite ville" & Chr(10) & "2) Moyenne ville" & Chr(10) & "3) Grande ville", "Type de ville", 1) 'A: Pr-condition c) satisfaite. Le type de ville est un nombre entier qui est soit 1, 2 ou 3 (selon la ville) et ' est stock dans v_ville v_age = InputBox("Veuillez entrer votre ge." & Chr(10) & "N.B. Vous devez tre g entre 16 et 100 ans pour tre couvert", "ge", 20) 'A: Pr-condition d) satisfaite. L'ge est un nombre entier positif compris entre 16 et 100 et est stock dans v_age v_sexe = InputBox("Veuillez entrer votre sexe." & Chr(10) & "M pour masculin et F pour fminin", "Sexe", "m") 'A: Pr-condition e) satisfaite. Le sexe est une chaine de caractre qui est soit M, m, F ou f ' et est stock dans v_sexe End Sub '****************************************************************************** Sub Calcul() '2e tape : Calculer la prime selon les facteurs modifiant celle-ci
71
' **************************** Select Case v_ville 'Dtermination de la valeur de lambda selon le type de ville habite par l'assur Case Is = 1 v_lambda = 1 / 10000 Case Is = 2 v_lambda = 1 / 15000 Case Is = 3 v_lambda = 1 / 20000 End Select ' A: La valeur de lambda a t dtermine par le programme et est stocke dans la variable v_lambda ' **************************** ' **************************** v_facteur = 1 'Le facteur de modification de la prime par dfaut est de 1 (bref, aucun changement) Select Case v_sexe ' Modification de la prime selon le sexe de l'assur Case Is = "m" v_facteur = v_facteur + 0.1 Case Is = "f" v_facteur = v_facteur - 0.15 Case Is = "M" v_facteur = v_facteur + 0.1 Case Is = "F" v_facteur = v_facteur - 0.15 End Select Select Case v_age ' Modification de la prime selon l'ge de l'assur Case 16 To 25 v_facteur = v_facteur + 0.2 Case 26 To 40 v_facteur = v_facteur + 0 Case 41 To 59 v_facteur = v_facteur - 0.1 Case 60 To 100 v_facteur = v_facteur + 0.1 End Select ' A: La valeur de notre facteur de modification de la prime a t calcul par le programme et est stock dans la ' variable v_facteur ' **************************** ' Calcul de la prime finale l'aide de la fonction et du facteur v_prime = Esperance(v_deductible, v_limite, v_lambda) * v_facteur ' A: Prime finale calcule et stocke dans la variable v_prime End Sub '****************************************************************************** Sub Afficher() ' 3e tape : Afficher la prime l'aide d'un MsgBox MsgBox "La prime d'assurance-automobile est de " & Round(v_prime, 2) & " $", vbOKOnly, "Prime" ' A: Post-condition satisfaite : la valeur de la prime est un nombre rel positif et a t affiche dans un MsgBox End Sub
'****************************************************************************** ' PR-CONDITIONS DE LA FONCTION ' Le contenu de l'argument deductible doit tre un nombre entier compris entre 0 et 1000 et reprsente la franchise
72
' dans l'intgrale (calcul de la prime de base) ' Le contenu de l'argument limite doit tre un nombre entier compris entre 5 000 et 50 000$ et reprsente la limite ' de couverture dans l'intgrale (calcul de la prime de base) ' Le contenu de l'argument lambda peut prendre seulement trois valeurs et reprsente un certain facteur selon la ville ' de l'assur qui ajuste le risque de sinistre et ce, dans l'intgrale (calcul de la prime de base) ' POST-CONDITIONS DE LA FONCTION ' Esperance calcule la prime de base et reprsente un nombre rel positif Function Esperance(deductible, limite, lambda) ' A: Pr-conditions satisfaites Esperance = (Exp(-deductible * lambda) - Exp(-lambda * (deductible + limite))) / (10 * lambda) ' A: Post-condition satisfaite : la prime de base a t calcule End Function ' Rsultat de l'intgrale (voir plus de dtails dans les feuilles incluses avec le TP) ' E(x) = (e ^ (-deductible * lambda) - e ^ (-lambda * (deductible + limite))) / lambda
Travail pratique # 4
Contexte
Vous devez btir un programme qui va trouver, laide de la mthode de la bissectrice, la valeur de la racine carre de 2. Cette mthode sapplique pour trouver le zro dune fonction. Trouver la racine carre de 2 est quivalent trouver le zro de la fonction f(x) = x^22=0. La mthode de la bissectrice consiste sparer plusieurs intervalles en 2. Lintervalle de dpart doit tre tel que la fonction peut tre positive et ngative dans cet intervalle. On spare lintervalle en 2 et le sousintervalle dans lequel il y a changement de signe implique que le zro de la fonction est dans cette zone. On rpte cette tape plusieurs fois jusqu ce quon ait atteint une borne derreur maximale ou un maximum ditrations. Lutilisateur doit entrer les paramtres laide dInputBox, cest--dire le nombre maximal ditrations et lerreur maximale permise.
Solution
Sub ZeroFonction() ' /////////////////////////////////////////////////////////////////////////////////////// ' OBJECTIF : l'aide de la mthode de la bissection, trouver le zro de la fonction ' f(x) = x^2 - 2 ' ' PR-CONDITIONS : ' a) Le nombre d'itrations maximal que l'utilisateur doit entrer doit tre un nombre compris ' dans [1..32767] (ENT_MAX) ' b) La marge d'erreur que l'utilisateur doit entrer doit tre un nombre rel compris dans ' [0..1] ' ' POST-CONDITION : ' Le programme renvoie un intervalle trs petit dans lequel le vrai zro de la fonction ' est situ. la limite, chaque borne de cet intervalle tend vers le zro de la fonction.
73
' On pourrait dfinir z comme tant la valeur au milieu de cet intervalle qui sera un nombre ' rel. ' /////////////////////////////////////////////////////////////////////////////////////// ' /////////////////////////////////////////////////////////////////////////////////////// ' Dclaration des variables et constantes Dim m_erreur As Double ' Variable d'entre (EN) ==> correspond la marge d'erreur maximale ' accepte par l'utilisateur Dim it_max As Integer ' Variable d'entre (EN) ==> correspond au nombre de pas (itrations) que ' le programme doit excuter Dim n As Integer ' Variable intermdiaire de calcul ==> correspond au nombre d'itrations en cours ' Il s'agit d'un accumulateur Dim a As Double ' Variable intermdiaire de calcul ==> correspond la borne infrieure du grand ' intervalle Dim b As Double ' Variable intermdiaire de calcul ==> correspond la borne suprieure du grand ' intervalle Dim x1 As Double ' Variable intermdiaire de calcul ==> correspond la borne infrieure et ' suprieure des sous-intervalles Dim binf As Double ' Variable intermdiaire de calcul ==> correspond la borne infrieure de ' l'intervalle dans lequel est situ le zro de la fonction Dim bsup As Double ' Variable intermdiaire de calcul ==> correspond la borne suprieure de ' l'intervalle dans lequel est situ le zro de la fonction Dim z As Double ' Variable de sortie (SO) ==> correspond au zro de la fonction approxim ' A: Rien d'obtenu de l'utilisateur, pr-conditions a) et b) satisfaites ' ///////////////////////////////////////////////////////////////////////////////////////
' **** 1re tape : Obtenir les donnes de l'utilisateur **** it_max = InputBox("Veuillez entrer le nombre maximal d'itrations" & Chr(10) & "Cette valeur doit tre comprise entre 1 et 32767", "Nombre maximal de pas", 32767) m_erreur = InputBox("Veuillez dfinir la marge d'erreur" & Chr(10) & "La marge d'erreur doit tre comprise entre 0 et 1", "Marge d'erreur maximale", 0.0000000001) ' A: 1 <= it_max <= 32767 o it_max est un entier qui contient le nombre de pas maximal, ' obtenue de l'utilisateur, stocke dans it_max ' A: 0 <= m_erreur <= 1 o m_erreur est un nombre rel qui contient la marge d'erreur maximale, ' obtenue de l'utilisateur, stocke dans m_erreur ' A: Aucun affichage du zro de la fonction ' **** 2e tape : Calculer le zro de la fonction l'aide de la boucle **** 'A: Situation initiale (SI) ==> 4e tape : Conditions d'initialisation a = 1 ' La valeur de la borne infrieure de l'intervalle initial est de 1 b = 2 ' La valeur de la borne suprieure de l'intervalle initial est de 2 x1 = (a + b) / 2 ' x1 est le point milieu de l'intervalle initial, correspondra aux bornes ' infrieures et suprieures des 2 sous-intervalles n = 0 ' Le nombre d'itrations qui a t excut est de 0 ' 1re tape : Dfinir une hypothse de rcurrence ' A: HR ' a) a est toujours la borne infrieure du grand intervalle ' b) b est toujours la borne suprieure du grand intervalle ' c) x1 est toujours la borne infrieure et suprieure des sous-intervalles ' d) binf est la borne infrieure du sous-intervalle choisi (celui dans lequel est le zro de la fonction) ' e) bsup est la borne suprieure du sous-intervalle choisi (celui dans lequel est le zro de la fonction) ' f) it_max contient toujours le nombre maximal d'itrations
74
' g) m_erreur contient toujours la marge d'erreur maximale accepte par l'utilisateur ' 2e tape : Dfinir la condition d'arrt ' A: Conditions d'arrt ==> la boucle s'arrtera ds qu'une OU l'autre de ces conditions est atteinte ' - La valeur absolue de (a-b) est infrieure la marge d'erreur entre par l'utilisateur ' - Le nombre d'itrations excutes est gal au nombre d'itrations maximal entr par l'utilisateur ' 3e tape : Concevoir le corps de l'itration While (Abs(a - b) >= m_erreur) And (n < it_max) ' Dbut du progrs ' A: La valeur absolue de (a-b) est >= la marge d'erreur ' et le nombre d'itrations excute est infrieur au nombre maximal de pas entr par l'utilisateur ' A: pr-conditions a), b), f) et g) de HR satisfaites If f(a) < 0 And f(x1) > 0 Then ' Vrification du sous-intervalle qui contient le zro de la fonction binf = a bsup = x1 ' A: Si le zro de la fonction est compris dans cet intervalle, alors les bornes choisies sont a et x1 Else binf = x1 bsup = b ' A: Si le zro de la fonction est compris dans cet intervalle, alors les bornes choisies sont x1 et b End If ' A: pr-conditions c) e) de HR satisfaites a = binf b = bsup x1 = (a + b) / 2 n=n+1 'A: Les valeurs de a, b et x1 sont mises jour suite la slection du bon sous-intervalle, afin que ce sousintervalle ' soit redivis en 2 autres sous-sous-intervalles ' Fin du progrs Wend ' A: La valeur absolue de (a-b) est < la marge d'erreur ' OU le nombre d'itrations excute est gal au nombre maximal de pas entr par l'utilisateur z = x1 ' A: Le zro de la fonction est stock dans la variable z ' A: Situation finale (SF) ' m_erreur et it_max n'auront pas chang durant l'itration ' a correspondra la valeur de la borne infrieure de l'intervalle choisi ==> tendra vers le zro de la fonction ' b correspondra la valeur de la borne suprieure de l'intervalle choisi ==> tendra vers le zro de la fonction ' x1 correspondra la valeur de la borne suprieure de l'intervalle choisi ==> sera la moyenne des 2 bornes ' n correspondra au nombre d'itrations ncessaires pour renvoyer un zro de la fonction qui respecte ' les conditions de la boucle ' z contiendra le zro de la fonction ' **** 3e tape : Afficher le zro de la fonction **** MsgBox "Le zro de la fonction f(x) = x - 2 est de : " & Chr(10) & Round(z, 9), vbInformation, "Zro de la fonction en " & n & " itrations" 'A: Post-condition satisfaite : le zro de la fonction a t affich et correspond un nombre rel.
75
End Sub ' /////////////////////////////////////////////////////////////////////////////////////// ' OBJECTIF DE LA FONCTION ' Calculer la valeur de f(x) = x^2 - 2 ' ' PR-CONDITIONS DE LA FONCTION ' Le contenu de l'argument x doit tre n'importe quel nombre rel ' ' POST-CONDITIONS DE LA FONCTION ' f calcule la valeur f(x) = x - 2 lorsque x est un nombre rel, et renvoie f(x) Function f(x) ' A: Pr-conditions satisfaites f=x^2-2 ' A: Post-condition satisfaite : la valeur de f(x) a t calcule End Function
Travail pratique # 5
Contexte
Vous devez btir un programme qui calcule et retourne le nombre de faons que l'on peut distribuer " n " balles distinctes dans " r " urnes. Si les capacits de lordinateur sont dpasses, aucune erreur VB doit apparatre ; seul un message provenant du programme doit avertir lutilisateur.
Solution
Sub Rpartition() ' Description : ' Le programme calcule et retourne le nombre de faons que l'on peut distribuer " n " balles 'distinctes dans " r " urnes. ' Pr-condition : ' 1. L'utilisateur fournit un entier " n " dans l'intervalle [1..ENTIER_MAX] reprsentant le nombre de balles rpartir. ' 2. L'utilisateur fournit un entier " r " dans l'intervalle [1..ENTIER_MAX - n + 1] reprsentant le nombre d'urnes. ' 3. " n " doit tre plus grand ou gale " r ". ' Post condition : ' 1. " n " et " r " sont les entiers fournis par l'utilisateur. ' 2. Si les calculs ne dpassent pas la capacit de l'ordinateur, le programme a affich le nombre de faons qu'on peut distribuer les " n " balles dans les " r " urnes. ' 3. Si les calculs dpassent la capacit de l'ordinateur, le programme a affich " Entier trop grand ". ' Dclaration des variables et constantes Dim nballes As Long ' Variable d'entre (EN) ==> contient le nombre de balles (compris entre 1 et ENTIER_MAX) Dim nurnes As Long ' Variable d'entre (EN) ==> contient le nombre d'urnes (compris entre 1 et ENTIER_MAX balles + 1) Dim nfacons As Long ' Variable de sortie (SO) ==> contient le nombre de faons d'organiser n balles dans r urnes.. est un entier compris dans 1.. ENTIER_MAX ' A: Rien d'obtenu de l'utilisateur, pr-conditions 1 3 satisfaites ' **** 1re tape : Obtenir les donnes de l'utilisateur ****
76
nballes = InputBox("Veuillez entrer le nombre de balles, compris entre 1 et ENTIER_MAX", "Nombre de balles") nurnes = InputBox("Veuillez entrer le nombre d'urnes, compris entre 1 et ENTIER_MAX - Balles + 1", "Nombre d'urnes") ' A: 1 <= nballes <= ENTIER_MAX o nballes est un entier qui contient le nombre de balles, a t obtenue de l'utilisateur ' A: 1 <= nurnes <= (ENTIER_MAX - nballes + 1) o nurnes est un entier qui contient le nombre d'urnes, a t obtenue de l'utilisateur ' A: Aucun affichage du nombre de faons ' **** 2e tape : Calculer le nombre de faons **** ' Vrification si la fonction Factorielle a renvoy 0 (Entier trop grand)... If (Factorielle(nballes) = 0) Or (Factorielle(nurnes - 1) = 0) Or (Factorielle(nurnes + nballes - 1) = 0) Then ' **** 3e tape : Afficher le rsultat **** MsgBox "Entier trop grand", vbExclamation + vbOKOnly, "Erreur !" ' A: Post-condition satisfaite : la fonction a dpass la capacit, le programme a renvoy "Entier trop grand" Else ' Si Factorielle n'a pas renvoy 0 pour chaque terme de la combinaison, nfacons sera bien calcul nfacons = Factorielle(nballes + nurnes - 1) / (Factorielle(nballes) * Factorielle(nurnes - 1)) ' **** 3e tape : Afficher le rsultat **** MsgBox "Il y a " & nfacons & " faons de rpartir " & nballes & " balles dans " & nurnes & " urnes", vbInformation + vbOKOnly, "Rsultat" ' A: Post-condition satisfaite : la fonction a pu calculer les factorielles, le nombre de facons a t affich End If End Sub Function Factorielle(k As Long) As Long ' Pr-condition : ' Le paramtre " k " reu de la procdure appelante doit tre un entier dans [0..ENTIER_MAX]. ' Post-condition : '1. L'entier " k " est celui reu en paramtre. '2. Si k = 0, la fonction retourne 1. '3. Si k > 0, la fonction retourne k! si les calculs ne dpassent pas la capacit de l'ordinateur et elle retourne 0 s'ils la dpassent. '4. L'excution de cette fonction ne modifie rien d'autre l'extrieur de celle-ci. ' Dclaration des variables et constantes Const ENTIER_MAX As Long = 2147483647 ' Contient la valeur maximale stocke dans un LONG Dim Test As Long ' Contient une valeur infrieure ENTIER_MAX... permet de valider si k! va entrer dans ENTIER_MAX Dim CpteurTest As Long ' Contient le compteur ou diviseur pour valider mon test Dim n As Long ' Contient le compteur pour calculer la factorielle... n * (n-1) *... ' A: Pr-condition satisfaite Select Case k Case Is = 0 Factorielle = 1 ' A: Post-condition 2 satisfaite Case Is = 1 Factorielle = 1 Case Else ' Tests si l'on peut calculer la factorielle de k ' Principe : Si on divise ENTIER_MAX par k! et que le rsultat appel Test est >= 1, alors k! entre dans ENTIER_MAX ' sinon, elle va dfoncer ! ' 4e tape : Condition d'initialisation ' A: Conditions d'initialisation de ma boucle de test
77
CpteurTest = k ' Compteur ou diviseur au dpart est gal k Test = ENTIER_MAX / CpteurTest ' Test au dpart est gal ENTIER_MAX / CpteurTest ' 1re tape : Dfinir l'hypothse de rcurrence ' A: HR ' - Test est toujours la valeur de rfrence pour savoir si k! va dpasser les capacits de l'ordinateur ' - CpteurTest est toujours la valeur qui va diviser Test ' Ces deux variables sont toujours mises jour tout au long de l'itration ' 2e tape : Dfinir la condition d'arrt ' A: Condition d'arret : CpteurTest doit tre infrieur ou gal 1 car je divise par 3, par 2... et j'arrte. Pourquoi diviser par 1 ' ET la boucle s'arrte ds que Test est infrieure 1 car on sait que si Test < 1, alors on dpasse les capacits de l'ordinateur ' 3e tape : Corps de l'itration While (CpteurTest > 1) And (Test >= 1) ' Dbut du progrs ' A: CpteurTest est > 1 et Test est >= 1 CpteurTest = CpteurTest - 1 ' Compteur qui diminue par CpteurTest, par CpteurTest-1, par CpteurTest-2, etc... Test = Int(Test / CpteurTest) ' Valeur entire car toutes les variables sont de type LONG ' A: Pr-conditions de HR satisfaites ' Fin du progrs Wend ' A: CpteurTest <= 1 OU Test < 1 If Test >= 1 Then ' Le test est ncessairement concluant 'A: Initialisation de l'itration... Factorielle = 1 Factorielle = 1 For n = 2 To k Factorielle = Factorielle * n ' Incrmentation de n chaque itration.. sur le principe de la factorielle Next n ' Incrmentation du compteur automatique avec n ' A: Puisque le test a t concluant, Factorielle contient k! Else Factorielle = 0 ' A: La fonction renvoie 0 si elle a dpass la capacit.. si Test < 1, Factorielle = 0 End If End Select ' A: Post-condition 4 satisfaite End Function
78
Rfrences
Bidault, Mikal. Excel 2000 & Visual Basic pour Applications 6. Campus Press, Simon & Schuster Macmillan. 1999. 534 pages. Aide en ligne de Microsoft Excel et Visual Basic pour Excel. Notes de cours, Basic et Visual Basic, Anne 2000.