Blog ENI : Toute la veille numérique !
🎃 Jusqu'à -30% sur les livres en ligne, vidéos et e-formations.
Code : GHOST30.
Cliquez ici !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. Macros et langage VBA
  3. Corrections des exercices
Extrait - Macros et langage VBA  Découvrez la programmation sous Excel (2e édition)
Extraits du livre
Macros et langage VBA Découvrez la programmation sous Excel (2e édition)
7 avis
Revenir à la page d'achat du livre

Corrections des exercices

Corrections des exercices

Dans ce chapitre, vous retrouvez les corrections des exercices qui vous ont été proposés dans cet ouvrage.

Chaque exercice est repris et commenté pour vous permettre de mieux comprendre les instructions et approches.

Vous pouvez également télécharger le fichier Exercices_corriges qui contient le code de chaque exercice depuis l’onglet Compléments.

Communiquer avec l’utilisateur

Exercice 1 : Fonction MsgBox

 Réalisez un clic droit dans l’Explorateur de projets puis choisissez Insertion - Module.

 Sélectionnez le module créé Module1 puis dans la fenêtre Propriétés modifiez sa propriété Name à Chapitre_05_MsgBox_InputBox.

'Fonction MsgBox 
Option Explicit 
'Fonction MsgBox 
'A-Bonjour le monde 
'A l 'intérieur d'une structure 
Public Sub BonjourLeMonde() 
    'Écrivez une instruction qui va afficher à l'utilisateur 
dans une boîte de dialogue le texte simple "Bonjour le monde". 
    MsgBox "Bonjour le monde" 
End Sub 
  
  
'B-Jeu de boutons 
'A l 'intérieur d'une structure 
Public Sub JeuDeBoutons() 
    'Écrivez une instruction qui va afficher à l'utilisateur 
dans une boîte de dialogue le texte 
    '" Prêt pour la guerre des boutons ? ", 
    'et proposer les boutons Oui et Non. 
    MsgBox "Prêt pour la guerre des boutons ?", vbYesNo 
End Sub ...

Les variables, les constantes

Exercice 1 : Déclarations simples de variables

Private Sub DeclarationsSimples() 
  'A-Déclarez une variable pouvant accueillir un nom de projet qui 
s'appellera NomProjet. 
     Dim NomProjet As String 
    'B-Déclarez une variable qui accepte des valeurs entières et qui 
s'appellera NumeroDevis. 
    Dim NumeroDevis As Integer 
    'C-Déclarez une variable qui pourra contenir Vrai ou Faux, que 
vous nommerez Prioritaire. 
    Dim Prioritaire As Boolean 
    'D-Déclarez une constante qui contiendra le 1er janvier 1950, que 
vous nommerez DATE_LIMITE. 
    Const DATE_LIMITE As Date = #1/1/1950# 
    'E-Déclarez une variable pouvant stocker la valeur 3.14 
(3 solutions possibles), que vous appellerez Pi 
    Dim Pi1 As Single 
    Dim Pi2 As Double 
    Dim Pi3 As Currency 
End Sub 

Exercice 2 : Déclarations multiples de variables

Private Sub DeclarationsMultiples() 
    'A-Déclarez deux variables de type date, que vous nommerez 
DtDevis et DtFacture, sur une seule ligne 
    Dim DtDevis As Date, DtFacture As Date ...

Les procédures, les fonctions, les macros

Exercice 1 : Écriture de macros

'Instructions liées aux fonctions liées aux variables de portée 
publique  
'Créez une variable de type Date, nommée DatePartagee, de portée 
publique.  
'Cette déclaration de variable sera placée en haut du module.  
Public DatePartagee As Date  
   
'Exercice 1  
'A - Macro privée  
'Écrivez une macro MacroPrivee, de portée privée.  
Private Sub MacroPrivee()  
    'Cette macro affichera à l'utilisateur la valeur 42.  
    MsgBox 42  
End Sub  
   
'B-Macro publique  
'Écrivez une macro MacroPublique, de portée publique  
Public Sub MacroPublique()  
    'Cette macro fera appel à la macro MacroPrivee créée précédemment. ...

Les conditions

Exercice 1 : Si Alors

'Si Alors 
'Écrivez une procédure AfficheSiNegatif, de portée publique, 
nécessitant un paramètre numérique entier, nommé ValeurDuDeclencheur. 
Public Sub AfficheSiNegatif(ValeurDuDeclencheur As Integer) 
    'Cette procédure devra afficher OK si la valeur de la variable 
ValeurDuDeclencheur est strictement inférieure à 0. 
    If ValeurDuDeclencheur < 0 Then 
        MsgBox "OK" 
    End If 
End Sub 
'Créez une macro SiAlors. 
Public Sub SiAlors() 
    'Cette macro appellera dans un premier temps AfficheSiNegatif 
en lui passant la valeur 35 
    AfficheSiNegatif 35 'rien 
    'puis dans un second temps AfficheSiNegatif en lui passant 
la valeur -5. 
    AfficheSiNegatif -5 'OK 
End Sub 

Exercice 2 : Si Sinon

'Si Sinon 
'Écrivez une fonction RetourneDoubleOuMoitie, de portée privée. 
'Elle prendra en paramètre d'entrée une valeur numérique entière 
inférieure à 255, nommée ValeurEntree, 
'et retourera une valeur possiblement décimale. 
Private Function RetourneDoubleOuMoitie(ValeurEntree As Byte) 
As Single 'Double est aussi accepté ici 
    'Cette fonction retournera le double de la valeur Entree, 
si celle-ci est supérieure à 128, 
    If ValeurEntree > 128 Then 
        RetourneDoubleOuMoitie = ValeurEntree * 2 
    Else 
    'ou la moitié de la valeur ValeurEntree, sinon. 
    RetourneDoubleOuMoitie = ValeurEntree / 2 
    End If 
End Function 
'Créez une macro SiSinon. 
Private Sub SiSinon() 
    'Cette macro affichera successivement la valeur retournée 
par RetourneDoubleOuMoitie, 
    'en...

Les boucles

Exercice 1 : Boucles For Next

'Boucles For Next 
'A-À pas de 1 
'Créez une macro AfficherDe15a20. 
Public Sub AfficherDe15a20() 
    'Cette macro devra afficher les valeurs allant de 15 à 20. 
    Dim i As Integer 
    For i = 15 To 20 
        MsgBox i 
    Next i 
End Sub 
  
'B-À pas de 2 
'Créez une macro AfficherDe10a20. 
Public Sub AfficherDe10a20() 
    'Cette macro devra afficher les valeurs allant de 10 à 20, 
en allant de 2 en 2. 
    Dim i As Integer 
    For i = 10 To 20 Step 2 
        MsgBox i 
    Next i 
End Sub 
  
'C-À Pas décroissant 
'Créez une macro Afficher40a20PasDeMoins5. 
Public Sub Afficher40a20PasDeMoins5() 
    'Cette macro devra afficher les valeurs allant de 40 à 20, 
avec un pas de 5. 
    Dim i As Integer 
    For i = 40 To 20 Step -5 
        MsgBox i 
    Next i 
End Sub 
  ...

Les opérateurs

Exercice 1 : Opérateurs arithmétiques

'Opérateurs arithmétiques 
'A-Opérations de base 
'Écrivez une fonction Addition, de portée publique, de type 
numérique entier. 
'Cette fonction prend 2 paramètres de type numérique entier, 
nommés A et B. 
Public Function Addition(A As Integer, B As Integer) As Integer 
    'La fonction retourne la somme des valeurs A et B. 
    Addition = A + B 
End Function 
  
'Écrivez ensuite une fonction Soustraction, de portée publique, de 
type numérique entier. 
'Cette fonction prend 2 paramètres de type numérique entier, 
nommés A et B. 
Public Function Soustraction(A As Integer, B As Integer) As Integer 
    'La fonction retourne la différence entre les valeurs A et B. 
    Soustraction = A - B 
End Function 
  
'Créez une macro AfficherAdditionPuisSoustration. 
Public Sub AfficherAdditionPuisSoustraction() 
    'Dans cette macro déclarez deux variables de type numérique 
entier, nommées valeur1 et valeur2 
    Dim valeur1 As Integer, valeur2 As Integer 
    'affectez à ces variables les valeurs respectives 10 et 12. 
    valeur1 = 10: valeur2 = 12 
    'La macro devra ensuite afficher le résultat renvoyé par 
la fonction Addition, en lui passant les valeurs valeur1 et valeur2. 
    MsgBox Addition(valeur1, valeur2) '22 
    'La macro devra également afficher le résultat renvoyé par la 
fonction Soustraction, en lui passant les valeurs valeur1 et valeur2. 
    MsgBox Soustraction(valeur1, valeur2) '-2 
End Sub 
  
  
'B-Division euclidienne 
'Écrivez une procédure Decomposition, de portée publique. 
'Cette procédure prend en paramètres deux valeurs numériques 
entières, nommées Valeur et Diviseur. 
Public Sub Decomposition(Valeur As Integer, Diviseur As Integer) 
    'La procédure affichera le résultat de la division entière 
de Valeur par Diviseur...

Les chaînes de caractères

Exercice 1 : Concaténation de chaînes

Option Explicit 
'Concaténation de chaînes 
'A-Symbole au choix 
'Écrivez une fonction, nommée Concatenation, de portée publique. 
'Cette fonction prend en paramètres deux chaînes de caractères, 
nommées ChaineA et ChaineB. 
Public Function Concatenation(ChaineA As String, ChaineB As String) 
As String 
'Cette fonction retournera une chaîne de caractère contenant 
ChaineA et ChaineB séparées par le caractère espace " ". 
Concatenation = ChaineA & " " & ChaineB 
'fonctionne également 
'Concatenation = ChaineA + " " + ChaineB 
End Function 
  
'Créez une macro AfficherConcatenation. 
Public Sub AfficherConcatenation() 
    'Cette macro affichera le retour de la fonction Concatenation, 
en lui passant les valeurs "Bonjour" et "bienvenue". 
    MsgBox Concatenation("Bonjour", "bienvenue") 
End Sub 
  
  
'B-Un seul symbole possible 
'Écrivez une fonction, nommée ConcatenationNombres, de portée 
publique. 
'Cette fonction prend en paramètres deux valeurs numériques 
entières, nommées NombreA et NombreB. 
Public Function ConcatenationNombres(NombreA As Integer, NombreB 
As Integer) 
    'Cette fonction retournera une chaîne de caractère contenant 
NombreA et NombreB sans caractère de séparation. 
    ConcatenationNombres = NombreA & NombreB 
    'attention NombreA + NombreB ne fonctionne pas 
End Function 
  
  
'Créez une macro AfficherConcatenationNombres. 
Public Sub AfficherConcatenationNombres() 
    'Cette macro affichera le retour de la fonction 
ConcatenationNombres, en lui passant les valeurs 20 et 5. 
    MsgBox ConcatenationNombres(20, 5) 
End Sub  

Exercice 2 : Portions de chaînes

'Portions de chaînes 
'A-Plus court ou plus long 
'Écrivez une fonction PlusLongQue, de portée publique, qui retourne 
une valeur booléenne....

Les dates et les heures

Exercice 1 : Afficher la date et l’heure système

Option Explicit 
'Afficher la date et heure système 
'A-Heure du système 
'Créez une macro AfficherMaintenant. 
Public Sub AfficherMaintenant() 
    'Cette macro affichera à l'utilisateur la date et l'heure 
du système. 
    MsgBox Now 
End Sub 
  
'B-Date du jour 
'Créez une macro AfficheDateDuJour. 
Public Sub AfficherDateDuJour() 
    'Cette macro affichera à l'utilisateur la date du jour. 
    MsgBox Date 
End Sub 

Exercice 2 : Créer une date et une heure

'Créer une date et une heure 
'A-Utilisation de DateSerial 
'Écrivez une fonction PremierDeLAn, de portée publique, 
'qui retourne une date. 
'Cette fonction prend en paramètre une valeur numérique entière 
iAnnee. 
Public Function PremierDeLAn(iAnnee As Integer) As Date 
    'Cette fonction doit retourner le 1er janvier de l'année iAnnee 
fournie en paramètre. 
    PremierDeLAn = DateSerial(iAnnee, 1, 1) 
End Function 
  
'Créez une macro AfficherPremierDeLAn. 
Public Sub AfficherPremierDeLAn() 
    'Cette macro affichera le retour de la fonction PremierDeLAn, 
à laquelle elle passe l'année 2023. 
    MsgBox PremierDeLAn(2023) 
End Sub 
  
'B-Utilisation de TimeSerial 
'Créez une fonction MoinsLeQuart, de portée publique, qui retourne 
'une date. 
'Cette fonction prend en paramètre une valeur numérique entière, 
'comprise entre 0 et 23, nommée iHeure. 
Public Function MoinsLeQuart(iHeure As Integer) As Date 
    'Cette fonction doit retourner l'heure fournie en paramètre, 
moins 15 minutes. 
    'solution 1, vous effectuez le calcul des 15 minutes en dehors 
du TimeSerial 
    MoinsLeQuart = TimeSerial(iHeure + 24, 0, 0) - (15 / 24) / 60 
    'solution 2, vous effectuez le calcul des 15 minutes directement 
dans le TimeSerial 
    MoinsLeQuart = TimeSerial(iHeure + 24, -15, 0) ...

Les cellules

Exercice 1 : Valeur dans une cellule

Option Explicit 
  
'Valeur dans une cellule 
'A-Avec activation 
  
'Créez une macro ActiverCelluleA1PuisBonjourDansCelluleActive. 
Public Sub ActiverCelluleA1PuisBonjourDansCelluleActive() 
    'Cette macro activera la cellule A1, puis mettra dans la 
cellule active la valeur "Bonjour". 
    Range("A1").Activate 
    ActiveCell.Value = "Bonjour" 
End Sub 
  
'B-Sans activation 
'Créez une macro EcrireDansCelluleA2. 
Public Sub EcrireDansCelluleA2() 
    'Cette macro écrira directement dans la cellule A2 la valeur 
"Manipulation OK", sans activer au préalable la cellule A2. 
    Range("A2").Value = "Manipulation OK" 
End Sub  

Exercice 2 : Un peu de couleurs

'Un peu de couleurs 
'Créez une macro ColorierCelluleEnJaune. 
Public Sub ColorierCelluleEnJaune() 
    'Cette macro demandera à l'utilisateur de rentrer une adresse 
de cellule (vous ferez en sorte que l'adresse soit valide). 
    Dim strCellule As String 
    strCellule = InputBox("Veuillez saisir l'adresse de la cellule")...

Les feuilles

Exercice 1 : Feuille active

'Feuille active 
'Créez une macro AfficherNomFeuilleActive. 
Public Sub AfficherNomFeuilleActive() 
    'Cette macro affichera le nom de la feuille active. 
    MsgBox ActiveSheet.Name 
End Sub  

Exercice 2 : Copie d’une feuille à l’autre

'Copie d'une feuille à l'autre 
'Créez une macro CreerRemplirEtNommerFeuille. 
Public Sub CreerRemplirEtNommerFeuille() 
    'Dans cette macro vous commencerez donc par déclarer une 
variable de type feuille (Worksheets), que vous nommerez wsh. 
    Dim wsh As Worksheet 
    'La macro ajoutera une nouvelle feuille, et utilisera 
la variable wsh pour pointer sur cette nouvelle feuille. 
    Set wsh = Worksheets.Add 
    'Vous nommerez cette nouvelle feuille Feuille_Temporaire. 
    wsh.Name = "Feuille_Temporaire" 'attention, si une feuille 
se nomme déjà Feuille_Temporaire l'instruction échouera 
    'La macro effectuera ensuite une copie des cellules de ...

Les classeurs

Exercice 1 : Utiliser ThisWorkbook

Option Explicit 
  
'Utiliser ThisWorkbook 
'A-Emplacement du classeur 
'Créez une macro AfficherEmplacementClasseur. 
Public Sub AfficherEmplacementClasseur() 
    'Cette macro affichera l'emplacement du classeur. 
    MsgBox ThisWorkbook.Path 
End Sub 
  
  
'B-Nom de la feuille active 
'Créez une macro AfficherNomFeuilleActiveDansClasseur. 
Public Sub AfficherNomFeuilleActiveDansClasseur() 
    'Cette macro affichera le nom de la feuille active du classeur. 
    MsgBox ThisWorkbook.ActiveSheet.Name 
End Sub  

Exercice 2 : Créer, enregistrer et fermer un classeur

'Créer enregistrer et fermer un classeur 
'A-Création d'un nouveau classeur 
'Créez une macro CreerClasseurEtAfficherNombreFeuilles. 
Public Sub CreerClasseurEtAfficherNombreFeuilles() 
    'Cette macro devra créer un nouveau classeur, puis afficher 
à l'écran le nombre de feuilles de ce classeur nouvellement créé....

L’application Excel

Exercice 1 : Lancer une nouvelle application Excel

Option Explicit 
'Lancement d'une nouvelle application Excel 
'Créez une macro LancerNouvelleApplicationExcel. 
Public Sub LancerNouvelleApplicationExcel() 
    'Cette macro devra déclarer une variable de type 
Excel.Application et ouvrir une nouvelle application. 
    Dim xlApp As Excel.Application 
    Set xlApp = New Excel.Application 
    xlApp.Visible = True 
End Sub  

Exercice 2 : Obtenir les objets actifs

'Obtenir les objets actifs 
'Créez une macro AfficherNomsObjectsActifs. 
Public Sub AfficherNomsObjectsActifs() 
    'Cette macro affichera le nom du classeur actif, puis le nom 
de la feuille active et enfin la valeur de la cellule active. 
    MsgBox Application.ActiveWorkbook.Name 
    MsgBox Application.ActiveSheet.Name 
    MsgBox Application.ActiveCell.Value 
End Sub 

Exercice 3 : Parcourir quelques...

Les formules

Exercice 1 : Écriture de formules en français

Option Explicit 
'Écriture de formules en français 
'A-Nombre total d'éléments 
'Créez une macro FormuleSommeQuantites. 
Public Sub FormuleSommeQuantites() 
    'Cette macro écrira dans la cellule B7 une formule SOMME 
des quantités. 
    'Vous devrez utiliser la formule en français (FormulaLocal). 
    Worksheets("Exercices_ManipulationFormules").Range("B7") 
.FormulaLocal = "=SOMME(B2:B6)" 
End Sub 
  
  
'B-Quantité maximale 
'Créez une macro FormuleMaximumQuantites. 
Public Sub FormuleMaximumQuantites() 
    'Cette macro écrira dans la cellule B8 une formule MAX 
des quantités. 
    'Vous utiliserez de nouveau la formule en français (FormulaLocal). 
    Worksheets("Exercices_ManipulationFormules").Range("B8") 
.FormulaLocal = "=MAX(B2:B6)" 
End Sub 

Exercice 2 : Écriture de formules...

Les graphiques

Exercice 1 : Création simple de graphique

Option Explicit 
'Création simple de graphique 
'A-Chiffre d'affaires mensuel 
'Créez une macro GraphiqueChiffreAffaires. 
Public Sub GraphiqueChiffreAffaires() 
    'Cette macro devra créer un nouveau graphique, de type Courbe, 
    Dim cht As Chart 
    Set cht = Charts.Add() 
    cht.ChartType = xlLine 
    'en se basant sur les données situées dans la plage 
de cellules A1:B5. 
    cht.SetSourceData Worksheets("Exercices_ManipulationGraphes") 
.Range("A1:B5") 
    'Le titre du graphique sera Chiffre d'affaires mensuel, 
ne contiendra pas de légende. 
    cht.HasTitle = True 
    cht.ChartTitle.Caption = "Chiffre d'affaires mensuel" 
    cht.HasLegend = False 
End Sub 
  
'B-Répartition du chiffre par produit 
'Créez une macro GraphiqueRepartitionParProduit. 
Public Sub GraphiqueRepartitionParProduit() 
    'Cette macro devra créer un nouveau graphique, de type Secteurs, 
    Dim cht As Chart 
    Set cht = Charts.Add() 
    cht.ChartType = xlPie 
    'en se basant sur les données situées dans la plage 
de cellules D1:E5. 
    cht.SetSourceData Worksheets("Exercices_ManipulationGraphes") 
.Range("D1:E5")...

Les formulaires utilisateurs

Exercice 1 : Formulaire élémentaire

 Cliquez sur le menu Insertion - UserForm.

 Dans le volet Propriétés du formulaire, changez la propriété Name à UsfExercice1.

 Dans la Boîte à outils sélectionnez l’outil Zone de texte puis tracez-la dans le formulaire.

 Dans la Boîte à outils, sélectionnez l’outil Bouton de commande puis tracez-le dans le formulaire.

 Modifiez sa propriété Caption à Cliquez-moi.

 Double cliquez sur le bouton de commande pour accéder au code associé :

Option Explicit 
'Créez un formulaire nommé UsfExercice1. 
'Lorsque l 'utilisateur cliquera sur le bouton, 
'vous afficherez dans une boîte de dialogue MsgBox le texte 
contenu dans la zone de texte. 
  
Private Sub CommandButton1_Click() 
    MsgBox Me.TextBox1.Value 
End Sub  

 Testez votre formulaire : menu Exécution - Exécuter Sub/UserForm.

Exercice 2 : Aller un peu plus loin

 Cliquez sur le menu Insertion - UserForm.

 Dans le volet Propriétés du formulaire, changez la propriété Name à...

Gestion des erreurs et débogage

Exercice 1 : Renforcer vos précédents exercices

Option Explicit 
'Renforcez vos précédents exercices 
'Dans un souci de rendre plus robustes vos exercices des précédents 
chapitres, voici quelques pistes pour vous. 
'Chapitre 5 MsgBox InputBox - Exercice BoiteElementaire : 
'Assurez-vous que l'utilisateur ne saisit pas une valeur 
numérique ni une date. 
Public Sub Blindage_BoiteElementaire() 
    Dim Valeur 
    Valeur = Application.InputBox("Bonjour, quel est votre nom ?") 
    If Not IsNumeric(Valeur) And Not IsDate(Valeur) Then 
        MsgBox Valeur 
    Else 
        MsgBox "Vous avez saisi une valeur numérique ou une date", 
vbOKOnly + vbCritical 
    End If 
End Sub 
  
'Chapitre 11 Chaînes de caractères Exercice TitreEtDate : 
'Assurez-vous que les caractères passés en paramètres ...