Bien que l’objet Workbook ait de nombreuses propriétés et méthodes, vous n’en utiliserez qu’une poignée de manière régulière. Dans ce chapitre, vous allez examiner ces propriétés et méthodes courantes ainsi que quelques événements associés à l’objet Workbook. Il est important de rappeler que l’objet Workbooks représente tous les objets Workbook ouverts dans Excel.
Il existe plusieurs façons de modifier un classeur spécifique :
■ La propriété ActiveWorkbook l’objet Application : Cette propriété renvoie le classeur actif (c’est-à-dire le classeur dans la fenêtre active). Sa Syntaxe est ApplicationObject.ActiveWorkbook. Il est facultatif de spécifier l’objet ApplicationObject.
■ La propriété ThisWorkbook de l’objet Application : Cette propriété renvoie le classeur dans lequel le code est en cours d’exécution. Sa Syntaxe est ApplicationObject.ThisWorkbook . Il est facultatif de spécifier l’objet ApplicationObject.
Notez que bien que la plupart du temps, ActiveWorkbook soit identique à ThisWorkbook, il se peut que ce ne soit pas toujours le cas. Le classeur actif peut être différent du classeur dans lequel le code est en cours d’exécution.
1 Enregistrement et sauvegarde des classeurs
Lorsque vous enregistrez un classeur, vous devez savoir où enregistrer le classeur. Pour ce faire, utilisez l’instruction ChDrive pour déterminer le lecteur et l’instruction ChDir pour définir le répertoire correct. Maintenant, seul le nom manque. Dans l’exemple suivant, prenez le nom suggéré par Excel avec la propriété Name. Ce n’est qu’alors que vous enregistrez le dossier.
Sub enregisterFichier () Dim str As String Const leLecteur = "C: \" Const leRepertoire = "C: \ mon fichier" str = ActiveWorkbook.Name ChDrive leLecteur ChDir leRepertoire ActiveWorkbook.SaveAs FileName:=str, FileFormat:= _ xlNormal, Password:="", WriteResPassword:="", _ ReadOnlyRecommended:=False, CreateBackup:=True End Sub La méthode SaveAs a quelques arguments. Sa syntaxe est : ActiveWorkbook.SaveAs(Filename, FileFormat, Password, _ WriteResPassword, ReadOnlyRecommended, CreateBackup, _ AddToMru, TextCodePage, TextVisualLayout)
Commentaires
■ FileName : Chaîne qui indique le nom du fichier à enregistrer. Vous pouvez inclure un chemin complet ; si vous ne le faites pas, Microsoft Excel enregistre le fichier dans le dossier actif.
■ FileFormat : Format de fichier à utiliser lorsque vous enregistrez le fichier. Pour obtenir la liste des choix valides, voir l’énumération XlFileFormat . Pour un fichier existant, le format par défaut est le dernier qui a été spécifié ; pour un nouveau fichier, le format par défaut est celui de la version d’Excel actuellement utilisée.
■ Password : Chaîne qui respecte la casse (maximum 15 caractères) et indique le mot de passe de protection à donner au fichier.
■ WriteResPassword : Chaîne qui indique le mot de passe de protection en écriture pour ce fichier. Si un fichier est enregistré avec un mot de passe et que ce mot de passe n’est pas fourni lors de l’ouverture du fichier, celui-ci s’ouvre en lecture seule.
■ ReadOnlyRecommended : True pour afficher un message lorsque le fichier est ouvert, conseillant de l’ouvrir en lecture seule.
■ CreateBackup : True pour créer un fichier de sauvegarde.
■ AccessMode : Mode d’accès pour le classeur.
■ ConflictResolution : Valeur XlSaveConflictResolution qui détermine comment la méthode résout un conflit lors de l’enregistrement du classeur. Avec xlUserResolution, la boîte de dialogue de résolution des conflits s’affiche.
Avec xlLocalSessionChanges, les modifications effectuées par l’utilisateur local sont automatiquement acceptées.
Avec xlOtherSessionChanges, les modifications provenant d’autres sessions sont automatiquement acceptées à la place de celles de l’utilisateur local.
Si cet argument n’est pas défini, la boîte de dialogue de résolution des conflits s’affiche.
■ AddToMru : True pour ajouter ce classeur à la liste des derniers fichiers utilisés. La valeur par défaut est False.
■ TextCodepage : Ignoré pour toutes les langues dans Microsoft Excel.
■ Local : True enregistre les fichiers par rapport à la langue de Microsoft Excel (y compris les paramètres du Panneau de configuration). Valeur false (valeur par défaut) enregistre les fichiers par rapport à la langue de Visual Basic pour applications (VBA) (généralement l’anglais (États-Unis), sauf si le projet VBA où la méthode Workbooks.Open est exécutée est un ancien projet VBA XL5/95.
1.1 Enregistrer un classeur
La procédure suivante présente deux méthodes d’enregistrement d’un classeur:
Sub EnregistrerClasseur() ThisWorkbook.Save ThisWorkbook.SaveAs "C: \Users\Temp\Documents\monfichier.xlsx") MsgBox "Enregistrer: " & ThisWorkbook.Saved End Sub
Commentaires
■ La méthode Save () de l’objet Workbook permet d’enregistrer le classeur.
■ La méthode SaveAs () de l’objet Workbook permet d’enregistrer le classeur dans le répertoire C: \Users\Temp\Documents.
1.2 Sauvegarder deux fois le classeur
Une fonction de sauvegarde supplémentaire consisterait à enregistrer le fichier sur deux lecteurs différents.
Sub Fichierdoubleenregistrer () Dim s As String Const leLecteur1 = "C: \" Const leLecteur2 = "D: \" Const leRepertoire1 = "C: \ mes fichiers" Const leRepertoire2 = "D: \ mes donnees" s = ActiveWorkbook.Name ChDrive leLecteur1 ChDir leRepertoire1 ActiveWorkbook.SaveAs FileName:=s, FileFormat:= _ xlNormal, Password:="", WriteResPassword:="", _ ReadOnlyRecommended:=False, CreateBackup:=True ChDrive leLecteur2 ChDir leRepertoire2 ActiveWorkbook.SaveAs FileName:=s, FileFormat:= _ xlNormal, Password:="", WriteResPassword:="", _ ReadOnlyRecommended:=False, CreateBackup:=True End Sub
Commentaires
■ L’instruction ChDrive vous permet de modifier le lecteur actuel. C’est aussi une fonction intégrée dans Excel qui est classée comme une fonction de fichier / répertoire
■ L’instruction ChDir vous permet de modifier le répertoire ou le dossier en cours.
1.3 Appel de la boîte de dialogue Enregistrer sous
Si vous le souhaitez, vous pouvez également accéder à la boîte de dialogue intégrée via VBA Enregistrer Sous pour accéder. Vous pouvez utiliser la macro suivante pour ce faire:
Sub enregistrerdialogue () Application.Dialogs(xlDialogSaveAs).Show End Sub
Figure : Boîte de dialogue Enregistrer sous
1.4 Déterminer le chemin du classeur
Il est souvent nécessaire d’accéder aux classeurs dans le même répertoire ou dans un sous-répertoire. Pour ce faire, le chemin d’accès de ce classeur (qui contient le code VBA) ou le chemin du classeur actuel doit d’abord être déterminé. Un exemple montrant le chemin de trois classeurs différents:
Sub determinerChemin() Workbooks.Open "C:\monclasseur\Classeur3.xlsm" MsgBox "Classeur3 est dans " & ActiveWorkbook.Path MsgBox "Ce classeur est dans" & ThisWorkbook.Path Workbooks.Open ThisWorkbook.Path & "\Classeur1.xlsm" Workbooks.Open ThisWorkbook.Path & "\mesdoc\Inventaire.xlsx" MsgBox "Inventaire est dans" & ActiveWorkbook.Path End Sub
Commentaires
■ Le classeur C:\monclasseur\Classeur3.xlsm est d’abord ouvert. Ceci est maintenant le classeur actif.
■ Ensuite, la propriété Path renvoie le chemin d’accès à ce classeur, qui contient la procédure determinerChemin().
■Le classeur Classeur1.xlsm est ouvert. Il se trouve dans le même répertoire que ce classeur, dans lequel se trouve la procédure determinerChemin(). Ceci est souvent nécessaire pour être sûr qu’un fichier est ouvert dans le même répertoire.
■ Enfin, le classeur Inventaire.xlsx s’ouvre. Ceci est dans l’ajout de sous-répertoire du répertoire de ce classeur. Le classeur que vous venez d’ouvrir est maintenant actif
REMARQUE
Dans les versions antérieures à Excel 2007, les noms de fichier dans les lignes correspondantes de la procédure et dans l’explication doivent être: Classeur3.xls, Classeur1.xls et Inventaire.xls.
1.5 Déterminer le statut du classeur
Si vous souhaitez savoir si des modifications ont été apportées au classeur depuis la dernière ouverture du classeur, que ce soit via des liens ou une entrée utilisateur, utilisez la macro suivante:
Sub classeurModifie () If ActiveWorkbook.Saved = False Then MsgBox " Le dossier a été modifié!" End If End Sub
Commentaires
■ La propriété Saved renvoie la valeur True si le classeur actif n’a pas été actif depuis son dernier enregistrement a été changé.
■ Si la propriété renvoie la valeur False, des modifications ont été apportées au classeur.
1.6 Enregistrez le classeur après avoir modifié la cellule spécifiée
Parfois, nous travaillons avec des données tellement importantes qu’il vaut toujours la peine de les sauvegarder dès qu’un changement a été apporté à la cellule ou à la plage sélectionnée. Il ne s’agit que d’une macro qui vous permet de définir une plage de cellules dans laquelle les modifications de données vous obligeront à enregistrer un classeur.
Le secret de ce code est la méthode Intersect. Comme nous ne voulons pas que le changement de valeurs sauvegarde immédiatement les données, nous allons utiliser la méthode Intersect, qui vérifie si la cellule dans laquelle les données ont été modifiées se trouve dans une plage spécifique (D5: D20).
Private Sub Worksheet_Change(ByVal Target As Range) 'Étape 1: Vérification si la cellule modifiée se trouve dans la plage spécifiée. If Intersect(Target, Range("D5:D20")) Is Nothing Then 'Étape 2: Si ce n'est pas là, quittez Exit Sub 'Étape 3: S'il y en a un, sauvegardez la feuille de calcul Else ActiveWorkbook.Save 'Étape 4:' Conclusion pour la déclaration If End If End Sub
Commentaires :
■ À la première étape, utilisez la méthode Intersect pour vérifier si la cellule spécifiée (celle qui a été modifiée) se trouve dans la plage indiquée.
■ Si la cellule ne se trouve pas dans la plage indiquée, la macro est arrêtée à la deuxième étape et la procédure est terminée.
■ Si toutefois, la cellule est présente, à la troisième étape du classeur actif, la méthode Save est lancée, ce qui remplace la version précédente du fichier.
■ Dans la quatrième étape, nous terminons l’instruction If. Chaque fois qu’une instruction If … Then … Else est créée, elle doit être terminée par End If.
1.7 Enregistrement un classeur avant la fermeture
La macro décrite ici constitue un excellent moyen de protéger les utilisateurs contre la fermeture accidentelle d’un fichier avant son enregistrement. Il oblige Excel à enregistrer automatiquement le fichier avant sa fermeture.
Le code est déclenché par l’événement BeforeClose du classeur. Lorsque vous fermez le classeur, il déclenche l’événement et exécute le code approprié. La règle de la macro est simple: il est demandé à l’utilisateur s’il souhaite réellement fermer le classeur. La macro vérifie ensuite si l’utilisateur clique sur OK ou sur Annuler.
L’analyse est effectuée par l’instruction Select Case. Ceci est une instruction alternative à If … Then … Else, vous permettant de vérifier la condition spécifique. Grâce aux instructions de Select Case, vous pouvez vérifier de nombreuses conditions. Dans ce cas, nous vérifions uniquement si le bouton OK ou Annuler a été cliqué.
Private Sub Workbook_BeforeClose(Cancel As Boolean) 'Étape 1: Activer la boîte de message et commencer à vérifier Select Case MsgBox("Enregistrer et fermer?", vbOKCancel) 'Étape 2: Appuyez sur le bouton Annuler - annule la fermeture Case vbCancel Cancel = True 'Étape 3: Appuyez sur le bouton OK - enregistre et ferme le classeur. Case vbOK ActiveWorkbook.Save 'Étape 4: Remplir l'instruction Select Case End Select End Sub
Commentaires :
■ Dans la première étape, une boîte de message est activée. Elle constitue la condition de l’instruction Select Case. Ensuite, nous utilisons l’argument vbOKCancel, afin que l’utilisateur puisse choisir entre les boutons OK et Annuler.
■ Si l’utilisateur clique sur le bouton Annuler, la macro commande alors à Excel d’annuler l’événement Workbook_Close. Ceci est fait en passant la valeur True à la variable logique Cancel.
■ Si l’utilisateur clique sur le bouton OK, l’étape 3 sera exécutée. Excel recevra la commande pour enregistrer le classeur. Et puisque dans ce passage nous n’avons pas défini la valeur Fermer sur True, la fermeture se poursuivra.
■ Dans la quatrième étape, nous finissons l’instruction Select Case. Chaque fois que vous créez une instruction Select Case, vous devez la terminer avec End Select.
2 Ouvrir un classeur
La procédure suivante ouvrira un dossier existant:
Sub OuvrirClasseur() Workbooks.Open "C:\Temp\chancelin.xlsm" End Sub
Commentaires
■ La méthode Open () de l’objet Workbooks ouvre le classeur avec le nom spécifié dans le répertoire nommé. C’est alors le classeur actif.
■ Un élément supplémentaire est ajouté à la liste des classeurs.
■ Dans l’exemple, un fichier a été adressé à l’aide d’un chemin absolu. Vous pouvez également accéder aux fichiers avec des chemins d’accès relatifs et aux fichiers du même répertoire.
■ Si le classeur (le fichier) n’existe pas, le programme est abandonné avec un message d’erreur.
■ La syntaxe de la méthode Open est Workbooks.Open(Filename, [UpdateLinks], [ReadOnly], [Format], [Password], [WriteResPassword], [IgnoreReadOnlyRecommended], [Origin], [Delimiter], [Editable], [Notify], [Converter], [AddToMru], [Local], [CorruptLoad])
La syntaxe de Open semble plutôt décourageante car il y a 16 de paramètres au total. Heureusement, seul le premier est optionnel et le reste facultatif.
Comme je voudrais que ce livre regorge de contenu utile et pratique plutôt que de reproduire les fichiers d’aide d’Excel, je n’entrerai pas dans les détails de chaque paramètre ici. La plupart du temps, vous utiliserez la méthode Open avec son seul paramètre obligatoire, le nom de fichier.
■ L’argument Password est une valeur de chaîne spécifiant le mot de passe requis pour ouvrir un classeur protégé par mot de passe. Si vous omettez cet argument, un mot de passe sera demandé à l’utilisateur.
■ L’argument FileName est requis alors que tous les autres arguments sont facultatifs. C’est une valeur de chaîne spécifiant le nom du classeur à ouvrir. Le nom du fichier (y compris l’extension) avec son chemin doit être spécifié. Sinon, le nom du fichier sera recherché dans le répertoire en cours.
■ Vous pouvez définir ReadOnly sur true pour ouvrir le classeur en mode lecture seule. Par défaut, ce paramètre est false (mode lecture-écriture).
2.1 Appel de la boîte de dialogue Open intégrée
Si vous le souhaitez, vous pouvez également utiliser une boîte de dialogue Excel déjà intégrée pour ouvrir les classeurs. Vous pouvez également indiquer le chemin que la boîte de dialogue Open doit afficher comme argument.
Sub ouvrirboitedialogueopen() Application.Dialogs(xlDialogOpen).Show _ "C:\Users\JOSUE-PC\Documents" End Sub
Figure : boîte de dialogue ouverte intégrée
2.2 Ouverture d’un classeur défini par l’utilisateur
La macro décrite ci-dessous utilise une technique simple qui ouvre une boîte de dialogue dans laquelle l’utilisateur peut rechercher et ouvrir des fichiers Excel.
Sub OuvertureClasseur() 'Étape 1: Déclaration de la variable Dim NonF As Variant 'Étape 2: Activez la boîte de dialogue à l'aide de la méthode GetOpenFilename NomF = Application.GetOpenFilename(FileFilter:="Excel Workbooks,*.xl*”, Title:="Sélectionnez le classeur à ouvrir", MultiSelect:=False) 'Étape 3: Si vous avez sélectionné le fichier, ouvrez-le! If NomF <> False Then Workbooks.Open Filename:=NomF End If End Sub
Commentaires
■ La première action effectuée par la macro consiste à déclarer un type de variable Variant, qui stocke le nom du fichier sélectionné par l’utilisateur. NomF est le nom de notre variable.
■ Dans la deuxième étape, la méthode GetOpenFilename est utilisée pour créer une boîte de dialogue dans laquelle vous pouvez rechercher et sélectionner le fichier requis.
■ La méthode GetOpenFilename prend en charge plusieurs paramètres, qui peuvent également être ajustés. Le paramètre FileFilter vous permet de spécifier le type de fichiers à rechercher. Le paramètre Title vous permet de changer le nom affiché sur la barre de titre d’une boîte de dialogue donnée. Le paramètre MultiSelect vous permet de bloquer l’ouverture simultanée de plusieurs fichiers.
■ Lorsque l’utilisateur sélectionne un fichier dans la boîte de dialogue, la variable NomF télécharge les noms des fichiers sélectionnés. À l’étape trois, il vérifie si la variable NomF est vide. Si ce n’est pas le cas, le fichier sélectionné est ouvert à l’aide de la méthode Open de l’objet Workbooks.
2.3 Ouverture de tous les classeurs à partir d’un dossier
L’ouverture d’un classeur dans un dossier est un casse-tête typique. La macro suivante résout ce problème. La fonction Dir est utilisée dans la macro et renvoie le nom du fichier (sous la forme d’une chaîne de caractères). Dans le code suivant, la fonction Dir est utilisée pour énumérer tous les fichiers .xslx présents dans un répertoire donné, et récupérez le nom de chacun. Ensuite, chaque fichier sera ouvert, un certain code y sera exécuté, puis le fichier sera fermé.
Sub OuvertureTousClasseurs() 'Étape 1: Déclaration des variables Dim MesFichiers As String 'Étape 2: Indication du répertoire cible MesFichiers = Dir("C:\Temp\*.xlsx") Do While MesFichiers <> "" 'Étape 3: Ouvrez plus de classeurs Workbooks.Open "C:\Temp\" & MonClasseur 'Exécution de certains codes MsgBox ActiveWorkbook.Name ActiveWorkbook.Close SaveChanges:=True 'Étape 4: Le fichier suivant du dossier MesFichiers = Dir Loop End Sub
Commentaires :
■ Dans la première étape, la variable MesFichiers est déclarée, ce qui capturera les noms des fichiers suivants.
■ Dans la deuxième étape, la fonction Dir a été utilisée pour indiquer le répertoire et le type de fichiers à rechercher. Selon le code, seuls les fichiers .xslx seront recherchés. Cela signifie que seuls ces fichiers seront traités dans la boucle. Si vous devez appliquer une macro à des fichiers .xls, le code doit être modifié (cela s’applique également au nom du répertoire dans lequel effectuer la recherche). La macro transmet la variable MesFichiers au nom de chaque fichier trouvé.
■ La fonction Dir, qui renvoie le nom d’un fichier ou d’un dossier, a la syntaxe suivante :
Dir[(pathname[, attributes])]
Notez que les deux arguments de la fonction Dir sont facultatifs. pathname est le nom d’un fichier ou d’un dossier. Vous pouvez utiliser l’une des constantes ou valeurs du tableau suivant pour l’argument attributes:
Constant | Valeur | Nom d’attribut |
VbNormal | 0 | Normal |
VbHidden | 2 | Masqué |
VbSystem | 4 | Système Étiquette |
VbVolume | 8 | Étiquette de volume |
VbDirectory | 16 | Répertoire ou dossier |
La fonction Dir est souvent utilisée pour vérifier si un fichier ou un dossier existe sur un disque.
■ Dans la troisième étape, le fichier est ouvert, une action spécifique est exécutée (vous pouvez entrer le code de n’importe quelle macro), puis sauvegardée et fermée. Dans cet exemple simple, nous apportons une boîte de message contenant le nom de chaque fichier ouvert.
■ La dernière étape consiste à effectuer une boucle et à répéter la recherche des fichiers suivants. S’il n’y a plus de fichiers, la variable Mes Fichiers es sera vide. Dans ce cas, la boucle et la macro terminent l’opération.
NOTE
La fonction Dir vous permet d’utiliser les caractères génériques dans le chemin d’accès spécifié – un astérisque (*) pour plusieurs caractères et un point d’interrogation (?) pour un seul caractère.
2.4 Déterminer le nombre de classeurs ouverts
La procédure suivante détermine le nombre de classeurs ouverts :
Sub NombreClasseurs () MsgBox "Nombre de classeurs: " & Workbooks.Count End Sub
Commentaires
■ La propriété Count de l’objet Workbooks détermine le nombre de classeurs ouvert.
■ Même les classeurs contenant les macros sont dénombrés avec cette propriété.
2.5 Recherche du nom du dossier actif
Lorsque vous travaillez avec des fichiers, vous avez souvent besoin de connaître le nom du dossier actuel. Vous pouvez obtenir ces informations facilement avec la fonction curDir, qui ressemble à ceci:
CurDir([drive])
Commentaires
■ Notez que drive est un argument facultatif. Si vous omettez drive, VBA utilise le lecteur actuel.
■ La fonction CurDir renvoie un chemin de fichier comme Variant. Pour renvoyer le chemin sous forme de chaîne, utilisez curDir$ (où $ est le caractère de déclaration de type d’une chaîne).
Pour voir cette fonction en action, effectuons quelques exercices dans la fenêtre Exécution :
– Ouvrez un nouveau classeur et enregistrez-le sous mes fichiers dans votre C: \ mes fichiers.
– Basculez vers Microsoft Visual Basic Editor et appuyez sur Ctrl + G pour activer la fenêtre Exécution. Tapez l’instruction suivante et appuyez sur Entrée:
? CurDir
Lorsque vous appuyez sur Entrée, Visual Basic affiche le nom du dossier actuel. Par exemple: C: \
- Si vous disposez d’un deuxième lecteur de disque, vous pouvez trouver le dossier actuel sur le lecteur D, comme suit:
? CurDir ("D: \")
Si vous fournissez une lettre pour un lecteur qui n’existe pas, Visual Basic affichera le message d’erreur suivant : “Périphérique non disponible.”
Pour stocker le nom du lecteur de disque actuel dans une variable appelée monLecteur, tapez l’instruction suivante et appuyez sur Entrée:
monLecteur = Left(CurDir$,1)
Lorsque vous appuyez sur Entrée, Visual Basic stocke la lettre du lecteur actuel dans la variable monLecteur. Remarquez comment la fonction CurDir$ est utilisée comme premier argument de la fonction Left. La fonction Left indique à Visual Basic d’extraire le caractère le plus à gauche de la chaîne retournée par la fonction CurDir$ et de le stocker dans la variable monLecteur. Pour vérifier le contenu de la variable monLecteur, saisissez l’instruction suivante et appuyez sur Entrée:
?monLecteur
Pour renvoyer la lettre du lecteur suivie de deux points, tapez les instructions suivantes, en appuyant sur Entrée après chaque ligne :
monLecteur = Left(CurDir$,2) ?monLecteur
3 Fermer un classeur
Si vous souhaitez fermer un classeur, vous devez confirmer un message avec Oui lorsque vous avez apporté des modifications au classeur. Vous pouvez désactiver ce message avec la propriété DisplayAlerts. Il vous suffit de décider au préalable si vous souhaitez accepter les modifications apportées à votre classeur par défaut ou si vous ne souhaitez pas les enregistrer.
3.1 Fermer tous les classeurs
La procédure suivante ferme tous les classeurs ouverts:
Sub FermerClasseurs () Workbooks.Close End Sub
Commentaires :
■ La méthode Close () de l’objet Workbooks ferme tous les classeurs ouverts, mais l’application Excel reste ouverte.
■ Si un classeur a été modifié, il sera demandé à l’utilisateur s’il souhaite le sauvegarder.
3.2 Fermeture simultanée de plusieurs classeurs
L’une des activités les plus ennuyeuses d’Excel est la fermeture simultanée de nombreux classeurs. Chaque classeur ouvert doit d’abord être activé, puis fermé, en enregistrant les modifications apportées précédemment. Il n’y a pas de moyen facile de les fermer tous en même temps. Mais cette petite macro peut faire face à cette contrariété. La macro suivante exécute une boucle pour la collection de classeurs qui s’exécute sur tous les classeurs ouverts. Lors de la mise en boucle, chaque classeur suivant est enregistré, puis fermé.
Sub FormetureSimutaneeClassseur () 'Étape 1: Déclaration des variables Dim monclasseur As Workbook 'Étape 2: Exécuter des boucles pour les classeurs: enregistrer et fermer For Each monclasseur In Workbooks monclasseur.Close SaveChanges:=True Next monclasseur End Sub
Commentaires :
■ Dans la première étape, la variable d’objet workbook est déclarée. Cela vous permettra de chercher tous les classeurs ouverts et de récupérer leurs noms.
■ La deuxième étape est la mise en boucle des classeurs ouverts qui les enregistre et les ferme. Si vous ne souhaitez pas enregistrer de fichiers, modifiez SaveChanges de True à False.
3.4 Fermer un classeur et enregistrer toutes les modifications
Dans l’exemple suivant, le classeur actif est fermé et toutes les modifications sont automatiquement enregistrées.
Sub classeurFerme () With ActiveWorkbook .Sheets(1).Range("A1").Value = _ " dernier changement " & Now & " par l'utilisateur " & _ Application.UserName .Close SaveChanges:=True End With Application.DisplayAlerts = False End Sub
Commentaires
■ La méthode Close ferme le classeur. Si l’argument SaveChanges est défini sur True, les modifications apportées au classeur sont enregistrées.
■ Enregistrez le dernier accès à ce classeur à l’aide de la fonction Now et de la propriété UserName.
■ En définissant la propriété DisplayAlerts sur la valeur False, l’invite lorsque vous fermez le classeur est supprimée.
3.5 Fermer tous les classeurs sauf le classeur actif
La procédure suivante permet de supprimer tous les classeurs sauf le classeur actif.
Sub fermerClasseursSaufUn() Dim monClasseur As Workbook For Each monClasseur In Application.Workbooks If monClasseur.Name <> ThisWorkbook.Name Then monClasseur.Close Next End Sub
Commentaires
■ Tous les classeurs actuellement ouverts sont répertoriés dans l’objet de collection Workbooks. Vous pouvez l’utiliser dans une boucle For Each qui compare le nom du classeur actif avec les noms des classeurs qui se trouvent dans la collection.
■ Vous utilisez ensuite la méthode Close pour fermer tous les classeurs sauf celui actif.
Pour savoir combien de classeurs sont actuellement ouverts, appliquez la propriété Count à l’objet de collection Workbooks.
Sub comptageClasseursOuverts () MsgBox " Il y a actuellement " & _ Application.Workbooks.Count & _ " Fichier (s) ouvert (s) ", vbInformation End Sub
4 Créer un nouveau classeur
Exemple 1
La procédure suivante crée et ouvre un nouveau classeur.
Sub NouveauClasseur() Workbooks.Add End Sub
Commentaires
■ La méthode Add () de l’objet Workbooks permet d’ouvrir un nouveau classeur qui devient le classeur actif.
■ La syntaxe de la méthode Add est Workbooks.Add (modéle)
■ Le paramètre de modèle est facultatif et peut être une chaîne spécifiant le nom d’un classeur existant qui sera utilisé comme modèle. Le modèle peut également être une constante qui spécifie qu’un nouveau classeur doit être créé avec une feuille de calcul d’un type spécifique. Vous pouvez choisir parmi quatre types: xlWBAChart, xlWBAExcel4IntlMacroSheet, xlWBAExcel4MacroSheet et xlWBATWorksheet. Celles-ci représentent respectivement une feuille de graphique, deux types de feuilles de macros et une feuille de calcul standard. Enfin, si vous ne spécifiez pas de modèle, Excel crée simplement un classeur standard vide.
Exemple 2
Dans cet exemple, nous allons copier des données du classeur et les coller dans un classeur nouvellement créé. La macro ci-dessous copie la plage de cellules de la feuille de calcul active et colle les données dans la nouvelle feuille de calcul.
Sub CreerNouveauClasseur() 'Étape 1: Copier des données Sheets("Feuil1").Range("B4:C15").Copy 'Etape 2: Créez un nouveau classeur Workbooks.Add 'Étape 3: collez les données ActiveSheet.Paste Destination:=Range("A1") 'Étape 4: Désactivez le message d'alerte Application.DisplayAlerts = False 'Étape 5: Enregistrez la feuille de calcul nouvellement créée ActiveWorkbook.SaveAs _ Filename:="C:\Temp\monfichier.xlsx" 'Étape 6: Activer les messages d'alerte Application.DisplayAlerts = True End Sub
Commentaires
■ Dans la première étape, nous copions simplement les données de la plage de cellules de B4 à C15.
■ Un nouveau classeur pour l’objet Workbook a été créé à l’aide de la méthode Add.
■ Faites attention à l’objet ActiveSheet. Lorsqu’un nouveau classeur est créé, il devient un fichier actif. La même chose se produit lorsque le classeur est créé manuellement.
■ Dans la quatrième étape, la méthode DisplayAlerts est définie sur False, ce qui exclut les messages Excel. Cela est dicté par le fait que le classeur nouvellement créé sera enregistré à l’étape suivante. La macro peut être exécutée autant de fois que nécessaire et, dans tous les cas, Excel enregistrera le fichier à nouveau.
Et qu’arrivera-t-il lorsque nous essaierons de sauvegarder le classeur plusieurs fois? Excel affichera un avertissement chaque fois qu’un fichier portant ce nom existe déjà et demandera s’il doit l’écraser. Notre objectif est d’automatiser le processus de création de nouveaux classeurs. Ce message doit donc être supprimé.
■ À l’étape cinq, la méthode SaveAs a été utilisée pour enregistrer le fichier. Il est à noter que le chemin a été donné, y compris le nouveau nom de fichier.
■ Les messages ayant été éliminés à la quatrième étape, ils devraient être restaurés maintenant. Si nous ne le faisons pas, aucun autre avertissement n’apparaîtra jusqu’à la fin de la session en cours.
Exemple 3
La procédure suivante permet de déterminer le nom du classeur:
Sub nomClasseur() MsgBox "Nom : " & ThisWorkbook.Name MsgBox " Nom avec chemin : " & ThisWorkbook.FullName End Sub
Commentaires
■ La valeur de la propriété Name est déterminée et sortie, il s’agit du nom de fichier du classeur.
■ De plus, la valeur de la propriété FullName est déterminée et sortie. Il s’agit du nom de fichier du classeur, y compris le chemin d’accès complet.