Séance 1
🟩 Fiche 1 —
[Option Explicit — déclaration obligatoire des variables]
1- Objectif et usage
– Forcer la déclaration de toutes les variables pour prévenir les fautes de frappe et conversions implicites hasardeuses.
– Standardiser la discipline de code dès la Séance 1.
2- Syntaxe essentielle (à placer en tout début de module)
Option Explicit
3- Règles et hypothèses
– S’applique au module entier où il est écrit.
– Rend obligatoire Dim/Private/Public/Static pour chaque variable.
– Toute variable non déclarée déclenche une erreur de compilation.
– VBA est insensible à la casse mais conserve la dernière casse rencontrée (utile pour repérer typos).
4- Bonnes pratiques & pièges
– Activer « Require Variable Declaration » dans l’éditeur pour l’insérer automatiquement.
– Déclarer d’abord, initialiser ensuite ; regrouper les déclarations en tête de procédure.
– Éviter les noms ambigus (x, y) en dehors d’exemples très courts ; préférer des noms métier.
🟩 Fiche 2 —
[Sub + MsgBox (usage simple d’affichage)]
1- Objectif et usage
– Créer une procédure Sub qui effectue une action sans valeur de retour.
– Afficher rapidement un message via MsgBox.
2- Syntaxe essentielle
Sub hello_world()
MsgBox “Hello world!”
End Sub
3- Règles et hypothèses
– Sub n’a pas de valeur retournée ; c’est une procédure.
– MsgBox peut être utilisée comme procédure d’affichage (nous verrons plus loin l’usage fonctionnel).
4- Bonnes pratiques & pièges
– Nommer clairement les Subs (verbe + complément).
– Garder les Subs courtes et ciblées ; déléguer à d’autres Subs/Functions au besoin.
🟩 Fiche 3 —
[Expression arithmétique directe dans MsgBox]
1- Objectif et usage
– Evaluer une expression sans variable intermédiaire puis l’afficher.
2- Exemple (calcul ponctuel)
Sub calcul1()
MsgBox 5.7 * 2.4
End Sub
3- Règles et hypothèses
– Les opérateurs arithmétiques + - * / ^ sont évalués avant l’affichage.
– Adapté aux tests rapides non réutilisables.
4- Bonnes pratiques & pièges
– Préférer une variable quand : réutilisation, débogage ou lisibilité nécessaires.
– Éviter les expressions longues directement dans MsgBox.
🟩 Fiche 4 —
[Déclaration et assignation de variables (Double)]
1- Objectif et usage
– Déclarer avec Dim et assigner avec = pour stocker et réutiliser un résultat.
– Introduire le type Double (précision usuelle en finance/sciences).
2- Exemples
Sub calcul2()
Dim x As Double
x = 5.7 * 2.4
MsgBox x
End Sub
Sub hec1()
Dim Y As Double
Y = 300 / 200
MsgBox Y
End Sub
3- Règles et hypothèses
– Double ≈ 15 chiffres significatifs.
– L’assignation = remplace la valeur courante.
– VBA n’est pas sensible à la casse pour l’exécution, mais reflète la casse la plus récente (utile pour détecter des typos sous Option Explicit).
4- Bonnes pratiques & pièges
– Toujours Option Explicit.
– Noms explicites (montant, resultat) > x, y sauf cas pédagogiques.
🟩 Fiche 5 —
[Types numériques : Single vs Double (précision)]
1- Objectif et usage
– Comprendre l’impact du type sur la précision et l’affichage.
2- Exemple (troncation observable)
Sub calcul3()
Dim x As Single
x = 5.77890257234 * 2.46798568234524
MsgBox x
End Sub
3- Règles et hypothèses
– Single ≈ 7 chiffres significatifs → arrondis/tronquations visibles.
– Double ≈ 15 chiffres significatifs → plus précis, léger coût mémoire/CPU en plus.
4- Bonnes pratiques & pièges
– Par défaut, préférer Double (finance, stats, ingénierie).
– N’utiliser Single que si la contrainte mémoire/performances le justifie et que la perte de précision est acceptable.
🟩 Fiche 6 —
[Décomposer un calcul en variables intermédiaires]
1- Objectif et usage
– Clarifier les étapes d’un calcul, faciliter le débogage et les modifications.
2- Exemple
Sub calcul4()
Dim x As Double
Dim y As Double
Dim z As Double
y = 5.7
z = 2.4
x = y * z
MsgBox x
End Sub
3- Règles et hypothèses
– Les variables intermédiaires rendent les dépendances explicites.
– Changer une constante (ex. z) ne casse pas l’expression finale.
4- Bonnes pratiques & pièges
– Isoler les constantes → plus facile à maintenir.
– Grouper les Dim en tête de procédure ; initialiser avant usage.
🟩 Fiche 7 —
[Dépassement de capacité : Integer]
1- Objectif et usage
– Visualiser la plage d’Integer et l’erreur en cas de dépassement.
2- Exemple
Sub plage1()
Dim x As Integer
x = 33000 ‘ Dépasse 32767
MsgBox x
End Sub
3- Règles et hypothèses
– Integer : de -32768 à 32767.
– Hors plage → Overflow (erreur d’exécution).
4- Bonnes pratiques & pièges
– Éviter Integer pour compteurs/identifiants → préférer Long.
– Si données externes, valider les bornes avant affectation.
🟩 Fiche 8 —
[Dépassement, littéraux et suffixes : Long & #]
1- Objectif et usage
– Comprendre la plage de Long et le rôle des suffixes sur les littéraux numériques.
2- Exemple
Sub plage2()
Dim x As Long
x = 3000000000# ‘ 3 000 000 000 en Double (suffixe #)
MsgBox x
End Sub
3- Règles et hypothèses
– Long : de -2 147 483 648 à 2 147 483 647.
– 3000000000 dépasse la plage de Long → Overflow.
– Suffixes utiles :
— % = Integer
— & = Long
— ! = Single
— # = Double
— @ = Currency
4- Bonnes pratiques & pièges
– Ne pas se fier à la présence d’un point décimal pour le type : utiliser les suffixes si nécessaire.
– Pour des grands entiers exacts (montants financiers) : Currency offre 4 décimales fixes (attention : ce n’est pas un “grand entier arbitraire”).
🟩 Fiche 9 —
[Function qui retourne une valeur : mc (coupon obligataire)]
1- Objectif et usage
– Encapsuler un calcul réutilisable qui renvoie un résultat (montant de coupon).
2- Code
Private Function mc(face As Double, taux As Double, nJours As Integer) As Double
mc = face * taux * nJours / 365.25
End Function
3- Règles et hypothèses
– La valeur de retour s’affecte au nom de la fonction (mc = …).
– Private limite l’utilisation au module courant.
– Hypothèses d’unités :
— taux en décimal (ex. 0.056)
— nJours en jours calendaires ; base ici 365.25 (convention explicite).
4- Bonnes pratiques & pièges
– Documenter les unités et conventions (Base 360/365/ACT/ACT).
– Éviter les effets de bord : ne modifier que des variables locales ; pas d’E/S dans une Function pure.
– Valider les entrées (ex. nJours >= 0, taux >= 0).
🟩 Fiche 10 —
[Appeler une Function depuis une Sub]
1- Objectif et usage
– Récupérer la valeur de retour d’une fonction dans une variable, puis l’utiliser/afficher.
2- Code
Sub appelle_fonction()
Dim montantcoupon As Double
montantcoupon = mc(1000000, 0.056, 91)
MsgBox montantcoupon
End Sub
3- Règles et hypothèses
– Les types d’arguments doivent être compatibles avec la signature.
– L’appel peut être imbriqué dans d’autres expressions si nécessaire.
4- Bonnes pratiques & pièges
– Stocker dans une variable nommée (débogage, lisibilité).
– Centraliser l’affichage (éviter de mélanger logique de calcul et UI partout).
🟩 Fiche 11 —
[Arguments nommés et ordre des paramètres]
1- Objectif et usage
– Rendre l’appel auto-documenté et indépendant de l’ordre.
2- Code
Sub appelle_fonction_()
Dim montantcoupon As Double
montantcoupon = mc(face:=1000000, taux:=0.056, nJours:=91)
MsgBox montantcoupon
End Sub
Sub appelle_fonction__()
Dim montantcoupon As Double
montantcoupon = mc(taux:=0.056, nJours:=91, face:=1000000)
MsgBox montantcoupon
End Sub
3- Règles et hypothèses
– Avec arguments nommés, l’ordre devient libre tant que chaque nom correspond exactement au paramètre.
– Les fautes d’orthographe dans les noms → erreur de compilation.
4- Bonnes pratiques & pièges
– Utiliser les arguments nommés quand la fonction a plusieurs paramètres du même type (réduit les inversions).
– Conserver les noms de paramètres courts mais significatifs (face, taux, nJours).
🟩 Fiche 12 —
[MsgBox comme Function : capturer la réponse utilisateur + constantes]
1- Objectif et usage
– Utiliser MsgBox comme fonction qui renvoie un code (ex. Oui/Non).
– Explorer les constantes retournées (vbYes, vbNo, vbCancel, vbYesNo).
2- Code (retour utilisateur)
Sub msgbox_demo()
Dim r As Long
r = MsgBox(Title:=”Question”, _
Buttons:=vbYesNo, _
Prompt:=”Aimeriez-vous continuer?”)
‘ Utiliser r (6 = vbYes, 7 = vbNo)
End Sub
3- Code (exploration des constantes)
Sub exploration()
MsgBox Prompt:=vbYes, Title:=”vbYes” ‘ 6
MsgBox Prompt:=vbNo, Title:=”vbNo” ‘ 7
MsgBox Prompt:=vbYesNo, Title:=”vbYesNo” ‘ 4
End Sub
4- Règles et hypothèses
– MsgBox retourne un Long : comparer avec les constantes (vbYes=6, vbNo=7, vbCancel=2…).
– Paramètres nommés Title, Buttons, Prompt améliorent la lisibilité.
– Les lignes longues peuvent être continuées avec _.
5- Bonnes pratiques & pièges
– Toujours tester le retour avant d’agir :
— If r = vbYes Then … Else …
– Documenter les choix offerts (texte clair, boutons adéquats).
– Éviter les MsgBox multipliées ; préférer une logique centralisée pour l’UI.
Séance 2
🟩 Fiche 1 —
[Constante vbNewLine — retour à la ligne dans une MsgBox]
1- Objectif et usage
– Afficher plusieurs lignes de texte dans une même boîte de message.
– Utiliser la constante vbNewLine pour insérer un saut de ligne manuel.
2- Code
Sub Démo_vbNewLine()
MsgBox “Première ligne” & vbNewLine & “Deuxième ligne”
End Sub
3- Règles et hypothèses
– vbNewLine insère un retour à la ligne dans une chaîne de caractères.
– Peut être remplacé par Chr(13) ou Chr(10) selon le système, mais vbNewLine est plus portable.
– L’opérateur & concatène les chaînes de texte.
4- Bonnes pratiques & pièges
– Utiliser vbNewLine plutôt que vbCrLf pour compatibilité accrue.
– Éviter les espaces avant/après le & sauf pour la lisibilité.
🟩 Fiche 2 —
[MsgBox simple avec arguments nommés]
1- Objectif et usage
– Créer une MsgBox avec arguments nommés (Prompt, Title, Buttons).
– Afficher un message sans capturer de choix, puisque le seul bouton est OK.
2- Code
Sub ExploreMsgBox2()
MsgBox Title:=”Décision”, Prompt:=”Continuer?”, Buttons:=vbOKOnly
End Sub
3- Règles et hypothèses
– vbOKOnly affiche uniquement le bouton OK.
– L’ordre des arguments devient libre grâce aux arguments nommés.
– Aucun retour n’est capturé, donc pas de variable associée.
4- Bonnes pratiques & pièges
– Toujours nommer les arguments pour plus de lisibilité.
– Utiliser cette forme quand il n’y a aucune décision à prendre.
🟩 Fiche 3 —
[MsgBox avec boutons multiples et variable de retour]
1- Objectif et usage
– Capturer la réponse utilisateur (Oui, Non, Annuler) grâce à une variable.
– Découvrir la constante vbYesNoCancel.
2- Code
Sub ExploreMsgBox3()
Dim r As Long
r = MsgBox(Title:=”Décision”, Prompt:=”Continuer?”, Buttons:=vbYesNoCancel)
End Sub
3- Règles et hypothèses
– MsgBox retourne un code entier (vbYes, vbNo, vbCancel).
– La variable doit être de type Long pour accueillir le code de retour.
– vbYesNoCancel correspond à la valeur 3.
4- Bonnes pratiques & pièges
– Toujours stocker la valeur de retour avant de traiter une logique conditionnelle.
– Pour vérifier : MsgBox vbYes affiche 6, vbNo 7, vbCancel 2.
🟩 Fiche 4 —
[MsgBox avec équivalent numérique des constantes]
1- Objectif et usage
– Montrer que les constantes comme vbYesNoCancel sont des entiers (ici 3).
– Prouver que la substitution par un nombre est possible, mais déconseillée.
2- Code
Sub ExploreMsgBox4()
Dim r As Long
r = MsgBox(Title:=”Décision”, Prompt:=”Continuer?”, Buttons:=3)
End Sub
3- Règles et hypothèses
– Buttons:=3 = vbYesNoCancel.
– Le comportement est identique, mais le code devient moins lisible.
4- Bonnes pratiques & pièges
– Éviter les valeurs numériques brutes : toujours employer les constantes pour la clarté.
🟩 Fiche 5 —
[Lecture d’une cellule précise dans une feuille Excel]
1- Objectif et usage
– Lire une valeur précise sur une feuille à partir de ThisWorkbook.
– Utiliser Cells(ligne, colonne) pour cibler la cellule.
2- Code
Sub Cells1()
Dim m As Double
m = ThisWorkbook.Worksheets(“Données”).Cells(1, 1).Value
MsgBox CStr(m)
End Sub
3- Règles et hypothèses
– .Cells(1,1) = cellule A1.
– .Value est la propriété par défaut d’une cellule.
– CStr() convertit un nombre en texte (type String).
– ThisWorkbook = classeur contenant le code (et non celui actif).
4- Bonnes pratiques & pièges
– Toujours préciser le classeur et la feuille pour éviter les ambiguïtés.
– Préférer CStr avant d’afficher des nombres dans MsgBox pour garder le format exact.
🟩 Fiche 6 —
[Lecture d’une cellule par index de feuille]
1- Objectif et usage
– Variante simplifiée pour accéder à une feuille via son index numérique.
2- Code
Sub Cells2()
Dim m As Double
m = ThisWorkbook.Worksheets(1).Cells(1, 1).Value
End Sub
3- Règles et hypothèses
– Worksheets(1) renvoie la première feuille du classeur (ordre visible dans Excel).
– Worksheets(“Nom”) est plus sûr si les feuilles sont renommées.
– .Value reste implicite.
4- Bonnes pratiques & pièges
– Préférer le nom de la feuille, car l’ordre peut changer.
– L’accès par index reste utile pour les boucles.
🟩 Fiche 7 —
[Function MontantDuCoupon — rappel de la distinction Function/Sub]
1- Objectif et usage
– Revoir la différence entre Function (renvoie une valeur) et Sub (exécute une action).
– Créer une Function claire et réutilisable.
2- Code
Public Function MontantDuCoupon(face As Double, taux As Double, nJours As Integer) As Double
MontantDuCoupon = face * taux * nJours / 365.25
End Function
3- Règles et hypothèses
– Identique à mc() vue à la séance 1 mais en portée publique.
– Utilisable dans tout le projet VBA (tous modules).
– Les conventions d’unité restent : taux en décimal, jours calendaires.
4- Bonnes pratiques & pièges
– Nom explicite, pas d’abréviations.
– Vérifier les types : ne jamais mélanger Double et String sans conversion.
🟩 Fiche 8 —
[With…End With — exécution groupée sur un objet]
1- Objectif et usage
– Simplifier l’écriture en répétant une référence d’objet une seule fois.
– Rendre le code plus court, plus rapide et moins sujet aux erreurs.
2- Code
Sub données1()
With ThisWorkbook.Worksheets(“Données”)
.Cells(1, 4) = MontantDuCoupon(.Cells(1, 1), .Cells(1, 2), .Cells(1, 3))
.Cells(2, 4) = MontantDuCoupon(.Cells(2, 1), .Cells(2, 2), .Cells(2, 3))
.Cells(3, 4) = MontantDuCoupon(.Cells(3, 1), .Cells(3, 2), .Cells(3, 3))
.Cells(4, 4) = MontantDuCoupon(.Cells(4, 1), .Cells(4, 2), .Cells(4, 3))
End With
End Sub
3- Règles et hypothèses
– With crée un contexte temporaire : le point . fait référence à l’objet principal.
– Sans With, chaque ligne nécessiterait ThisWorkbook.Worksheets(“Données”).
– Gagne en concision et fiabilité.
4- Bonnes pratiques & pièges
– Ne jamais imbriquer plusieurs With.
– Réserver With pour des blocs de 3 lignes ou plus afin de conserver la clarté.
🟩 Fiche 9 —
[Boucle For — traitement de plusieurs lignes de données]
1- Objectif et usage
– Automatiser une opération répétitive (ici, calcul du coupon sur plusieurs lignes).
2- Code
Sub données2()
Dim k As Integer
With ThisWorkbook.Worksheets(“Données”)
For k = 1 To 4
.Cells(k, 4) = MontantDuCoupon(.Cells(k, 1), .Cells(k, 2), .Cells(k, 3))
Next
End With
End Sub
3- Règles et hypothèses
– For k = 1 To 4 itère 4 fois (k prend les valeurs 1,2,3,4).
– .Cells(k, col) cible dynamiquement la ligne.
– Next incrémente automatiquement la variable de boucle.
4- Bonnes pratiques & pièges
– Toujours déclarer k du bon type (Long préférable à Integer pour grandes boucles).
– Utiliser .Rows.Count pour parcourir dynamiquement le nombre réel de lignes.
🟩 Fiche 10 —
[Utilisation de variables intermédiaires et concaténation dans MsgBox]
1- Objectif et usage
– Rendre la boucle plus lisible et informer l’utilisateur du résultat final.
2- Code
Sub données3()
Dim k As Integer, f As Double, t As Double, n As Integer
With ThisWorkbook.Worksheets(“Données”)
For k = 1 To 4
f = .Cells(k, 1)
t = .Cells(k, 2)
n = .Cells(k, 3)
.Cells(k, 4) = MontantDuCoupon(f, t, n)
Next
End With
MsgBox Prompt:=”Il y a “ & CStr(k - 1) & “ lignes d’information.”
End Sub
3- Règles et hypothèses
– CStr() convertit le nombre d’itérations en texte.
– L’opérateur & concatène du texte et des valeurs numériques.
– k-1 car après la dernière itération, la boucle ajoute 1 avant de sortir.
4- Bonnes pratiques & pièges
– Utiliser la conversion explicite (CStr) plutôt que laisser VBA le faire implicitement.
– Toujours vérifier la cohérence des types dans les concaténations.