Les classeurs en VBA : Workbooks, Open, Close, Path, FullName, SaveAs et événements
Une macro travaille rarement sur un seul fichier : elle ouvre un tarif, crée un bilan, enregistre une copie dans les archives. La collection Workbooks contient les classeurs ouverts, chacun étant un objet Workbook que l’on crée, ouvre, ferme, enregistre, et qui réagit à des événements. Chaque simulateur reproduit Excel avec ses fenêtres, un explorateur de fichiers (dossier C:\Formations) et l’explorateur de projets. Voir aussi les feuilles et les cellules.
Workbooks : la collection des classeurs ouverts
Workbooks contient tous les classeurs ouverts dans Excel ; un fichier présent sur le disque mais fermé n’en fait pas partie. On désigne un classeur par son nom, extension comprise (Workbooks("Tarifs.xlsx")), ou par son numéro d’ouverture (Workbooks(1)). Deux raccourcis sont essentiels : ThisWorkbook, le classeur qui contient le code, et ActiveWorkbook, le classeur affiché à l’écran. Ils sont souvent identiques, mais plus dès que la macro ouvre ou crée un autre classeur.
ThisWorkbook.Worksheets("Paramètres") : le code fonctionne quel que soit le classeur affiché.Workbooks("Tarifs") peut échouer selon la configuration de Windows. Écrivez toujours Workbooks("Tarifs.xlsx").Add, Open et Close : créer, ouvrir, fermer
Workbooks.Add crée un classeur vide (Classeur1, Classeur2…), qui devient actif. Workbooks.Open ouvre un fichier à partir de son chemin complet ; les deux méthodes renvoient le classeur, que l’on range dans une variable avec Set. Close ferme un classeur : l’argument SaveChanges:=True enregistre avant de fermer, SaveChanges:=False abandonne les modifications ; sans argument, Excel pose la question à l’utilisateur.
Workbooks.Open "Tarifs.xlsx" cherche dans le dossier courant, rarement le bon. Construisez le chemin : ThisWorkbook.Path & "\Tarifs.xlsx".If Dir(chemin) = "" Then MsgBox "Fichier introuvable" : Exit Sub évite l’erreur 1004.Workbooks.Open(chemin, ReadOnly:=True) ouvre en lecture seule : pratique pour consulter un fichier partagé.Accès aux feuilles d’un classeur
La référence complète d’une cellule comporte trois niveaux : classeur, feuille, cellule. Workbooks("Sessions 2026.xlsx").Worksheets("Planning").Range("A2") lit une donnée sans activer le classeur. Sans classeur devant, Worksheets et Range visent le classeur actif : après un Open ou un Add, ce n’est plus celui de la macro. Deux variables objet, wb pour le classeur et ws pour la feuille, rendent le code court et sûr.
Set wb = Workbooks.Open(chemin) puis Set ws = wb.Worksheets("Prix") : toutes les lignes suivantes utilisent ws.Range(…).With ThisWorkbook.Worksheets("Accueil") … .Range("B2").Value … End With évite de répéter la référence.Propriétés d’un classeur : Path, Name et FullName
Trois propriétés situent le fichier sur le disque. Elles sont en lecture seule : pour changer le nom ou le dossier, on enregistre sous un autre nom avec SaveAs. Le tableau sous chaque simulateur les affiche pour tous les classeurs ouverts.
| Propriété | Rôle | Exemple pour C:\Formations\Tarifs.xlsx |
|---|---|---|
.Name | Nom du fichier avec son extension | Tarifs.xlsx |
.Path | Dossier, sans barre oblique finale ; vide si le classeur n’a jamais été enregistré | C:\Formations |
.FullName | Chemin complet : Path & « \ » & Name | C:\Formations\Tarifs.xlsx |
.Saved | Vrai si aucune modification n’attend d’être enregistrée | If Not wb.Saved Then wb.Save |
.FileFormat | Format du fichier : 51 pour .xlsx, 52 pour .xlsm | xlOpenXMLWorkbook |
\ sous Windows et / sur Mac : utile pour un classeur partagé entre les deux.Dir et Open ne fonctionnent alors pas avec ce chemin.Les principales méthodes : Activate, Save et SaveAs
Activate affiche un classeur au premier plan ; on en a rarement besoin quand le code utilise des références complètes. Save enregistre sous le nom actuel. SaveAs enregistre sous un nouveau nom ou dans un autre dossier : le classeur ouvert prend ce nouveau nom, et l’ancien fichier reste sur le disque. L’argument FileFormat doit correspondre à l’extension.
| Méthode | Effet | Exemple |
|---|---|---|
.Activate | Met le classeur au premier plan | ThisWorkbook.Activate |
.Save | Enregistre sous le nom actuel | ThisWorkbook.Save |
.SaveAs | Enregistre sous un autre nom, dossier ou format | wb.SaveAs Filename:=chemin, FileFormat:=xlOpenXMLWorkbook |
.SaveCopyAs | Crée une copie sans changer le nom du classeur ouvert | ThisWorkbook.SaveCopyAs "C:\Sauvegardes\Formation.xlsm" |
.Close | Ferme le classeur | wb.Close SaveChanges:=False |
FileFormat:=xlOpenXMLWorkbookMacroEnabled.Application.DisplayAlerts = False supprime la question « Voulez-vous remplacer ? ». Remettez-le à True juste après.Les événements d’un classeur : Workbook_Open, BeforeSave, BeforeClose, Activate et Deactivate
Les procédures événementielles du classeur s’écrivent dans le module ThisWorkbook (double-clic dans l’explorateur de projets, puis listes déroulantes Workbook et Open). Elles s’exécutent toutes seules : à l’ouverture, avant chaque enregistrement, avant la fermeture, quand on arrive sur le classeur ou qu’on le quitte. BeforeSave et BeforeClose reçoivent un argument Cancel : Cancel = True annule l’enregistrement ou la fermeture. Dans ce module, Me désigne le classeur lui-même.
| Procédure | Se déclenche | Usage courant |
|---|---|---|
Workbook_Open | À l’ouverture du classeur | Afficher l’accueil, mettre à jour une date, ouvrir un formulaire |
Workbook_BeforeSave(SaveAsUI, Cancel) | Avant chaque enregistrement ; SaveAsUI vaut True pour Enregistrer sous | Vérifier une saisie obligatoire |
Workbook_BeforeClose(Cancel) | Avant la fermeture | Demander confirmation, nettoyer |
Workbook_Activate | Quand le classeur redevient actif | Barre d’état, ruban personnalisé |
Workbook_Deactivate | Quand on passe à un autre classeur | Rendre la main à Excel |
Me.Saved = True à la fin pour éviter la question à la fermeture.Workbook_AfterSave (après l’enregistrement), Workbook_SheetChange (une cellule de n’importe quelle feuille modifiée), Workbook_NewSheet.L’application Excel : Parent et GetOpenFilename
Application est l’objet racine : Excel lui-même, qui contient la collection Workbooks. La propriété Parent remonte d’un niveau dans cette hiérarchie : le parent d’une cellule est sa feuille, celui d’une feuille son classeur, celui d’un classeur l’application. Application.GetOpenFilename affiche la boîte de dialogue Ouvrir et renvoie le chemin choisi par l’utilisateur, ou False s’il clique sur Annuler ; elle n’ouvre pas le fichier, c’est Workbooks.Open qui s’en charge.
Dim f As Variant : GetOpenFilename renvoie un texte ou False. Une variable String transformerait False en « Faux » et le test f = False échouerait.GetOpenFilename("Classeurs Excel (*.xlsx), *.xlsx", , "Choisir un tarif", , True) : le dernier argument autorise plusieurs fichiers et renvoie un tableau.Application.GetSaveAsFilename fonctionne de la même façon pour choisir un nom d’enregistrement.Exercice : piloter les classeurs des formations
Classeur d’exercice (Énoncé et Corrigé)
- Enregistrez le classeur en .xlsm dans un dossier de travail, collez les macros de la feuille « Code VBA » dans un module standard et les procédures événementielles dans ThisWorkbook.
- Exécutez
ListerClasseurs(Workbooks, Name, Path, FullName), puisCreerTarifs(Add, SaveAs, Close). - Exécutez
LireTarif(Dir, Open, accès aux feuilles) etChoisirFichier(GetOpenFilename, Parent). - Testez les événements : fermez et rouvrez le classeur, videz B2 de la feuille Accueil puis enregistrez.
- Répondez aux questions de la feuille Contrôle.