- Thème : classeurs (objets Workbook) | Durée : 30 min | Niveau : intermédiaire.
- Classeur de départ :
VBA11_ventes.xlsm (feuilles Ventes et Infos), avec le classeur Tarifs_2026.xlsx dans le même dossier. - Contexte : le service commercial veut une synthèse des ventes dans un classeur séparé, et le taux de TVA lu dans le classeur des tarifs. Vous manipulez des objets Workbook : ThisWorkbook, Workbooks.Open, Workbooks.Add, SaveAs et Close, puis vous écrivez la fonction EstClasseurOuvert.
- Ouvrir le classeur, puis l'éditeur Visual Basic (Alt+F11) et le module
Module1. - Déclarer et affecter un classeur : macro
InfosClasseur. - Ouvrir un classeur, le lire puis le fermer : macro
LireTarifs. - Créer, enregistrer et fermer un nouveau classeur : macro
CreerSynthese. - Écrire la fonction
EstClasseurOuvert et la tester : macro TesterClasseurs. - Enregistrer le classeur au format .xlsm par macro : macro
EnregistrerCorrige. - Répondre au questionnaire de fin de lab (5 questions, 80 % pour valider).
Déclarer et affecter un classeur
Sub InfosClasseur()
Dim classeurVente As Workbook
Set classeurVente = ThisWorkbook
With classeurVente.Worksheets("Infos")
.Range("B1").Value = classeurVente.Name
.Range("B2").Value = classeurVente.Path
.Range("B3").Value = classeurVente.Worksheets.Count
End With
End Sub
- Une variable de type Workbook désigne un classeur. Set l'affecte : ThisWorkbook est le classeur qui contient la macro, même s'il n'est pas le classeur actif.
- Résultat attendu :
- La feuille Infos affiche le nom du classeur, son dossier et le nombre de feuilles (B1:B3)
Ouvrir un classeur, le lire puis le fermer
Sub LireTarifs()
Dim classeurTarif As Workbook
Set classeurTarif = Workbooks.Open(ThisWorkbook.Path & "\Tarifs_2026.xlsx")
ThisWorkbook.Worksheets("Infos").Range("B4").Value = _
classeurTarif.Worksheets("Tarifs").Range("B1").Value
classeurTarif.Close SaveChanges:=False
End Sub
- Workbooks.Open ouvre un fichier et renvoie le classeur : on le range dans une variable pour le lire. Close SaveChanges:=False le referme sans rien modifier. Le trait de soulignement ( _ ) prolonge une instruction sur la ligne suivante.
- Résultat attendu :
- Infos!B4 contient le taux de TVA lu dans Tarifs_2026.xlsx (0,2)
- Tarifs_2026.xlsx a été ouvert puis refermé par la macro
Créer, enregistrer et fermer un nouveau classeur
Sub CreerSynthese()
Dim classeurVente As Workbook, classeurSynthese As Workbook
Set classeurVente = ThisWorkbook
Set classeurSynthese = Workbooks.Add
classeurVente.Worksheets("Ventes").Range("A1").CurrentRegion.Copy _
Destination:=classeurSynthese.Worksheets(1).Range("A1")
classeurSynthese.Worksheets(1).Name = "Synthèse"
classeurSynthese.SaveAs Filename:=classeurVente.Path & "\Synthese_2026.xlsx", _
FileFormat:=xlOpenXMLWorkbook
classeurSynthese.Close
End Sub
- Workbooks.Add crée un classeur vide et l'active. La variable classeurSynthese permet de le désigner sans ambiguïté, même quand plusieurs classeurs sont ouverts. FileFormat:=xlOpenXMLWorkbook donne un fichier .xlsx.
- Résultat attendu :
- Le fichier Synthese_2026.xlsx existe dans le dossier de travail
- Le nouveau classeur a été fermé après l'enregistrement
Écrire la fonction EstClasseurOuvert
Function EstClasseurOuvert(sNomClasseur As String) As Boolean
Dim x As Workbook
On Error Resume Next
Set x = Workbooks(sNomClasseur)
EstClasseurOuvert = (Err = 0)
End Function
Sub TesterClasseurs()
Debug.Print "VBA11_ventes.xlsm ouvert : "; EstClasseurOuvert("VBA11_ventes.xlsm")
Debug.Print "Synthese_2026.xlsx ouvert : "; EstClasseurOuvert("Synthese_2026.xlsx")
End Sub
- On Error Resume Next laisse passer l'erreur 9 si le classeur n'est pas ouvert : Err vaut alors 9 au lieu de 0. La fonction renvoie True ou False sans arrêter la macro.
- Lancez TesterClasseurs (F5) : le résultat s'affiche dans la fenêtre Exécution (Ctrl+G).
- Résultat attendu :
- La fenêtre Exécution affiche Vrai pour VBA11_ventes.xlsm et Faux pour Synthese_2026.xlsx
Enregistrer le classeur au format .xlsm par macro
Sub EnregistrerCorrige()
ThisWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\VBA11_corrige.xlsm", _
FileFormat:=xlOpenXMLWorkbookMacroEnabled
End Sub
- SaveAs enregistre le classeur sous un autre nom. FileFormat:=xlOpenXMLWorkbookMacroEnabled (52) garde les macros : avec le format .xlsx, elles seraient perdues.
- Résultat attendu :
- Classeur enregistré sous VBA11_corrige.xlsm dans le dossier de travail