Corrigés des exercices



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

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

Algorithmique et programmation : les bases (VBA) Corrigé

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

Corrigé des TD 1 à 5

EXCEL TUTORIEL 2012/2013

Excel 2007 Niveau 3 Page 1

TD3 - Facturation avec archivage automatisé

LES TYPES DE DONNÉES DU LANGAGE PASCAL

Solutions du chapitre 4

STAGE IREM 0- Premiers pas en Python

Application 1- VBA : Test de comportements d'investissements

Formation VBA 3 Interagir

EXPLOITATIONS PEDAGOGIQUES DU TABLEUR EN STG

Présentation du langage et premières fonctions

Manuel d utilisation 26 juin Tâche à effectuer : écrire un algorithme 2

Travaux Pratiques de Commande par ordinateur 1 TRAVAUX PRATIQUES

Découverte du tableur CellSheet

Java Licence Professionnelle CISII,

EXCEL PERFECTIONNEMENT CALCULS AVANCES

PRISE EN MAIN D UN TABLEUR. Version OPEN OFFICE

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

Feuille TD n 1 Exercices d algorithmique éléments de correction

CORRIGES DES CAS TRANSVERSAUX. Corrigés des cas : Emprunts

Rappels sur les suites - Algorithme

Auto-Entreprise : Activités : Eric SOTY - Siret n Formation Bureautique, continue d'adultes. Tél : Fax :

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

Algorithmique avec Algobox

MATLAB : COMMANDES DE BASE. Note : lorsqu applicable, l équivalent en langage C est indiqué entre les délimiteurs /* */.

TD3: tableaux avancées, première classe et chaînes

Probabilités Loi binomiale Exercices corrigés

CHAPITRE I FONCTIONS STATISTIQUES, DE DATE & HEURE... 1

I. Introduction aux fonctions : les fonctions standards

Introduction à MATLAB R

FORMATION au VBA Pour EXCEL. Version 2007 & +

EXCEL PERFECTIONNEMENT SERVICE INFORMATIQUE. Version /11/05

IMAGES NUMÉRIQUES MATRICIELLES EN SCILAB

Examen Médian - 1 heure 30

L ALGORITHMIQUE. Algorithme

GUIDE Excel (version débutante) Version 2013

Initiation à LabView : Les exemples d applications :

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

Soit la fonction affine qui, pour représentant le nombre de mois écoulés, renvoie la somme économisée.

Cours d algorithmique pour la classe de 2nde

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

Utilisation d objets : String et ArrayList

Licence Sciences et Technologies Examen janvier 2010

Probabilités. Rappel : trois exemples. Exemple 2 : On dispose d un dé truqué. On sait que : p(1) = p(2) =1/6 ; p(3) = 1/3 p(4) = p(5) =1/12

COURS DE MS EXCEL 2010

Note de cours. Introduction à Excel 2007

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

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

Résolution de systèmes linéaires par des méthodes directes

Découverte du logiciel ordinateur TI-n spire / TI-n spire CAS

Les probabilités. Chapitre 18. Tester ses connaissances

Tp 1 correction. Structures de données (IF2)

Créer un tableau avec LibreOffice / Calc

Microsoft Excel 2000 Fonctions avancées

Recherche dans un tableau

Les devoirs en Première STMG

PRÉSENTÉ PAR : NOVEMBRE 2007

La Clé informatique. Formation Excel XP Aide-mémoire

Exercices types Algorithmique et simulation numérique Oral Mathématiques et algorithmique Banque PT

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

F7n COUP DE BOURSE, NOMBRE DÉRIVÉ

Complément d information concernant la fiche de concordance

Visual Basic for Applications

Les bases de données. Se familiariser avec Base. Figure 1.1A Ouvre le fichier dont tu as besoin. Lance OpenOffice Base.

Algorithme. Table des matières

Logiciel XLSTAT version rue Damrémont PARIS

Baccalauréat S Antilles-Guyane 11 septembre 2014 Corrigé

Jeux mathématiques en maternelle. Activités clés. Jeu des maisons et des jardins (Yvette Denny PEMF)

Baccalauréat ES/L Amérique du Sud 21 novembre 2013

Premiers Pas en Programmation Objet : les Classes et les Objets

Valeur cible et solveur. Les calculs effectués habituellement avec Excel utilisent des valeurs numériques qui constituent les données d'un problème.

Microsoft Excel Présentation du tableur Excel

Excel Avancé. Plan. Outils de résolution. Interactivité dans les feuilles. Outils de simulation. La valeur cible Le solveur

PROGRAMMATION EVENEMENTIELLE sur EXCEL

Maple: premiers calculs et premières applications

1 Recherche en table par balayage

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

Cours 1 : Introduction Ordinateurs - Langages de haut niveau - Application

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

Utiliser un tableau de données

Excel 2007 Utilisation Avancée

PHP et mysql. Code: php_mysql. Olivier Clavel - Daniel K. Schneider - Patrick Jermann - Vivian Synteta Version: 0.9 (modifié le 13/3/01 par VS)

BACCALAURÉAT GÉNÉRAL SESSION 2012 OBLIGATOIRE MATHÉMATIQUES. Série S. Durée de l épreuve : 4 heures Coefficient : 7 ENSEIGNEMENT OBLIGATOIRE

Programmer en JAVA. par Tama

Formations 2015 Bureautique

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Utilitaires méconnus de StrataFrame

12 Tableaux croisés dynamiques

Définitions. Numéro à préciser. (Durée : )

Comment créer et utiliser une fonction

Représentation d un entier en base b


Utiliser le service de messagerie électronique de Google : gmail (1)

Transcription:

Corrigés des exercices Chapitre 2 1. Résultats du programme calcul3() La figure 14.1 donne le déroulement de l exécution du programme calcul3(). Étape 1 Étape 2 Étape 3 Étape 4 x 40 x 40 x 51 x 51 y 8 y 8 y 6 y 6 z z 32 z 32 z 45 x=40 y=8 z=x-y x=x+11 y=y-2 z=x-y Figure 14.1 Les 4 étapes. À l étape 2, la variable z prend la valeur 32. À l étape 4, la variable z prend la valeur 45. 2. Résultats du programme calcul4() Six variables sont définies par le programme calcul4() : x, y, z, x1, y1 et z1. Elles sont toutes de type Double. Le déroulement de l exécution du programme est le suivant : 1. x = 2/3 : 2/3 est calculé, puis sa valeur 0.666666666666667 est affectée à x. Le résultat est donné avec 15 décimales. 2. y = 4/7 : 4/7 est calculé, puis affecté à y. La variable y vaut alors 0.571428571428571. 3. z = x + y : la somme x + y est tout d abord calculée. Elle vaut 1.23809523809524. La variable z prend alors cette valeur. 4. x1 = Round(x, 2) : cette affectation utilise la fonction Round(x, nb). Celle-ci calcule la valeur arrondie de x avec nb décimales, soit 2 décimales. Elle fournit comme résultat 0.67 et x1 prend la valeur 0.67. 5. y1 = Round(y, 2) : de la même façon, la fonction Round(y, 2) calcule la valeur arrondie de y avec 2 décimales. La variable y1 vaut alors 0.57.

2 Introduction à la programmation avec VBA 6. z1 = x1 + y1 : z1 vaut la somme 0.67 + 0.57, c est-à-dire 1.24 qui est le résultat calculé par le programme. 3. Extraction des chiffres d un nombre Le tirage au hasard d un nombre compris entre 1000 et 9999 est obtenu en utilisant la fonction Int(9000 * Rnd() + 1000) et en affectant ce résultat à la variable étudiée. Pour obtenir le chiffre de l unité, puis celui de la dizaine, puis celui de la centaine et enfin celui du millier, il faut effectuer des divisions entières à l aide des opérateurs \ et Mod. Voici le texte du programme. Il utilise les variables val (valeur du nombre à étudier), nbu (valeur de l unité), nbd (valeur de la dizaine), nbc (valeur de la centaine), nbm (valeur du millier) et les variables x et y comme variables auxiliaires. Listing 14.1 : chiffres4() Sub chiffres4() Dim val As Integer, x As Integer, y As Integer Dim nbu As Integer, nbd As Integer, nbc As Integer, nbm As Integer Randomize val = Int(9000 * Rnd() + 1000) 'nb compris entre 1000 et 9999 nbu = val Mod 10 x = val \ 10 nbd = x Mod 10 y = x \ 10 nbc = y Mod 10 nbm = y \ 10 MsgBox val & " : " & nbu & " " & nbd & " " & nbc & " " & nbm Chapitre 3 1. Prénom, année de naissance et âge Le programme prenom_age() est défini avec trois variables : prenom de type String : la valeur est donnée par l utilisateur. annee de type Integer : la valeur est aussi donnée par l utilisateur. age de type Integer : la valeur est calculée par le programme. Si l on veut qu il affiche comme résultat "Alexandre tu as 23 ans. Bonne chance!", il faut que la chaîne de caractères à afficher grâce à l instruction MsgBox soit structurée de la façon suivante : prenom & " tu as " & age & " ans. Bonne chance!" La chaîne est constituée de la valeur de la variable prenom, puis de la chaîne " tu as ", puis de la valeur de la variable age, et enfin de la chaîne " ans. Bonne chance!". Notez que les deux chaînes contiennent des espaces de façon que les mots de la chaîne finale soient séparés les uns des autres.

Corrigés des exercices 3 Voici le texte du programme. Listing 14.2 : prenom_age() Sub prenom_age() Dim prenom As String Dim annee As Integer, age As Integer prenom = InputBox("quel est ton prénom?") annee = InputBox("quelle est ton année de naissance?") age = 2012 - annee MsgBox prenom & " tu as " & age & " ans. Bonne chance!" Si l on veut que le résultat soit affiché sur deux lignes au sein de la boîte de dialogue, il faut introduire le caractère spécial vbcr de la façon suivante : MsgBox prenom & " tu as " & age & " ans." & vbcr & "Bonne chance!" 2. Numéro de Sécurité sociale Soit ch la variable qui enregistre le numéro de Sécurité sociale donnée par l utilisateur, et soit les variables sexe, annee, mois, departement, numero_registre et cle les variables de type String qui vont servir à mémoriser les diverses informations issues du numéro de Sécurité sociale. Tout numéro de Sécurité sociale se présente comme l indique la figure 14.2. N SS 1 78 07 64 386 097 52 Positions 1 3 6 9 12 20 Figure 14.2 structure d un numéro de sécurité sociale. Pour extraire chaque information du numéro de Sécurité sociale, il faut employer plusieurs fois la fonction Mid(ch, d, n) qui extrait n caractères de la chaîne ch à partir de la position d. Les caractères étant numérotés à partir de 1, les nombres 1, 3, 6, 9, 12 et 20 donnent les positions des débuts de chaque partie à considérer. Le programme est donc le suivant. Listing 14.3 : numero_ss() Sub numero_ss() Dim ch As String Dim sexe As String, annee As String, mois As String Dim departement As String, numero_registre As String Dim cle As String ch = InputBox("Numéro de Sécurité Sociale " & vbcr _ & "(avec un espace entre chaque élément)?") sexe = Mid(ch, 1, 1)

4 Introduction à la programmation avec VBA annee = Mid(ch, 3, 2) mois = Mid(ch, 6, 2) departement = Mid(ch, 9, 2) numero_registre = Mid(ch, 12, 7) cle = Mid(ch, 20, 2) MsgBox "Sexe : " & sexe & vbcr _ & "Annee : " & annee & vbcr _ & "Mois : " & mois & vbcr _ & "Département : " & departement & vbcr _ & "Numéro registre : " & numero_registre & vbcr _ & "Clé : " & cle 3. Calculs concernant un emprunt Soit les variables suivantes : montant : le montant de l emprunt. taux : le taux d intérêt annuel ; d où la variable t définie par t = taux / 12 qui donne le taux mensuel. nb_annees : durée de l emprunt ; d où la variable nb définie par nb = nb_annees * 12 qui donne le nombre de mois de la durée de l emprunt. mensualite : mensualité à payer. Le calcul de la mensualité est donné par la formule : mensualite = (montant * t) / (1 - (1 + t) ^ -nb) Le programme emprunt() effectue les trois calculs demandés : a. calcul de la mensualité ; b. calcul de la valeur cible : montant emprunté ; c. calcul de la valeur cible : nombre de mois. Les deux derniers calculs sont faits en reformulant la formule initiale : new_montant = (new_mensualite * (1 - (1 + t) ^ -nb)) / t new_nbmois = (-Log(1 - (montant * t / new_mensualite))) / Log(1 + t) Listing 14.4 : emprunt() Sub emprunt() Dim montant As Double, new_montant As Double Dim taux As Double, t As Double Dim mensualite As Double, new_mensualite As Double Dim nb_annees As Integer Dim nb As Integer, new_nbmois As Double '--- Calcul mensualité --- montant = InputBox("Montant de l'emprunt?") taux = InputBox("Taux d'intérêt annuel (exemple : 5,5)?") taux = taux / 100

Corrigés des exercices 5 nb_annees = InputBox("Durée de l'emprunt (nb années)?") t = taux / 12 nb = nb_annees * 12 mensualite = (montant * t) / (1 - (1 + t) ^ -nb) MsgBox Round(mensualite, 2) '--- Valeur cible = montant emprunté --- new_mensualite = InputBox("Quelle mensualité souhaitez-vous? ") new_montant = (new_mensualite * (1 - (1 + t) ^ -nb)) / t MsgBox Round(new_montant, 2) '--- Valeur cible = nombre de mois --- new_mensualite = InputBox("Quelle mensualité maximale souhaitez-vous? ") new_nbmois = (-Log(1 - (montant * t / new_mensualite))) / Log(1 + t) MsgBox Round(new_nbmois, 2) Chapitre 4 Équation du second degré L équation du second degré ax 2 + bx + c = 0 est définie avec les coefficients numériques a, b et c, le coefficient a devant être différent de 0. Les valeurs des racines dépendent de la valeur du discriminant b 2 4 a c. Soit discrim la variable qui donne la valeur du discriminant. Trois cas sont à distinguer pour calculer les racines de l équation : Si la valeur de discrim est positive, les racines sont données par les valeurs de r1 et r2. Si la valeur de discrim est nulle, les deux racines sont égales. Si la valeur de discrim est négative, il n y a pas de racines réelles. Avant l étude de ces trois cas, il convient de vérifier si le coefficient a est bien différent de 0. Le programme est structuré par une instruction conditionnelle imbriquée qui examine tous les cas présentés ci-dessus. Listing 14.5 : eq2degre() Sub eq2degre() Dim a As Double, b As Double, c As Double Dim discrim As Double, r1 As Double, r2 As Double a = InputBox("donne la valeur du coef a : ") b = InputBox("donne la valeur du coef b : ") c = InputBox("donne la valeur du coef c : ") discrim = b * b - 4 * a * c If a = 0 Then MsgBox "a=0 : calcul impossible!" ElseIf discrim > 0 Then r1 = (-b - Sqr(discrim)) / (2 * a) r2 = (-b + Sqr(discrim)) / (2 * a) MsgBox "r1=" & r1 & " " & "r2=" & r2

6 Introduction à la programmation avec VBA ElseIf discrim = 0 Then r1 = -b / (2 * a) r2 = r1 MsgBox "r1=r2=" & r1 Else MsgBox "Pas de racines réelles" End If Exemples : si a = 1, b = 6.2 et c = 9.25, les racines valent r1 = 2.5 et r2 = 3.7 ; si a = 1, b = 13 et c = 42.25, le discriminant est nul et r1 = r2 = 6.5. 2. Deux nombres sont-ils proches? Soit x et y deux variables dont les valeurs sont des nombres aléatoires donnés par la fonction Int(500 * Rnd() + 1), et soit seuil la variable dont la valeur positive est donnée par l utilisateur à l aide de l instruction InputBox. Pour résoudre le problème, il faut tout d abord calculer la valeur absolue de la différence x y. Soit diff la variable qui reçoit la valeur x y. Si da différence est négative, il suffit d attribuer la valeur diff à la variable diff en écrivant If diff < 0 Then diff = diff. Cette instruction If Then (sans Else) rend alors positive la valeur de la différence, donnant ainsi la valeur absolue (la valeur absolue d un nombre est toujours positive). La comparaison peut ensuite être faite entre cette valeur positive et la valeur du seuil à l aide d une instruction conditionnelle If Then Else End If. Le programme nbsproches() fournit alors les résultats. Listing 14.6 : nbs proches() Sub nbsproches() Dim x As Integer, y As Integer Dim seuil As Integer, diff As Integer Randomize x = Int(500 * Rnd() + 1) 'de 1 à 500 y = Int(500 * Rnd() + 1) seuil = InputBox("valeur du seuil positive : ") diff = x - y If diff < 0 Then diff = -diff If diff < seuil Then MsgBox "OK " & x & " et " & y & " sont proches" Else MsgBox "NON " & x & " et " & y & " ne sont pas proches" End If Exemple : si x vaut 102 et y vaut 341, et si l utilisateur donne 200 comme valeur de la variable seuil, les deux nombres x et y sont proches car la variable diff vaut +139, valeur inférieure à 200.

Corrigés des exercices 7 3. Une loterie de 1 à 500 Soit nb la variable dont la valeur est tirée au hasard par la fonction Int(500 * Rnd() + 1) qui donne un résultat compris entre 1 et 500. Quatre cas sont à distinguer selon les valeurs de la variable nb : de 1 à 200 : gain de 10 ; 201 ou 202 : gain de 1 000 ; de 203 à 400 : gain de 20 ; de 401 à 500 : gain de 15. Plusieurs formulations sont possibles pour examiner ces quatre cas. Nous en avons choisi deux. La première est définie avec une succession d instructions If Then (sans Else). La seconde est structurée par l instruction Select Case Voici le premier programme. Listing 14.7 : loterie1() Sub loterie1() Dim nb As Integer, gain As Integer Randomize nb = Int(500 * Rnd() + 1) If nb >= 1 And nb <= 200 Then gain = 10 If nb = 201 Or nb = 202 Then gain = 1000 If nb >= 203 And nb <= 400 Then gain = 20 If nb >= 401 Then gain = 15 MsgBox "Vous avez gagné " & gain & " car nb = " & nb Voici le second programme défini avec l instruction Select Case... Listing 14.8 : loterie2() Sub loterie2() Dim nb As Integer, gain As Integer Randomize nb = Int(500 * Rnd() + 1) Select Case nb Case 1 To 200 gain = 10 Case 201, 202 gain = 1000 Case 203 To 400 gain = 20 Case 401 To 500 gain = 15 End Select MsgBox "Vous avez gagné " & gain & " car nb = " & nb

8 Introduction à la programmation avec VBA Notez les deux formulations lorsque le programme examine si la variable nb vaut 201 ou 202 : L instruction conditionnelle définit la condition avec l opérateur logique Or : If nb = 201 Or nb = 202 Then gain = 1000 L instruction Select Case donne les deux valeurs possibles en les énumérant : Case 201, 202 gain = 1000 Chapitre 5 1. Somme et moyenne de plusieurs nombres Le programme est construit avec quatre variables : x reçoit la valeur du nombre donné par l utilisateur, som permet de calculer la somme des nombres x, nb permet de compter le nombre des nombres donnés par l utilisateur, et moy donne la moyenne de ces nombres. Le texte du programme est le suivant. Listing 14.9 : somme_nbpos() Sub somme_nbspos() Dim x As Double, som As Double, moy As Double Dim nb As Integer som = 0 nb = 0 x = InputBox("Donnez un nombre positif :" & vbcr _ & "Pour arrêter le processus, tapez -1") While x <> -1 som = som + x nb = nb + 1 x = InputBox("Donnez un nombre positif :" & vbcr _ & "Pour arrêter le processus, tapez -1") Wend If nb > 0 Then moy = som / nb MsgBox "somme = " & som & vbcr _ & "moyenne = " & moy Else MsgBox "aucun nombre positif!" End If Le programme est structuré par l instruction While Wend avec la condition x <> 1. Lorsque x vaut 1, l instruction itérative arrête son exécution, sans que cette valeur de 1 soit prise en compte dans le calcul de la somme des nombres.

Corrigés des exercices 9 2. Calcul de U n Pour calculer U n = a U n 1 + b U n 2 à partir des valeurs de a, b, U 0, U 1 et n données par l utilisateur, plusieurs variables sont nécessaires : Les variables a, b et n enregistrent les valeurs données au clavier. Les variables U0 et U1 mémorisent les deux valeurs initiales U 0 et U 1 données par l utilisateur. Les variables U, V et W vont effectuer le calcul demandé lors de l exécution de l affectation : U = a * V + b * W. Le texte du programme utilise aussi la variable i pour compter le nombre de répétitions effectuées. Voici le code de ce programme. Listing 14.10 : calcul_un() Sub calcul_un() Dim a As Double, b As Double Dim U0 As Double, U1 As Double Dim U As Double, V As Double, W As Double Dim n As Integer, i As Integer a = InputBox("donne la valeur de a : ") b = InputBox("donne la valeur de b : ") U0 = InputBox("donne la valeur de U0 : ") U1 = InputBox("donne la valeur de U1 : ") n = InputBox("donne la valeur de n : ") W = U0 V = U1 For i = 2 To n U = a * V + b * W W = V V = U MsgBox "Un vaut " & U Lorsque i vaut 2, la variable U prend la valeur de a U1 + b U0 puisque V vaut U1 (c est-à-dire U 1 ) et que W vaut U0 (c est-à-dire U 0 ). La valeur de U est donc la valeur U 2. Puis W prend la valeur de V, c est-à-dire U 1, et V prend la valeur de U, c est-à-dire U 2. Au tour suivant, U va donc prendre la valeur de a U2 + b U1, qui est la valeur de U 3. Le même processus reproduit plusieurs fois permet de calculer de proche en proche la valeur U n pour n donné par l utilisateur. 3. Calcul de la valeur actuelle nette La formule financière qui donne la valeur actuelle nette (VAN) à la date 0 est la suivante : F i (1 + t) i I

10 Introduction à la programmation avec VBA Elle définit une somme pour i allant de 1 à nb_annees, en mettant en jeu les éléments suivants : F i définit le flux net de trésorerie de la période i : la variable flux représentera ces quantités au sein du programme. t est le taux d actualisation : la variable taux donnera sa valeur au sein de la somme à calculer. I est le montant de l investissement initial : la variable invest_init donnera sa valeur initiale. Voici le texte du programme qui calcule la VAN selon cette formule. Listing 14.11 : VAN() Sub VAN() Dim invest_init As Double Dim flux As Double Dim taux As Double Dim nb_annees As Integer, i As Integer Dim VAN As Double, somme As Double invest_init = InputBox("Investissement initial?") taux = InputBox("Taux d'actualisation?") nb_annees = InputBox("Nombre d'années?") somme = -invest_init For i = 1 To nb_annees flux = InputBox("Flux de trésorerie année " & i) somme = somme + flux * (1 + taux) ^ -i VAN = somme MsgBox VAN Le programme permet à l utilisateur de donner les valeurs de l investissement initial, du taux d actualisation et du nombre d années à prendre en compte. Le calcul de la VAN se fait en initialisant la variable somme avec la valeur négative invest_init. Il se poursuit en ajoutant les quantités flux * (1 + taux) ^ i à la somme déjà calculée, la valeur de la variable flux étant donnée à chaque fois par l utilisateur. Au terme du calcul, la variable somme a pour valeur la valeur actuelle nette recherchée. Exemple : si l investissement initial vaut 10000, le taux d actualisation 0,1, le nombre d années 4 et si les flux nets de trésorerie valent 3500, 3000, 3200 et 3400, le résultat vaut 387,610. La VAN est alors positive.

Corrigés des exercices 11 Chapitre 6 1. Les deux valeurs les plus grandes Le programme recherche les deux valeurs les plus grandes. Soit maxsup et maxinf les variables qui enregistrent les deux valeurs maximales, la valeur de maxsup étant supérieure ou égale à celle de maxinf. Le programme étudie chaque valeur x tirée au hasard : Si x est supérieure à maxsup, deux mises à jour sont nécessaires : maxinf doit prendre la valeur de maxsup et maxsup doit prendre la valeur de x. Sinon (x est inférieure ou égale à maxsup) et si x est supérieure à maxinf, la valeur de maxinf doit être mise à jour : maxinf = x. Voici le programme correspondant. Listing 14.12 : deuxmax() Sub deuxmax() Dim x As Integer, maxsup As Integer, maxinf As Integer Dim i As Integer Dim ch As String Randomize maxsup = 0 maxinf = 0 For i = 1 To 10 x = Int(100 * Rnd() + 1) 'de 1 à 100 ch = ch & " " & CStr(x) If x > maxsup Then maxinf = maxsup maxsup = x ElseIf x > maxinf Then maxinf = x End If MsgBox ch & vbcr & "maxsup=" & maxsup & " maxinf=" & maxinf 2. Étude d un mot Le mot donné au clavier est enregistré par la variable ch. Ce mot contient Len(ch) caractères. Pour étudier si les caractères de la chaîne ch sont tous différents, il suffit de comparer le i ème caractère de ch avec tous les autres caractères de la sous-chaîne commençant en i + 1, en faisant l étude pour chaque valeur de i allant de 1 à Len(ch) 1. Voici le texte du programme.

12 Introduction à la programmation avec VBA Listing 14.13 : lettresdiff() Sub lettresdiff() 'première solution, voir MMIA p4 Dim ch As String Dim i As Integer, j As Integer, nb As Integer ch = InputBox("donne un mot :") nb = 0 For i = 1 To Len(ch) - 1 For j = i + 1 To Len(ch) If Mid(ch, i, 1) = Mid(ch, j, 1) Then nb = nb + 1 Next j If nb = 0 Then MsgBox ("lettres toutes différentes") Else MsgBox ("lettres NON toutes différentes") End If Une double boucle permet de structurer l étude des caractères : la boucle extérieure est définie par la variable i allant de 1 à Len(ch) 1 et la boucle intérieure par la variable j allant de i + 1 à Len(ch). La condition Mid(ch, i, 1) = Mid(ch, j, 1) permet de tester si le i ème caractère est égal ou non au j ième caractère de la chaîne ch. Si tous les caractères sont différents, la variable nb garde sa valeur initiale qui vaut 0. 3. Palindrome Soit ch la chaîne de caractères à étudier. Soit i la variable qui donne la position des caractères à partir du début de la chaîne et j la variable qui donne la position des caractères à partir de la fin de la chaîne. Pour déterminer si ch est un palindrome ou non, il faut comparer le premier et le dernier caractère, puis le deuxième et l avant-dernier, etc. Il suffit donc de comparer le i ème caractère et le j ième caractère autant de fois que nécessaire en augmentant i de 1 et en diminuant j de 1 après chaque comparaison. Le programme est alors le suivant. Listing 14.14 : palindrome() Sub palindrome() Dim ch As String Dim i As Integer, j As Integer Dim val As Boolean ch = InputBox("donne le mot à étudier :") i = 1 j = Len(ch) val = True While i < j And val If Mid(ch, i, 1) = Mid(ch, j, 1) Then i = i + 1 j = j - 1

Corrigés des exercices 13 Else val = False End If Wend If val = True Then MsgBox ch & " est un palindrome" Else MsgBox ch & " n'est pas un palindrome" End If Exemple : le mot «radar» est un palindrome, alors que ce n est pas le cas du mot «radars» (avec un s). Chapitre 7 1. Valeurs cumulées Le premier tableau tab1 contient les dix valeurs numériques données par l utilisateur et le second tableau tab2 enregistre les valeurs cumulées. La i ème valeur cumulée est calculée en faisant la somme de la i ème valeur du tableau initial tab1(i) et de la valeur cumulée tab2(i 1) calculée précédemment : tab2(i) = tab1(i) + tab2(i - 1) Il faut alors exécuter cette instruction pour toutes les valeurs de i allant de 2 à 10. Pour la valeur i = 1, il suffit d attribuer à tab2(1) la valeur du premier nombre du tableau. Voici le programme correspondant. Listing 14.15 : val_cumulees() Sub val_cumulees() Dim tab1(1 To 10) As Integer, tab2(1 To 10) As Integer Dim i As Integer Dim ch1 As String, ch2 As String ch1 = "" For i = 1 To 10 tab1(i) = InputBox("donne la valeur n " & i) ch1 = ch1 & CStr(tab1(i)) & " " tab2(1) = tab1(1) ch2 = tab2(1) & " " For i = 2 To 10 tab2(i) = tab1(i) + tab2(i - 1) ch2 = ch2 & CStr(tab2(i)) & " " MsgBox ch1 & vbcr & ch2

14 Introduction à la programmation avec VBA 2. Deux valeurs successives égales? Le tableau t est constitué de 15 éléments. Chaque élément du tableau a pour valeur un nombre tiré au hasard. La propriété recherchée (existe-t-il deux valeurs successives égales?) ne concerne que quelques éléments du tableau et non pas tous les éléments. Il convient alors de supposer a priori que la propriété n est pas vérifiée et d affecter à la variable prop la valeur 1. Mais dès que le programme constate que deux valeurs successives t(i) et t(i + 1) sont égales (t(i) = t(i + 1)), la variable prop doit prendre la valeur 0 pour signifier que la propriété recherchée est vérifiée. Le programme est donc le suivant. Listing 14.16 : deuxnbs() Sub deuxnbs() Dim t(1 To 15) As Integer Dim i As Integer, prop As Integer Dim ch As String ch = "" Randomize For i = 1 To 15 t(i) = Int(20 * Rnd() + 1) 'de 1 à 20 ch = ch & CStr(t(i)) & " " prop = 1 i = 1 While i < 14 And prop = 1 If t(i) = t(i + 1) Then prop = 0 i = i + 1 Wend If prop = 0 Then MsgBox ch & vbcr _ & "il y a deux nbs successifs égaux" Else MsgBox ch & vbcr _ & "il n'y a pas deux nbs successifs égaux" End If L instruction itérative While Wend a pour condition i < 14 And prop = 1. Tant que cette condition reste vraie, le programme examine si t(i) et t(i + 1) ont des valeurs égales. Si c est le cas, la variable prop prend la valeur 0, ce qui rend alors la condition du While fausse, arrêtant ainsi l exécution de cette instruction. Le test final étudie la valeur de la variable prop. Si celle-ci vaut 0, deux nombres successifs du tableau sont bien égaux. En revanche, si la variable prop a conservé sa valeur initiale 1, cela signifie que le programme n a pas constaté l égalité recherchée : il n y a donc pas deux valeurs successives égales au sein du tableau.

Corrigés des exercices 15 Chapitre 8 1. Calcul de e x e x qui vaut 1 + x + x 2 / 2! + x 3 / 3!+ + x n / n peut s écrire sous la forme 1 + x k / k!, pour k allant de 1 à n. En langage VBA, x k / k! s écrit (x ^ k) / facto(k), le caractère ^ signifiant puissance, et facto(k) étant une fonction qui calcule la factorielle de k. Pour calculer e x, il suffit donc de répéter n fois l affectation suivante : res = res + (x ^ k) / facto(k) dans laquelle res permet de calculer la somme totale après avoir été initialisée à 1. Le code du programme est constitué d une procédure et d une fonction : La procédure exp() permet à l utilisateur de donner les valeurs de x et de n, puis elle effectue le calcul en utilisant une boucle For Next La fonction facto(x) calcule la factorielle de x. Listing 14.17 : exp() et facto(x) Sub exp() Dim x As Double, n As Double, res As Double, k As Integer x = InputBox("donne la valeur de x :") n = InputBox("donne la valeur de n :") res = 1 For k = 1 To n res = res + (x ^ k) / facto(k) Next k MsgBox res Function facto(x As Integer) As Double Dim i As Integer, f As Double f = 1 For i = 1 To x f = f * i facto = f End Function Exemple : si x = 2 et n = 15, le résultat vaut 7.38905609538414. 2. Gestion d un tableau de notes Le programme gestion_notes() assure la gestion d un tableau de notes à l aide de trois procédures : ajout_note() : elle ajoute une note au tableau de notes. affichage_notes() : elle affiche toutes les notes. moyenne_notes() : elle calcule la moyenne des notes.

16 Introduction à la programmation avec VBA Nous avons défini deux variables globales : tnotes qui définit un tableau de 15 notes et nbnotes qui donne le nombre de notes mises au sein du tableau. Ces deux variables globales sont déclarées en tête du texte et sont utilisées par chacune des procédures. Voici le texte complet des quatre procédures. Listing 14.18 : gestion_notes(), ajout_note(), affichage_notes() et moyenne_notes() Dim tnotes(1 To 15) As Double Dim nbnotes As Integer Sub gestion_notes() Dim rep As Integer nbnotes = 0 rep = 1 While rep <> 4 rep = InputBox("1: ajout d'une note" & vbcr _ & "2: affichage des notes" & vbcr _ & "3: moyenne des notes" & vbcr _ & "4: FIN") If rep = 1 Then ajout_note If rep = 2 Then affichage_notes If rep = 3 Then moyenne_notes Wend Sub ajout_note() tnotes(nbnotes + 1) = InputBox("donne la note :") nbnotes = nbnotes + 1 Sub affichage_notes() Dim i As Integer, resultats As String resultats = "" For i = 1 To nbnotes resultats = resultats & " " & tnotes(i) MsgBox (resultats) Sub moyenne_notes() Dim i As Integer, s As Double, moy As Double For i = 1 To nbnotes s = s + tnotes(i) moy = s / nbnotes MsgBox moy La procédure gestion_notes() propose quatre choix à l utilisateur : S il tape 1, c est la procédure ajout_note() qui s exécute. S il tape 2, c est la procédure affichage_notes() qui s exécute. S il tape 3, c est la procédure moyenne_notes() qui s exécute. En revanche, s il tape 4, aucune procédure n est appelée, la condition du While devient fausse et le programme met fin à son exécution.

Corrigés des exercices 17 3. Une fonction personnalisée Le nombre de combinaisons à calculer est défini à l aide de deux paramètres n et p, et vaut n! / (p! * (n p)!). En langage VBA, cette expression s écrit facto(n) / (facto(p) * facto(n p)) lorsque facto( ) est une fonction qui calcule la factorielle de son argument. Le code de la fonction facto(x) étant déjà défini (voir listing 14.17), le texte de la fonction personnalisée fp_combin(c1, c2) est alors le suivant. Listing 14.19 : fp_combin(c1, c2) Function fp_combin(c1 As Range, c2 As Range) As Integer Dim n As Integer, p As Integer n = c1.value p = c2.value fp_combin = facto(n) / (facto(p) * facto(n - p)) End Function Chapitre 9 1. Partage d une série de nombres Le programme est structuré avec les variables suivantes : p désigne la plage B1:D10 qui contient la série des nombres à étudier (colonne B) et les résultats recherchés (colonnes C et D). seuil enregistre la valeur donnée par l utilisateur. i désigne la ligne du i ème nombre de la série des nombres. j désigne la ligne du j ième nombre à ajouter dans la colonne C (nombres inférieurs à la valeur de seuil) ; k désigne la ligne du k ième nombre à ajouter dans la colonne D (nombres supérieurs ou égaux à la valeur de seuil). Voici le texte du programme. Listing 14.20 : partage_serie() Sub partage_serie() Dim p As Range Dim seuil As Integer Dim i As Integer, j As Integer, k As Integer Set p = Range("B1:D10") seuil = InputBox("donne la valeur du seuil :") j = 1 k = 1 For i = 1 To 10 If p.cells(i, 1).Value < seuil Then p.cells(j, 2).Value = p.cells(i, 1).Value j = j + 1

18 Introduction à la programmation avec VBA Else p.cells(k, 3).Value = p.cells(i, 1).Value k = k + 1 End If Le i ème nombre de la série des nombres est donné par la variable p.cells(i, 1).Value. Si cette valeur est inférieure à la valeur de seuil, ce nombre est recopié dans la deuxième colonne de la plage au sein d une cellule de coordonnées (j, 2), puis j est augmenté de 1. Sinon, ce nombre est recopié dans la troisième colonne de la plage au sein d une cellule de coordonnées (k, 3), puis k est augmenté de 1. 2. Table de multiplications Le programme est le suivant. Listing 14.21 : table_multip() Sub table_multip() Dim c As Range Dim i As Integer, j As Integer Set c = Range("A1") For i = 1 To 10 '---(1) Valeurs de i --- c.offset(i, 0).Value = i For j = 1 To 10 '---(2) Valeurs de j --- c.offset(0, j).value = j Next j For i = 1 To 10 '---(3) Résultats --- For j = 1 To 10 c.offset(i, j).value = _ c.offset(i, 0).Value * c.offset(0, j).value Next j La variable c désigne la cellule A1. Le programme exécute les actions suivantes : 1. Valeurs de i. Les valeurs de i allant de 1 à 10 sont placées au sein des cellules de la plage A2:A11 (sur la colonne A). 2. Valeurs de j. Les valeurs de j allant de 1 à 10 sont placées au sein des cellules de la plage B1:K1 (sur la ligne 1). 3. Résultats. Les résultats des calculs sont affectés aux cellules de la plage B2:K11. Le produit i * j est calculé par le produit c.offset(i, 0).Value * c.offset(0, j).value, et sa valeur est affectée à la cellule c.offset(i, j). 3. Effectifs et fréquences cumulées Voici le code du programme.

Corrigés des exercices 19 Listing 14.22 : val_cumulees() Sub val_cumulees() Dim i As Integer, nblig As Integer Dim s As Double Dim pl As Range Set pl = Selection nblig = pl.rows.count '---(1) Effectifs cumulés --- pl.cells(1).offset(0, 1).Value = pl.cells(1).value s = 0 For i = 2 To nblig s = pl.cells(i).value + pl.cells(i - 1).Offset(0, 1).Value pl.cells(i).offset(0, 1).Value = s '---(2) Fréquences relatives --- For i = 1 To nblig pl.cells(i).offset(0, 2).Value = pl.cells(i).value / s '---(3) Fréquences relatives cumulées --- For i = 1 To nblig pl.cells(i).offset(0, 3).Value = pl.cells(i).offset(0, 1).Value / s Le programme est conçu pour que l utilisateur sélectionne tout d abord une plage de cellules à une seule colonne dans laquelle il va mettre les effectifs à examiner. Cette colonne est désignée par la variable pl. Puis le programme calcule le nombre de lignes de la plage pl en exécutant nblig = pl.rows.count. Le programme effectue ensuite les trois traitements demandés. 1. Calcul des effectifs cumulés. La valeur initiale des effectifs cumulés est la première valeur des effectifs. D où la première affectation : pl.cells(1).offset(0, 1).Value = pl.cells(1).value. Pour déterminer la i ème valeur des effectifs cumulés, il faut faire la somme de la i ème valeur de l effectif étudié et de la (i 1) ème valeur de l effectif cumulé déjà calculée. Le résultat de la somme est affecté à la variable s. Le calcul est schématisé par la figure 14.3. +1 pl.cells(i-1).offset(0,+1) ligne i-1 ligne i 21 116 137 pl.cells(i).offset(0,+1)=s pl.cells(i) Figure 14.3 Le calcul du i ème effectif cumulé.

20 Introduction à la programmation avec VBA La somme s vaut donc : s = pl.cells(i).value + pl.cells(i - 1).Offset(0, 1).Value Cette valeur s est la valeur recherchée. Elle est affectée à la cellule désignée par pl.cells(i).offset(0, 1) car c est elle qui doit contenir la i ème valeur des effectifs cumulés. Le calcul ainsi défini est répété plusieurs fois, pour chacune des valeurs de i allant de 2 à nblig. Au sortir de la boucle, la variable s contient la somme des effectifs de la plage pl. 2. Calcul des fréquences relatives. Chaque valeur est le quotient de la i ème valeur de l effectif initial par la somme des effectifs s. Elle vaut donc pl.cells(i).value / s, et sa valeur est affectée à la i ème cellule de la deuxième colonne des résultats qui est définie par pl.cells(i).offset(0, 2). D où l affectation qu il faut exécuter nblig fois : pl.cells(i).offset(0, 2).Value = pl.cells(i).value / s 3. Calcul des fréquences relatives cumulées. Chaque valeur est le résultat de la division de la fréquence cumulée par la somme des effectifs. Elle vaut donc pl.cells(i).offset(0, 1).Value / s. Sa valeur est ensuite affectée à la i ème cellule de la troisième colonne des résultats. Le code suivant doit alors être exécuté nblig fois : pl.cells(i).offset(0, 3).Value = pl.cells(i).offset(0, 1).Value / s Chapitre 10 1. Formulaire de calcul Le formulaire est construit selon la maquette donnée par la figure 14.4. UF_3nbs Le premier nombre Le deuxième nombre Le troisième nombre TextBox1 TextBox2 TextBox3 CALCUL TextBox4 Btn_Calcul Figure 14.4 La maquette du formulaire. La variable UF_3nbs désigne l objet formulaire et cet objet est affiché par la procédure trois_nbs() dont voici le code (on peut aussi définir un bouton de commande).

Corrigés des exercices 21 Listing 14.23 : trois_nbs() Sub trois_nbs() UF_3nbs.Show Au bouton de commande Btn_Calcul du formulaire est associée la procédure Btn_Calcul_Click(). Celle-ci examine la valeur des trois nombres donnés par l utilisateur et détermine si l un d entre eux est égal ou non à la somme des deux autres. Voici le code de cette procédure. Listing 14.24 : Btn_Calcul_Click() Private Sub Btn_Calcul_Click() Dim x As Integer, y As Integer, z As Integer x = CInt(TextBox1.Text) y = CInt(TextBox2.Text) z = CInt(TextBox3.Text) If x = y + z Or y = x + z Or z = x + y Then TextBox4.Text = "Egalité" Else TextBox4.Text = "NON Egalité" End If 2. Nombre proche La plage B1:B10 donne la série des nombres à étudier. Le bouton de commande Btn_Calcul, intitulé «CALCUL», permet d afficher le formulaire UF_Nbproche lors de l exécution du code suivant : Private Sub Btn_Calcul_Click() UF_Nbproche.Show Lorsque l utilisateur clique sur le bouton du formulaire intitulé «Nombre Proche», la procédure associée recherche alors le nombre le plus proche parmi les dix nombres situés en B1:B10. La figure 14.5 donne un état de la feuille de calcul après le traitement. Figure 14.5 La feuille de calcul après le traitement.

22 Introduction à la programmation avec VBA Le bouton du formulaire intitulé «Nombre Proche» est désigné par la variable Btn_Proche, et la procédure associée a pour nom Btn_Proche_Click(). Son code est le suivant. Listing 14.25 : Btn_Proche_Click() Private Sub Btn_Proche_Click() Dim p As Range Dim i As Integer, x As Integer Dim diff As Integer, nb As Integer Set p = Range("B1:B10") x = CInt(TextBox1.Text) diff = Abs(x - p.cells(1).value) nb = p.cells(1).value For i = 2 To 10 If Abs(x - p.cells(i).value) < diff Then diff = Abs(x - p.cells(i).value) nb = p.cells(i).value End If TextBox2.Text = CStr(nb) 3. Agence de voyage Il s agit d ajouter un bouton de commande et un formulaire à l application présentée au paragraphe 3.2 du chapitre 10 afin de pouvoir modifier les informations données lors d une inscription (nombre de personnes et formule retenue). Le bouton, ajouté sur la feuille de calcul, est intitulé «MODIFICATION», et il est désigné par la variable Btn_Modif. Le formulaire associé est désigné par la variable UF_Modif. Il a la même structure que le formulaire UF_Inscription de l application comme l indique la figure 14.6. Figure 14.6 Le formulaire de modification.

Corrigés des exercices 23 L utilisateur saisit d abord les informations au sein du formulaire : le nom de la personne déjà inscrite (sans le modifier), puis le nombre de personnes et la formule retenue (Week-End, Semaine ou Promotion) qui sont modifiées par rapport à l enregistrement déjà effectué. Puis l utilisateur clique sur le bouton de commande intitulé «VALIDATION». Ce bouton est désigné par la variable Btn_OK_Modif. La procédure associée, appelée Btn_OK_Modif_Click(), est alors exécutée. En voici le code. Listing 14.26 : Btn_OK_Modif_Click() Private Sub Btn_OK_Modif_Click() Dim c As Range Dim nb As Integer, prix As Integer Dim choix As String Dim i As Integer '---(1) Recherche du nom --- i = 1 While Range("B3").Offset(i, 0).Value <> TextBox1.Text _ And Range("B3").Offset(i, 0).Value <> Empty i = i + 1 Wend '---(2) Enregistrement des modifs --- If Range("B3").Offset(i, 0) <> Empty Then Set c = Range("B3").Offset(i, 0) c.offset(0, 1).Value = TextBox2.Text nb = CInt(TextBox2.Text) choix = ComboBox1.Value c.offset(0, 2).Value = choix If choix = "Week-End" Then prix = nb * 100 If choix = "Semaine" Then prix = nb * 500 If choix = "Promotion" Then prix = nb * 150 c.offset(0, 3).Value = prix MsgBox "La modification de " & TextBox1.Text & " est enregistrée" Unload Me Else MsgBox "Erreur sur le nom de la personne" End If La procédure agit en deux temps : 1. Recherche du nom. Les noms des personnes déjà inscrites figurent au sein de la colonne B, à partir de la cellule B4. Le raisonnement à suivre est formulé avec une double condition. Tant que la i ème cellule de la colonne B contient un nom et que celui-ci n est pas le nom recherché, alors il faut examiner la cellule suivante de cette colonne. Mais dès que la valeur de la i ème cellule est le nom cherché, il convient d arrêter l étude des noms. Il faut aussi arrêter le processus lorsque la i ème cellule est vide et ne contient pas de nom. Lorsque la boucle While Wend termine son exécution, la variable i désigne la ligne qui contient le nom cherché, ou bien qui ne contient aucun nom.

24 Introduction à la programmation avec VBA 2. Enregistrement des modifications. Après avoir vérifié que la i ème cellule Range("B3").Offset(i, 0) n est pas vide (elle contient donc un nom), le programme affecte à la variable c l adresse de cette cellule, puis il réalise les mises à jour relatives au nom contenu par cette cellule. Chapitre 11 1. Dessin Le dessin à reproduire se présente comme à la figure 14.7. 2 1 Figure 14.7 La maquette du dessin. 3 4 J6: cellule de départ Il convient tout d abord de donner un format carré à chaque cellule concernée, en choisissant par exemple 12,5 comme hauteur des lignes et 2 comme largeur des colonnes. Il s agit ensuite de colorier les cellules en partant d une cellule donnée. Nous proposons de commencer à la cellule J6, positionnée à la ligne 6 et à la colonne 10. Voici le programme qui colorie quatre cellules dans chacun des quatre parcours (parcours numérotés 1, 2, 3 et 4 sur la figure). Listing 14.27 : dessin() Sub dessin() Dim i As Integer, j As Integer Dim k As Integer i = 6 j = 10 'cellule J6 For k = 1 To 4 'parcours 1 Cells(i, j).interior.colorindex = 4 i = i - 1 j = j - 1 Next k For k = 1 To 4 'parcours 2 Cells(i, j).interior.colorindex = 4 i = i + 1 j = j - 1 Next k For k = 1 To 4 'parcours 3 Cells(i, j).interior.colorindex = 4

Corrigés des exercices 25 i = i + 1 j = j + 1 Next k For k = 1 To 4 'parcours 4 Cells(i, j).interior.colorindex = 4 i = i - 1 j = j + 1 Next k 2. Frise n 1 La première frise est structurée par la répétition de six cellules qui sont organisées à partir de la cellule B3 comme l indique la figure 14.8. c.offset(-1,0) c.offset(-1,+1) c=cellule B3 =c.offset(0,0) c.offset(+1,0) c.offset(+1,+1) c.offset(0,+1) Figure 14.8 La frise n 1. Voici le programme qui permet de réaliser cette frise. Listing 14.28 : frise1() Sub frise1() Dim c As Range Dim j As Integer, k As Integer Set c = Range("B3") For k = 0 To 12 Step 2 c.offset(0, k).interior.colorindex = 6 'jaune c.offset(-1, k).interior.colorindex = 6 c.offset(-1, k + 1).Interior.ColorIndex = 6 c.offset(0, k + 1).Interior.ColorIndex = 3 'rouge c.offset(1, k).interior.colorindex = 3 c.offset(1, k + 1).Interior.ColorIndex = 3 Next k Le programme affecte à la variable c l adresse de la cellule B3. Puis il colorie les cellules en fonction de leur position par rapport à cette cellule : k vaut d abord 0 : le programme colorie les six premières cellules. La valeur suivante de k vaut 2 car le pas de l instruction itérative est de 2. Les cellules sont décalées de +2 vers la droite, et le même traitement est appliqué aux six cellules concernées.

26 Introduction à la programmation avec VBA Il en est de même pour les valeurs suivantes de k : 4, 6, 8, 10 et 12. L instruction itérative définie avec la variable k assure ainsi sept fois le coloriage des six cellules. 3. Frise n 2 Pour réaliser la seconde frise, il suffit de la découper en une succession de croix comme l indique la figure 14.9. Cellule de départ Ligne i 0 1 2 3 4 0 1 2 3 4 Colonne j Figure 14.9 La frise n 2. Chaque croix s inscrit dans un ensemble de 5 5 cellules où chaque cellule est repérée par son numéro de ligne i et son numéro de colonne j, i allant de 0 à 4 et j allant de 0 à 4. Les cellules sont coloriées lorsqu elles appartiennent à l une des deux diagonales : première diagonale lorsque i = j et deuxième diagonale lorsque i = 4 j. Voici le programme correspondant. Listing 14.29 : frise2() Sub frise2() Dim c As Range Dim i As Integer, j As Integer, k As Integer Set c = Range("B2") For k = 0 To 15 Step 5 For i = 0 To 4 For j = 0 To 4 If i = j Or i = 4 - j Then c.offset(i, j + k).interior.colorindex = 5 End If Next j Next k Le programme attribue à la variable c l adresse de la cellule B2 qui sert de cellule de référence. Puis le programme exécute trois boucles imbriquées (triple boucle) : Lorsque k = 0, le programme exécute une première fois la double boucle structurée par les valeurs de i et de j. Il colorie les cellules c.offset(i, j + k) c est-à-dire c.offset(i, j) lorsqu elles satisfont aux conditions sur i et j.

Corrigés des exercices 27 La valeur suivante de k vaut 5 puisque le pas de l instruction itérative est de 5. Le programme exécute alors une deuxième fois la double boucle définie par i et j. Les cellules c.offset(i, j + k), c est-à-dire c.offset(i, j + 5), sont situées à droite des précédentes cellules, avec un déplacement de +5. Elles sont coloriées lorsqu elles satisfont aux conditions sur les variables i et j. Puis le programme exécute à nouveau ce traitement pour k = 10 et pour k = 15. Au terme du processus, le programme a colorié quatre croix respectant les conditions imposées aux variables i et j. Chapitre 12 1. Calculs financiers Nous proposons que le calcul du montant de l emprunt soit structuré de la même façon que celui qui détermine la mensualité d un emprunt : il faut alors ajouter un troisième bouton de commande «EMPRUNT Montant?» sur la feuille F_menu comme cela est présenté sur la figure 14.10. Figure 14.10 La feuille F_menu. Le bouton de commande «EMPRUNT Montant?» est désigné par la variable Btn_Emprunt2. Voici le code de la procédure associée Btn_Emprunt2_Click(). Listing 14.30 : Btn_Emprunt2_Click() Private Sub Btn_Emprunt2_Click() Dim f_emprunt2 As Worksheet Set f_emprunt2 = Worksheets("F_montants_emprunt") f_emprunt2.activate Il faut ensuite définir une nouvelle feuille de calcul F_montants_emprunt organisée comme l indique la figure 14.11.

28 Introduction à la programmation avec VBA Figure 14.11 La feuille de calcul F_montants_emprunt. Au bouton de commande intitulé «CALCUL Montants» et désigné par la variable Btn_Calcul_Montants est associée la procédure Btn_Calcul_Montants_Click(), et au bouton intitulé «Quitter» est associée la procédure Btn_Quitter_Click(). Voici le texte de la première procédure. Listing 14.31 : Btn_Calcul_Montants_Click() Private Sub Btn_Calcul_Montants_Click() Dim m As Double, t As Double Dim taux As Double, mens As Double Dim n As Integer, nb As Integer, i As Integer, j As Integer Dim p As Range '---(1) Données et calcul du montant --- mens = Range("B3").Value t = Range("B4").Value n = Range("B5").Value m = (mens * (1 - (1 + (t / 12)) ^ -(n * 12))) / (t / 12) Range("B6").Value = Round(m, 2) '---(2) Mise en place du tableau --- Set p = Range("B8:G13") p.cells(1, 1).Value = Round(m, 2) taux = Range("B4").Value - 0.01 nb = Range("B5").Value - 2 For i = 2 To 6 'valeurs des durées p.cells(i, 1).Value = nb nb = nb + 1 For j = 2 To 6 'valeurs des taux p.cells(1, j).value = taux taux = taux + 0.005 Next j '---(3) Calcul des montants --- For i = 2 To 6 For j = 2 To 6 n = p.cells(i, 1).Value t = p.cells(1, j).value m = (mens * (1 - (1 + (t / 12)) ^ -(n * 12))) / (t / 12) p.cells(i, j).value = Round(m, 2) Next j

Corrigés des exercices 29 La procédure effectue plusieurs calculs : 1. Données et calcul du montant. Elle calcule tout d abord la valeur du montant à partir des données fournies par l utilisateur au sein des cellules B3, B4 et B5. Le calcul du montant m est fait en utilisant les variables mens (mensualité), t (taux d intérêt en valeur décimale) et n (durée en années de l emprunt) au sein de l affectation suivante : m = (mens * (1 - (1 + (t / 12)) ^ -(n * 12))) / (t / 12) Cette formulation est la transcription informatique de la formule financière qui définit la valeur du montant de l emprunt : M = (Me / T) (1 (1 + T) N ), Me étant la mensualité, T le taux d intérêt mensuel et N le nombre de mois de la durée de l emprunt. 2. Mise en place du tableau. La procédure met en place le tableau B8:G13 désigné par la plage p. Sur la première colonne (B9:B13), elle met les valeurs des durées qui vont être utilisées. Sur la première ligne (cellules C8:G8), elle met les valeurs des différents taux qui encadrent le taux d intérêt déjà utilisé pour le calcul précédent. 3. Calcul des montants. La procédure calcule ensuite les valeurs des montants en appliquant pour chaque couple de valeur (taux, durée) la formule financière. Toutes ces valeurs se mettent en place dès que l utilisateur a donné les valeurs demandées, puis cliqué sur le bouton «CALCUL Montants». 2. Gestion de prêts Il s agit de compléter l application «Gestion de prêts» en la dotant d un service supplémentaire INFORMATIONS. Celui-ci doit permettre de donner des informations sur l état des prêts. Un bouton de commande intitulé «INFORMATIONS» est ajouté à la feuille F_menu comme l indique la figure 14.12. Figure 14.12 La feuille F_menu.

30 Introduction à la programmation avec VBA Au bouton «INFORMATIONS» est associée la procédure suivante : Listing 14.32 : Btn_Infos_Click() Private Sub Btn_Infos_Click() UF_Infos.Show Voici le formulaire que nous proposons d ajouter au sein de l application. Il est donné par la figure 14.13. Figure 14.13 Le formulaire UF_infos. Ce formulaire désigné par la variable UF_Infos contient deux boutons de commande. Le premier, intitulé «CALCUL», est défini par la variable Btn_Nbpers. La procédure associée Btn_Nbpers_Click() est conçue pour effectuer les calculs demandés. Le second bouton est intitulé «Quitter» et permet d effacer le formulaire de l écran sans conserver d information. Le formulaire contient aussi six zones de texte définies par les variables TextBox1, TextBox2,, TextBox6. Celles-ci vont recevoir les informations calculées par la procédure Btn_Nbpers_Click(). Pour calculer le nombre de personnes ayant empruntés 0 document, 1 document, 2 documents,, 5 documents, cette procédure doit consulter le nombre de documents empruntés par chaque personne inscrite. Comment trouver cette information? L application est munie de plusieurs variables globales dont la variable ci. Celle-ci désigne la première cellule de la liste des noms de personnes du classeur Inscrits. La variable ci.offset(i, 0) désigne donc la i ème personne et ci.offset(i, 3).Value donne alors le nombre de documents empruntés par cette personne. Le texte du programme est alors le suivant.

Corrigés des exercices 31 Listing 14.33 : Btn_Nbpers_Click() Private Sub Btn_Nbpers_Click() Dim i As Integer Dim nb0 As Integer, nb1 As Integer, nb2 As Integer Dim nb3 As Integer, nb4 As Integer, nb5 As Integer '---(1) Initialisations --- init i = 0 nb0 = 0: nb1 = 0: nb2 = 0: nb3 = 0: nb4 = 0: nb5 = 0 '---(2) Calculs --- While ci.offset(i, 0).Value <> Empty If ci.offset(i, 3).Value = 0 Then nb0 = nb0 + 1 ElseIf ci.offset(i, 3).Value = 1 Then nb1 = nb1 + 1 ElseIf ci.offset(i, 3).Value = 2 Then nb2 = nb2 + 1 ElseIf ci.offset(i, 3).Value = 3 Then nb3 = nb3 + 1 ElseIf ci.offset(i, 3).Value = 4 Then nb4 = nb4 + 1 Else nb5 = nb5 + 1 End If i = i + 1 Wend '---(3) Affichage des résultats --- TextBox1.Text = CStr(nb0) TextBox2.Text = CStr(nb1) TextBox3.Text = CStr(nb2) TextBox4.Text = CStr(nb3) TextBox5.Text = CStr(nb4) TextBox6.Text = CStr(nb5) La procédure agit en trois temps : 1. Initialisation. L appel à la procédure init() permet de créer et d initialiser toutes les variables globales dont la variable ci. Puis les variables i, nb0, nb1,, nb5 sont initialisées à 0 (les «:» ajoutés sur la ligne permettent de mettre plusieurs instructions sur cette ligne). 2. Calculs. Tant que la i ème cellule contient un nom, la procédure examine la valeur de ci.offset(i, 3) et met à jour le nombre de documents empruntés selon les résultats aux tests. 3. Affichage des résultats. Les valeurs de nb0, nb1,, nb5 étant calculées, elles sont affichées sous forme de chaînes de caractères au sein des six zones de texte du formulaire.

32 Introduction à la programmation avec VBA Chapitre 13 1. Comparaison de trois suites récurrentes Soit trois fonctions qui permettent de calculer la racine d ordre 5 d un nombre a, c est-à-dire a 1/5 : Fonction n 1 : f(x) = (2 x + a / (x ^ 4)) / 3 Fonction n 2 : f(x) = (3 x + a / (x ^ 4)) / 4 Fonction n 3 : f(x) = (4 x + a / (x ^ 4)) / 5 Ces trois fonctions définissent une limite L qui vaut a 1/5. Leurs coefficients de convergence valent respectivement 2/3, ¼ et 0, indiquant ainsi que la fonction n 3 est celle dont la vitesse de convergence vers le résultat est la plus grande. Voici le texte du programme formulé avec la variable U pour la fonction n 1, la variable V pour la fonction n 2 et la variable W pour la fonction n 3. Listing 13.34 : suite_rac5() Sub suite_rac5() Dim i As Integer Dim U As Double, V As Double, W As Double, a As Double Dim c As Range Set c = Range("B1") a = InputBox("valeur de a :") U = InputBox("valeur initiale de U :") V = U W = U For i = 0 To 99 U = (2 * U + (a / (U ^ 4))) / 3 V = (3 * V + (a / (V ^ 4))) / 4 W = (4 * W + (a / (W ^ 4))) / 5 c.offset(i, 0).Value = U 'affichage colonne B c.offset(i, 1).Value = V 'affichage colonne C c.offset(i, 2).Value = W 'affichage colonne D Si l on donne à la variable a la valeur 243 qui vaut en fait 3 5 (3 à la puissance 5), on vérifie ainsi à quelle vitesse on obtient la valeur 3 comme résultat. Lorsque l on donne 3,2 comme valeur initiale et que l on affiche les résultats avec 15 décimales, on obtient cette valeur 3 à la soixante-dix-septième itération avec la fonction n 1, à la vingt-deuxième itération avec la fonction n 2 et à la quatrième itération avec la dernière fonction. C est bien cette fonction qui permet d obtenir le programme le plus performant.