FAQ Excel
FAQ ExcelConsultez toutes les FAQ
Nombre d'auteurs : 46, nombre de questions : 845, dernière mise à jour : 30 mars 2022
- Comment ajouter un classeur contenant juste une feuille ?
- Comment ouvrir un classeur ?
- Comment travailler sur deux classeurs ?
- Je ne comprends pas la protection du classeur !
- Comment dupliquer une plage sur plusieurs feuilles du classeur ?
- Comment utiliser la duplication de cellules sur plusieurs feuilles, dans Excel 2007 ?
- Comment empêcher la fermeture de mon classeur ?
- Comment utiliser les évènements du module objet ThisWorkbook ?
- Quelle est la différence entre les propriétés ActiveWorkbook et ThisWorkbook ?
- Comment convertir une macro complémentaire XLA en classeur Excel XLS ?
- Comment récupérer les données dans un classeur Excel endommagé ?
- Comment lire et écrire dans des classeurs fermés ?
- Comment faire une requête SQL sur un champ de feuille Excel contenant un point ?
- Comment se déplacer rapidement entre les classeurs ouverts ?
- Comment désactiver l'évènement Workbook_Open d'un classeur ouvert par macro ?
- Comment convertir un classeur au format PDF ou XPS ?
- Comment vérifier la compatibilité d'un classeur Excel 2007 avec les versions Excel antérieures ?
- Comment supprimer les données confidentielles contenues dans le classeur ?
- Comment créer un nouveau modèle dans Excel 2007 ?
- Comment identifier automatiquement l'ouverture de nouveaux classeurs ?
- Comment suivre et auditer les révisions dans un classeur partagé ?
- Comment vérifier si un classeur est déjà ouvert ?
- Comment transférer les données entre 2 classeurs fermés ?
- Comment créer un journal de suivi des consultations d'un classeur en réseau ?
- Comment ouvrir automatiquement un classeur spécifique à chaque démarrage d'Excel ?
- Pourquoi le fichier Personal.xlsb, placé dans le répertoire XLSTART, ne s'ouvre pas automatiquement ?
- Comment définir un autre dossier de démarrage en remplacement de XLSTART, sous Excel 2007 ?
- Faut-il préciser l'extension lorsque l'on manipule un classeur par macro ?
- Comment lister les connections externes d'un classeur dans Excel 2007 ?
- Pourquoi mon classeur .xls ne contient que 65 536 lignes sous Excel 2007 ?
- Est-il possible de récupérer des informations dans un classeur placé sur le Web ?
- Comment changer l'icône d'un classeur ?
- Comment empêcher de quitter un classeur par la croix de fermeture ?
- Quelles sont les restrictions liées aux classeurs partagés ?
- Comment afficher les classeurs ouverts rapidement côte à côte à l'écran.
- Comment fusionner tous les classeurs fermés d'un répertoire, à la suite dans une nouvelle feuille de calcul ?
- Comment afficher le nom du classeur dans une cellule, par formule ?
- Comment mémoriser l'agencement des classeurs ouverts, sous Excel 2007 ?
- 3.1. Les sauvegardes (15)
- 3.2. Les propriétés du classeur (10)
Il y a deux méthodes. On peut restreindre le nombre de feuilles de calcul créées dans un nouveau classeur
Application.SheetsInNewWorkbook
=
1
Application.Workbooks.Add
Seulement cela est un paramétrage de l'application et il faudrait restaurer l'ancienne valeur. On peut aussi créer un classeur contenant une feuille de type spécifique
Application.Workbooks.Add
xlWBATWorksheet
contient une feuille de calcul
Application.Workbooks.Add
xlWBATChart
Contient une feuille graphique
On utilise la méthode Open de la collection WorkBooks Elle accepte plusieurs paramètres dont quelques-uns sont utiles à connaître, FileName est le seul paramètre obligatoire. Il doit contenir le chemin complet
Application.Workbooks.Open
"d:\tuto.xls"
On peut aussi passer par la méthode GetOpenFilename pour laisser l'utilisateur sélectionner le fichier
Application.Workbooks.Open
Application.GetOpenFilename
(
)
Les paramètres intéressants supplémentaires sont : UpdateLinks
* 0
--> Ne met à jour aucune référence
* 1
--> Met à jour des références externes mais pas des références distantes
* 2
--> Met à jour des références distantes mais pas des références externes
* 3
--> Met à jour des références distantes et des références externes
Une référence externe appartient à un autre classeur, une référence distante appartient à un autre programme. ReadOnly Booléen qui définit si le classeur doit être ouvert en lecture seule Password Représente le mot de passe pour un classeur à ouverture protégée
Dans ce cas on utilises des variables :
Dim
objWorkbookSource As
Workbook, objWorkbookCible As
Workbook
Set
objWorkbookSource =
Workbooks.Open
(
Application.GetOpenFilename
)
Set
objWorkbookCible =
Workbooks.Add
(
)
Il ne reste plus qu'à basculer entre les deux variables
Dans Excel, la protection d'un objet ne joue que sur les descendants directs.
Je m'explique: la protection d'un classeur ne protège que ses fenêtres et sa structure de feuille.
Si je fais :
ActiveWorkbook.Protect
Password:=
"monpasse"
, Structure:=
True
, Windows:=
False
Je ne protège que la structure. Cela veut dire qu'il n'est pas possible d'ajouter, de supprimer ou de déplacer des feuilles. En aucun cas cela ne protège les cellules. Pour cela il faut protéger la ou les feuilles.
On utilise la méthode FillAcrossSheet de l'objet WorkBook
ThisWorkbook.Worksheets.FillAcrossSheets
Range
(
"A1:C10"
), xlFillWithAll
Notez que le deuxième paramètre permet de préciser si on veut dupliquer le contenu, le format ou les deux.
Sélectionnez la feuille complète (ou la plage de cellules) à dupliquer.
Ajoutez à la sélection, les feuilles qui vont recevoir les données.
Pour cela, vous avez deux solutions :
Regroupez les feuilles manuellement en conservant la touche SHIFT enfoncée, ou faites un clic droit dans la
barre d'onglets et choisissez l'option 'Sélectionnez toutes les feuilles'.
Ensuite, activez l'onglet 'Accueil' dans le ruban.
Cliquez sur le bouton 'Remplissage' dans le groupe 'Edition'.
Choisissez l'option 'Dans toutes les feuilles de données'.
La boîte de dialogue qui s'affiche permet de préciser le type de recopie :
* Tout
* Le contenu
* Les formats
Cliquez sur le bouton OK pour valider.
La recopie a été effectuée sur les feuilles de destination.
Dans le module ThisWorkbook on met
Private
Sub
Workbook_BeforeClose
(
Cancel As
Boolean
)
Cancel=
true
End
Sub
Comme à un moment il faudra fermer le classeur on désactivera la gestion des événements
Application.EnableEvents
=
False
ThisWorkbook.Close
True
Les évènements permettent l'interaction entre votre programme et l'utilisateur.
Il s'agit de procédures qui se déclenchent automatiquement lorsqu'une action prédéfinie survient.
Vous pouvez ainsi intercepter l'activation du classeur ou un de ses onglets, la modification d'une cellule, etc.
Les procédures évènementielles du module objet ThisWorkbook prennent en compte :
* Le classeur (Workbook_...)
* La collection de feuilles dans le classeur (Workbook_Sheet..)
* La fenêtre contenant le classeur (Workbook_Window...)
Pour plus de détails, consultez l'article sur les évènements du classeur.
ActiveWorkbook représente le classeur de la fenêtre active (qui se trouve au premier plan).
ThisWorkbook représente le classeur qui contient la macro en cours.
ThisWorkbook représente le classeur qui contient le code faisant appel à ThisWorkbook. ActiveWorkbook représente le
classeur actif de l'application. De manière générale, il vaut mieux éviter les objets actifs et privilégier des variables,
car la programmation des objets actifs est assez piègeuse : ceux-ci tendent à ne plus l'être (actif) quand on en a besoin.
Prenons un exemple.
Set
objSheet =
ThisWorkbook.Sheets
(
"recup"
)
Application.Workbooks.Open
"d:\user\tuto1.xls"
ActiveWorkbook.OpenLinks
Name:=
ActiveWorkbook.LinkSources
(
xlExcelLinks)
Après l'appel de OpenLinks plus de possibilité de savoir aisément quel classeur est désigné par ActiveWorkbook.
Allez dans l'éditeur de macros.
Accédez à l'explorateur de projet (Ctrl+R)
Double cliquez sur le module objet ThisWorkbook de la macro complémentaire.
Dans les propriétés (menu Affichage/Fenêtre Propriétés ou F4), indiquez la valeur de IsAddin à False.
Sauvegardez le classeur sous un nouveau nom.
Qui n'a jamais subi le désagrément d'un fichier devenu impossible à ouvrir, et perdu ainsi des heures (voir des jours) de travail ?
Malheureusement, personne n'est à l'abri de ce type de soucis. Le lien ci dessous présente quelques solutions de dépannage afin
de récupérer les données dans des classeurs Excel endommagés ou corrompus.
Les informations fournies n'ont pas la prétention de remplacer les outils professionnels. L'objectif consiste à décrire quelques
pistes de dépannage, que vous pourrez facilement mettre en oeuvre par vos propres moyens.
Les exemples décrits dans ce document sont plus ou moins efficaces en fonction du type de problème rencontré dans les fichiers.
Il faut donc, avant tout, chercher à prévenir ces situations en créant des sauvegardes régulières de vos données.
Il est essentiel de mettre en place une stratégie permettant de sauvegarder les fichiers. Vous disposerez ainsi de copies récentes
en cas de problème sur le fichier original.
Vous pouvez utiliser les formules de liaison afin de lire dans un classeur fermé :
='C:\Documents and Settings\dossier\[ClasseurBase.xls]Feuil1'
!$A$1
Il est aussi possible de faire une recherche dans un classeur fermé.
La fonction suivante recherche "DVP" dans la colonne A et affiche la donnée correspondante de la colonne B :
=RECHERCHEV
("DVP"
;'C:\Documents and Settings\dossier\[ClasseurBase.xls]Feuil1'
!$A
:$B
;2
;FAUX
)
Vous devrez utiliser des macros si vous souhaitez écrire dans les classeurs fermés.
Consultez le tutoriel pour
lire et écrire dans un classeur fermé, par macro.
Nota :
Pour vous connecter aux classeurs fermés Excel 2007 (xlsx et xlsm), en utilisant le modèle ADO, appliquez la
chaîne de connexion suivante :
Dim
Cn As
ADODB.Connection
Dim
Fichier As
String
'Définit le classeur fermé servant de base de données
Fichier =
"C:\Documents and Settings\mimi\dossier\NomClasseur.xlsx"
Set
Cn =
New
ADODB.Connection
With
Cn
.Provider
=
"Microsoft.Jet.OLEDB.4.0"
.ConnectionString
=
"Provider=Microsoft.ACE.OLEDB.12.0;Data Source="
_
&
Fichier &
";Extended Properties=""Excel 12.0;HDR=YES;"""
.Open
End
With
Si dans votre feuille, un entête de colonne contient un point (Nom. Champ), vous devez remplacer le point par un dièse, dans la requête.
Exemple :
UPDATE [Feuil1] SET
[Feuil1].
[Nom# Champ] =
.....
Utiliser le raccourci clavier Ctrl et F6 pour naviguer entre les classeurs ouverts.
Vous pouvez aussi atteindre rapidement un classeur en utilisant le menu Fenêtre.
Appliquez la valeur False à la propriété EnableEvents. De cette manière, la procédure évènementielle Workbook_Open ne se déclenchera pas.
Sub
OuvertureClasseur
(
)
Dim
Fichier As
String
Dim
Wb As
Workbook
Fichier =
"C:\monClasseurBase.xls"
'Désactive les évènements
Application.EnableEvents
=
False
'Ouvre le classeur
Set
Wb =
Workbooks.Open
(
Filename:=
Fichier)
'Ne pas oublier de réactiver les évènements
Application.EnableEvents
=
True
'
'...
'
End
Sub
Microsoft Office system 2007 dispose d'un complément gratuit pour enregistrer ou exporter vos fichiers aux formats PDF et XPS.
Installez et utilisez le complément pour convertir un document Office au format PDF ou XPS.
Si vous souhaitez ensuite créer un enregistrement pdf par macro, utilisez cette syntaxe :
'Attention :
'Si le fichier existe déjà il sera écrasé sans message d'avertissement.
'
ThisWorkbook.ExportAsFixedFormat
Type
:=
xlTypePDF, _
Filename:=
"C:\Documents and Settings\mimi\dossier\NomClasseur.pdf"
, _
Quality:=
xlQualityStandard, _
IncludeDocProperties:=
True
, _
IgnorePrintAreas:=
False
, _
OpenAfterPublish:=
False
Pour enregistrer uniquement une plage de cellules :
Worksheets
(
"Agenda"
).Range
(
"A1:M42"
).ExportAsFixedFormat
Type
:=
xlTypePDF, _
Filename:=
"C:\Documents and Settings\mimi\dossier\RapportTest.pdf"
, _
Quality:=
xlQualityStandard, _
IncludeDocProperties:=
True
, _
IgnorePrintAreas:=
False
, _
OpenAfterPublish:=
False
Le menu de vérification est un point important dans Excel 2007 car il liste toutes les
fonctionnalités risquant d'être perdues ou dégradées si le classeur est enregistré
dans une version d'Excel antérieure.
Par exemple, si vous sauvegardez votre classeur dans une ancienne version d'Excel,
les données après la 65 536ième ligne et de la 256e colonne ne seront pas prise
en compte.
De la même manière, les formules qui font références à des cellules au delà de cette
limite poseront aussi un problème.
Une fois les points de différence identifiés, vous pourrez apporter les modifications nécessaires à une meilleure compatibilité descendante.
Pour lancer la procédure de vérification :
Cliquez sur le bouton Office.
Sélectionnez le menu Préparer.
Cliquez sur le bouton Activer le vérificateur de compatibilité.
Une boîte de dialogue va afficher tous les éléments incompatibles, ainsi que des liens d'aide
et de correction.
Si vous utilisez une ancienne version d'Excel, vous pouvez lire, modifier et enregistrer les classeurs aux nouveaux formats Microsoft Office 2007 grâce au pack de compatibilité pour Microsoft Office 2000, Office XP ou Office 2003.
Avant de distribuer votre classeur, assurez vous que celui-ci ne contient plus de données personnelles ou confidentielles: le suivi des modifications, les commentaires, les textes masqués, les informations d'identification qui vous permettent de rédiger ou de modifier des documents en groupe (travail collaboratif)...
Pour supprimer les données confidentielles, utilisez :
L'Inspecteur de document dans Excel 2007, en cliquant sur le bouton Office/Menu Préparer/Inspecter le document.
ou
Utilisez le complément de suppression des métadonnées pour Office 2003/XP.
L'inconvénient :
Il est possible que vous receviez des messages d'avertissement concernant la confidentialité au
moment de la sauvegarde :
"Ce document contient des macros, des contrôles ActiveX, des informations
sur le kit d'extension XML ou des composants Web. Ils peuvent renfermer des informations
personnelles qui ne peuvent pas être supprimées par l'inspecteur de document."
Ce n'est pas un message d'erreur mais un message d'alerte car vous avez activé le paramètre de "suppression des informations personnelles de propriétés du fichier lors des enregistrements".
Pour annuler cette vérification :
Bouton Office
Bouton "Options Excel".
Menu "Centre de gestion de la confidentialité".
Bouton "Paramètres du centre de gestion de la confidentialité".
Décochez l'option "Supprimer les informations personnelles de propriétés du fichier lors de l'enregistrement".
Cliquez sur le bouton OK pour valider.
Si vous avez besoin de respecter une charte graphique ou si vous devez souvent répéter la même mise en forme dans différents classeurs, il peut être intéressant de créer un modèle afin de gagner du temps.
Ouvrez un nouveau classeur :
Bouton Office/Nouveau/Nouveau classeur Excel.
Appliquez les mises en forme et les personnalisations que vous souhaitez voir apparaitre dans votre futur modèle.
Lors de l'enregistrement, vous avez le choix entre 2 types d'extension :
* xltx (Modèle par défaut)
* xltm (Modèle autorisant les macros)
Quand vous sélectionnez un de ces deux formats dans le champ "Type de fichier", l'arborescence de la boîte de dialogue se place automatiquement sur le répertoire :
C
:\Documents and Settings\mimi\Application Data\Microsoft\Templates
(Vous pouvez ajouter des sous dossiers dans "Templates" si vous devez ranger plusieurs modèles par thème).
Choisissez l'extension, nommez votre classeur et cliquez sur le bouton "Enregistrer" pour valider.
Ensuite, pour utiliser ce modèle :
Cliquez sur le bouton Office
Nouveau
Menu "Mes modèles" (à condition bien entendu d'avoir sauvegardé le fichier dans le dossier "Templates")
Votre modèle personnel apparait dans la boîte de dialogue "Nouveau".
Double cliquez sur le nom pour le lancer.
Un classeur normal, mais disposant de vos personnalisations, s'ouvre et vous pouvez travailler dessus comme pour n'importe
quel autre fichier Excel. Vous remarquerez que dans chaque session Excel, le nom du modèle est suivi d'un numéro d'index
incrémenté (NomModèle1, NomModèle2 ... etc... ) .
Voici une macro à placer par exemple dans le module objet ThisWorkbook d'un classeur xla.
La procédure affiche le nom de tous les classeurs qui sont ouverts, après que le complément soit lancé.
Option
Explicit
Public
WithEvents XL As
Excel.Application
Private
Sub
Workbook_Open
(
)
Set
XL =
Excel.Application
End
Sub
'Pour gérer l'ouverture des classeurs
Private
Sub
XL_WorkbookOpen
(
ByVal
Wb As
Workbook)
'Affiche le nom du nouveau classeur ouvert
If
Wb.Name
<>
ThisWorkbook.Name
Then
MsgBox
Wb.Name
End
Sub
'Pour gérer la création de nouveaux classeurs
Private
Sub
XL_NewWorkbook
(
ByVal
Wb As
Workbook)
MsgBox
Wb.Name
End
Sub
Utilisez le menu Outils,
Suivi des modifications,
Afficher les modifications.
La fenêtre qui s'affiche permet de spécifier :
* La période.
* Le nom de l'utilisateur.
* La plage de cellules que vous souhaitez suivre.
Les cellules qui répondent aux critères de suivi sont encadrées et identifiables par un triangle bleu dans le coin
supérieur gauche, lorsqu'elles sont modifiées.
Les informations de modifications apparaissent sous forme d'annotation lorsque vous passez le curseur de la souris sur la cellule.
L'option "Lister les modifications dans une autre feuille" récapitule les modifications sous forme de
tableau de synthèse (onglet "Historique"). Les modifications du classeur doivent préalablement être sauvegardées.
Menu Outils
Suivi des modifications
Afficher les modifications
Cochez l'option "Lister les modifications dans une autre feuille
et cliquez sur le bouton OK pour valider.
Le menu "Accepter ou refuser les modifications" permet, comme son nom l'indique, de valider ou pas,
les modifications apportées dans le classeur :
Menu Outils
Suivi des modifications
Accepter ou refuser les modifications
Suivez les instructions de la boîte de dialogue pas à pas pour gérer
les modifications.
Dans Excel 2007, cette fonction est accessible depuis l'onglet "Révision", groupe "Modifications".
Sub
Test
(
)
If
VerifOuvertureClasseur
(
"C:\Dossier\nom classeur.xls"
) Then
MsgBox
"Classeur déja ouvert."
Else
MsgBox
"Classeur fermé."
End
If
End
Sub
Function
VerifOuvertureClasseur
(
Fichier As
String
) As
Boolean
Dim
x As
Integer
On
Error
Resume
Next
x =
FreeFile
(
)
Open Fichier For
Input Lock Read As
#x
Close x
If
Err
.Number
=
0
Then
VerifOuvertureClasseur =
False
If
Err
.Number
=
70
Then
VerifOuvertureClasseur =
True
On
Error
GoTo
0
End
Function
"Classeur1_Fermé.xls" est le classeur source. Toutes les données de la Feuil1 sont récupérées dans la requête.
Classeur2_Fermé.xls" est le classeur destination. Les données récupérées sont ajoutées a la suite des enregistrements existants.
Nota :
Le classeur contenant la macro et les 2 classeurs fermés sont dans le même répertoire.
Vous devez préalablement activer la référence "Microsoft ActiveX Data Object 2.x Library".
Sub
tranfertEntreClasseursFermes
(
)
Dim
Cn As
New
ADODB.Connection
Dim
oProdRS As
New
ADODB.Recordset
, oRS As
ADODB.Recordset
Dim
oConn As
ADODB.Connection
Dim
j As
Integer
'------------------------------------------------------------------
' "Classeur1_Fermé.xls" est le classeur source
Cn.Open
"Provider=Microsoft.Jet.OLEDB.4.0;"
&
_
"Data Source="
&
ThisWorkbook.Path
&
"\Classeur1_Fermé.xls;"
&
_
"Extended Properties=""Excel 8.0;HDR=NO;"""
'les donnees sources sont dans la Feuil1 du classeur "Classeur1_Fermé.xls"
oProdRS.Open
"SELECT * FROM [Feuil1$]"
, Cn, adOpenStatic
'------------------------------------------------------------------
' "Classeur2_Fermé.xls" est le classeur destination
Set
oConn =
New
ADODB.Connection
oConn.Open
"Provider=Microsoft.Jet.OLEDB.4.0;"
&
_
"Data Source="
&
ThisWorkbook.Path
&
"\Classeur2_Fermé.xls;"
&
_
"Extended Properties=""Excel 8.0;HDR=NO;"""
'les donnees sont à placer dans la Feuil1 du classeur "Classeur2_Fermé.xls"
Set
oRS =
New
ADODB.Recordset
oRS.Open
"Select * from [Feuil1$]"
, oConn, adOpenKeyset
, adLockOptimistic
'------------------------------------------------------------------
'transfert des données
Do
While
Not
(
oProdRS.EOF
)
oRS.AddNew
For
j =
0
To
oRS.Fields.Count
-
1
oRS.Fields
(
j) =
oProdRS.Fields
(
j).Value
Next
j
oRS.Update
oProdRS.MoveNext
Loop
oProdRS.Close
Cn.Close
oRS.Close
oConn.Close
End
Sub
La procédure écrit des informations dans un fichier texte (.txt) à chaque fois qu'un utilisateur ouvre ou ferme un classeur placé en réseau.
Now renvoie la date et l'heure système en cours.
Environ
(
"UserName"
) permet de récupérer le nom de la personne qui a ouvert la session Windows.
La procédure utilise l'instruction Append pour écrire dans le fichier texte. Les données viennent s'inscrire à la suite des lignes existantes. Si le fichier txt n'existe pas, il sera créé automatiquement.
Placez ce code dans le module objet ThisWorkbook du classeur :
Option
Explicit
'Définit l'emplacement et le nom du fichier .txt, ou va être enregistré les
'informations d'ouverture et de fermeture.
Private
Const
Chemin As
String
=
"J:\dossier\journal.txt"
'Evenement ouverture du classeur
Private
Sub
Workbook_Open
(
)
Dim
Cible As
Integer
Cible =
FreeFile
Open Chemin For
Append As
#Cible
Print #Cible, Now
&
";Ouverture;"
&
Environ
(
"UserName"
)
Close #Cible
End
Sub
'Evenement déclenché avant la fermeture du classeur
Private
Sub
Workbook_BeforeClose
(
Cancel As
Boolean
)
Dim
Cible As
Integer
Cible =
FreeFile
Open Chemin For
Append As
#Cible
Print #Cible, Now
&
";Fermeture;"
&
Environ
(
"UserName"
)
Close #Cible
End
Sub
Remarque :
Bien entendu, il ne se passera rien si l'utilisateur n'active pas les macros au moment de l'ouverture du classeur.
Enregistrez ce classeur dans le dossier XLSTART (ou XLOuvrir).
Ce répertoire est généralement situé sous le chemin :
C:\Documents and Settings\nom_utilisateur\Application Data\Microsoft\Excel\XLSTART
Vérifiez que le classeur Personal.xlsb n'est pas désactivé :
Cliquez sur le bouton Office.
Cliquez sur le bouton 'Options excel'.
Sélectionnez le menu 'Compléments'.
Sélectionnez l'option 'Éléments désactivés' dans le champ 'Gérer'.
Cliquez sur le bouton 'Atteindre'.
Sélectionnez 'Personnal.xlsb' s'il apparait dans la liste.
Cliquez sur le bouton 'Activer'.
Cliquez sur le bouton Office.
Cliquez sur le bouton "Options Excel".
Sélectionnez le menu "Options avancées".
Dans la partie "Général", vous pouvez indiquer un autre répertoire de démarrage dans le champ "Au démarrage,
ouvrir tous les fichiers du dossier".
Cliquez sur le bouton OK pour valider.
Ce dossier ne doit contenir que des fichiers Excel.
Si un classeur portant le même nom se trouve à la fois dans le dossier XLStart et le dossier de démarrage de remplacement, le fichier situé dans le dossier XLStart s'ouvre.
En fonction des préférences système (dans l'explorateur de fichiers, menu Outils/Options des fichiers), on peut choisir de masquer ou non les extensions. Lorsque l'on a choisi de masquer les extensions, le fichier "MonClasseur.xls" est affiché comme "MonClasseur" dans l'explorateur de fichier, mais aussi dans la barre de titre de sa fenêtre quand il est ouvert.
Dans ce cas,
Workbooks
(
"MonClasseur"
).Activate
est accepté.
Si on n'a pas choisi de masquer les extensions, cette syntaxe entraîne une erreur d'exécution 9 ("L'indice n'appartient pas à la sélection ?), et on doit utiliser:
Workbooks
(
"MonClasseur.xls"
).Activate
Il est important de noter que :
Workbooks.Open
"MonClasseur"
est accepté quel que soit l'option choisie.
Pour pallier ce genre de problème, vous pouvez utiliser cette routine dans vos développements :
Sub
AppelAutoDocument
(
ByVal
Doc As
String
, Optional
MAJLiaisons, Optional
ByVal
Chemin, Optional
Dep As
Boolean
)
On
Error
Resume
Next
Workbooks
(
Doc).Activate
If
Err
.Number
=
0
Then
' Deprotection éventuelle
If
Not
IsMissing
(
Dep) Then
If
Dep Then
Deprotege
End
If
Exit
Sub
End
If
On
Error
GoTo
Ouvre
Workbooks
(
Doc &
".xls"
).Activate
If
Err
.Number
=
0
Then
' Deprotection éventuelle
If
Not
IsMissing
(
Dep) Then
If
Dep Then
Deprotege
End
If
Exit
Sub
End
If
On
Error
GoTo
0
Exit
Sub
Ouvre
:
ChDir ThisWorkbook.Path
' MAJ Doc si un nom de chemin a été fourni
If
Not
IsMissing
(
Chemin) Then
Doc =
Chemin &
Application.PathSeparator
&
Doc
End
If
' Prise en compte liaisons si info fournie
If
Not
IsMissing
(
MAJLiaisons) Then
Workbooks.Open
Doc, MAJLiaisons
Else
Workbooks.Open
Doc
End
If
' Deprotection éventuelle
If
Not
IsMissing
(
Dep) Then
If
Dep Then
Deprotege
End
If
On
Error
GoTo
0
End
Sub
Cette Sub permet d'activer un classeur s'il est déjà ouvert, ou de l'ouvrir sinon. En outre, elle gère le cas échéant (grâce à des arguments optionnels), la mise à jour des liaisons, le chemin d'accès et la dé-protection des feuilles du classeur.
Dans le cadre qui nous intéresse ici, la partie importante est celle-ci :
On
Error
Resume
Next
Workbooks
(
Doc).Activate
If
Err
.Number
=
0
Then
' Deprotection éventuelle
' Cf la procédure complète ci-dessus
Exit
Sub
End
If
On
Error
GoTo
Ouvre
Workbooks
(
Doc &
".xls"
).Activate
If
Err
.Number
=
0
Then
' Deprotection éventuelle
' Cf la procédure complète ci-dessus
Exit
Sub
End
If
Un gestionnaire d'erreur permet d'éviter un message intempestif.
Doc étant le nom de fichier fourni comme argument, on tente d'abord d'activer un classeur portant ce nom :
Workbooks
(
Doc).Activate
Si cela fonctionne, la propriété Number de l'objet Err reste à 0, et après une éventuelle dé-protection des feuilles
du classeur, on sort de la procédure avec un Exit Sub.
Si cela ne fonctionne pas, on complète Doc en ajoutant ".xls", et on recommence. Cela permet d'activer le fichier,
s'il est ouvert, que son extension ait été indiquée ou non, et qu'on ait opté ou non pour masquer les extensions.
Ce n'est que si les 2 tentatives précédentes ont échoué, qu'on en déduit que le classeur n'est pas encore ouvert, et qu'on l'ouvre.
NB
L'exemple précédent ne prend pas en compte l'extension des fichiers au format Excel 2007, "xlsx" et "xlsm".
Une seconde piste consiste simplement à affecter le classeur à une variable objet :
Dim
wb as
Workbook
Workbooks
(
"Document"
)
Set
wb =
ActiveWorkbook
' ...
Par la suite, on peut utiliser
wb.Activate
ou
wb.Close
et cela devrait fonctionner indépendamment des infos fournies ou non pour l'extension.
Les sources externes connectées peuvent être :
* une base de données Access
* un fichier xml
* un fichier txt
* un autre classeur Excel
* un fichier de connexion .odc
* ... etc ...
Dim
i As
Integer
For
i =
1
To
ThisWorkbook.Connections.Count
Debug.Print
ThisWorkbook.Connections
(
i).Name
Debug.Print
ThisWorkbook.Connections
(
i).Description
Debug.Print
ThisWorkbook.Connections
(
i).ODBCConnection.CommandText
' ThisWorkbook.Connections(i).Refresh
Debug.Print
"---"
Next
i
Excel 2007 permet d'utiliser 1 048 576 lignes et 16 384 colonnes dans chaque feuille de calcul à condition d'être enregistré dans un des nouveaux formats openXML : xlsx (sans macros) ou xlsm (avec macros). Si vous ouvrez un classeur en mode compatibilité (.xls Excel97-2003) vous serez limité à 65 536 lignes et 256 colonnes.
Pour profiter de ces nouvelles limites (1 048 576 lignes et 16 384 colonnes) dans vos anciens classeurs, enregistrez
une copie au format xlsx ou xlsm:
Cliquez sur le bouton Office
Menu "Enregistrer sous"
Sélectionnez le format "Classeur Excel" ou "Classeur Excel prenant en charge les macros" en fonction du contenu de votre fichier.
Attention :
Lorsqu'un classeur est ouvert en mode compatibilité (.xls Excel97-2003), un menu "Convertir" apparait sous le
Bouton "Office". Cette option permet de transformer automatiquement vos fichiers .xls en type xlsx ou xlsm. Avant
de lancer cette opération, il est important de savoir que le fichier original sera écrasé.
Les formules de liaison fonctionnent pour lire le contenu des cellules d'un classeur placé sur le Web.
Ici, la fonction renvoie le contenu de la cellule A1
='http://monSite/Dossier/[leClasseur.xls]Feuil1'
!$A1
Cet exemple remplace l'icône Excel (image qui s'affiche dans l'angle supérieur gauche de la fenêtre) par un
icône personnalisé, dès l'activation du classeur.
La procédure doit être placée dans le module ThisWorkbook du classeur.
Option
Explicit
Private
Declare
Function
FindWindow Lib
"user32"
Alias "FindWindowA"
_
(
ByVal
lpClassName As
String
, ByVal
lpWindowName As
String
) As
Long
Private
Declare
Function
SendMessageA Lib
"user32"
_
(
ByVal
hwnd As
Long
, ByVal
wMsg As
Long
, ByVal
wParam As
Integer
, _
ByVal
lParam As
Long
) As
Long
Private
Declare
Function
ExtractIconA Lib
"shell32.dll"
_
(
ByVal
hInst As
Long
, ByVal
lpszExeFileName As
String
, _
ByVal
nIconIndex As
Long
) As
Long
Private
Declare
Function
DestroyIcon Lib
"user32.dll"
(
ByVal
hIcon As
Long
) As
Long
Private
Sub
Workbook_Activate
(
)
Dim
Fichier As
String
Dim
x As
Long
'Chemin et nom du fichier icône à afficher
Fichier =
"C:\DELL\DELLSUPPORT.ICO"
'Vérifie si le fichier existe
If
Dir
(
Fichier) =
""
Then
Exit
Sub
x =
ExtractIconA
(
0
, Fichier, 0
)
SendMessageA FindWindow
(
vbNullString
, Application.Caption
), _
&
H80, False
, x
DestroyIcon SendMessageA
(
FindWindow
(
vbNullString
, Application.Caption
), _
&
H80, False
, x)
End
Sub
Private
Sub
Workbook_Deactivate
(
)
Dim
Fichier As
String
Dim
x As
Long
Fichier =
Application.Path
&
"\excel.exe"
x =
ExtractIconA
(
0
, Fichier, 0
)
SendMessageA FindWindow
(
vbNullString
, Application.Caption
), _
&
H80, False
, x
DestroyIcon SendMessageA
(
FindWindow
(
vbNullString
, Application.Caption
), _
&
H80, False
, x)
End
Sub
Cet exemple ne supprime pas mais bloque l'utilisation de la croix.
Cela suppose que votre classeur dispose d'un bouton de fermeture en remplacement de la croix de fermeture.
Bien entendu ça ne fonctionne pas si l'utilisateur désactive les macros ...
La fermeture du classeur est bloqué tant que la variable boolFermeture est égale à False.
Dans le module ThisWorkbook du classeur :
Option
Explicit
Private
Sub
Workbook_Open
(
)
boolFermeture =
False
End
Sub
Private
Sub
Workbook_BeforeClose
(
Cancel As
Boolean
)
'Empêche la fermeture du classeur tant
'que la variable ne sera pas à True
If
boolFermeture =
False
Then
Cancel =
True
End
Sub
Dans un module standard :
Option
Explicit
Public
boolFermeture As
Boolean
Dans le module de feuille contenant un bouton nommé CommandButton1, qui autorise la fermeture du classeur :
Option
Explicit
Private
Sub
CommandButton1_Click
(
)
'Fermeture du classeur en sauvegardant
'les modifications.
boolFermeture =
True
ThisWorkbook.Close
True
End
Sub
Certaines fonctionnalités de Microsoft Excel ne sont plus disponibles lorsque vous utilisez un classeur partagé. Si toutefois vous en avez besoin, utilisez-les avant de partager le classeur ou retirez celui-ci de l'utilisation partagée.
Dans un classeur partagé, il est impossible de :
Cellules
* Fusionner des cellules, mais vous pouvez afficher des cellules fusionnées avant le partage du classeur.
* Insérer ou supprimer des blocs de cellules mais vous pouvez insérer ou supprimer des lignes et des colonnes entières.
Feuilles de calcul, boîtes de dialogue et menus
* Supprimer des feuilles de calcul.
* Modifier des boîtes de dialogue ou des menus.
Mises en forme conditionnelles et validation de données
* Définir ou appliquer des mises en forme conditionnelles, mais vous pouvez visualiser les effets des
formats conditionnels appliqués avant le partage du classeur.
* Définir ou modifier les restrictions de validation de données ainsi que les messages, mais vous pouvez
visualiser les conséquences des restrictions et des messages définis avant le partage du classeur.
Objets, graphiques, images et liens hypertexte
* Insérer ou modifier des graphiques, des images, des objets ou des liens hypertexte.
* Utiliser les outils de dessin.
Mots de passe
* Attribuer un mot de passe pour protéger des feuilles de calcul individuelles ou le classeur entier.
La protection appliquée avant le partage du classeur reste effective après le partage.
* Modifier ou supprimer des mots de passe. Les mots de passe que vous affectez avant de partager le classeur
demeurent en vigueur une fois que celui-ci est partagé.
Scénarios
* Enregistrer, afficher ou modifier des scénarios.
Plans, groupes et sous-totaux
* Grouper les données ou les structurer sous forme de plan.
* Insérer des sous-totaux automatiques.
Tables de données et tableaux croisés dynamiques
* Créer des tables de données.
* Créer des tableaux croisés dynamiques ou modifier leur présentation.
Macros
* Écrire, modifier, afficher, enregistrer ou affecter des macros.
* Toutefois, vous pouvez enregistrer dans une macro des opérations effectuées dans un classeur partagé ;
enregistrez la macro dans un autre classeur non partagé.
* Dans un classeur partagé, vous pouvez exécuter des macros créées avant le partage du classeur ; cependant, si vous exécutez une macro
incluant une opération non disponible, celle-ci interrompt la macro.
Cette opération est très pratique lorsque vous avez besoin de passer rapidement d'un classeur à un autre ou pour comparer visuellement des données dans plusieurs fichiers.
Avant Excel 2007 :
Cliquez sur le menu "Fenêtre".
Sélectionnez l'option "Réorganiser".
Une boite de dialogue permet de sélectionner le type d'affichage :
* Mosaïque
* Horizontal
* Vertical
* Cascade
Excel 2007 :
Sélectionnez l'onglet "Affichage" dans le ruban.
Cliquez sur le bouton "Réorganiser tout" dans le groupe "Fenêtre".
Cet exemple utilise la bibliothèque ADO pour extraire toutes les données d'une feuille spécifique, dans
tous les classeurs fermés d'un répertoire. Les fichiers sources sont supposés avoir la même structure et
contenir une feuille portant le même nom.
Les données sont importées à la suite dans la feuille active. La macro nécessite d'activer la référence Microsoft
ActiveX Data Objects x.x Library.
'Nécessite d'activer la référence
'Microsoft ActiveX Data Objects x.x Library
Dim
Cn As
ADODB.Connection
Dim
Rs As
ADODB.Recordset
Dim
xConnect As
String
, Cible As
String
Dim
Fichier As
String
, Dossier As
String
, Feuille As
String
Dim
i As
Long
'nom du répertoire contenant les classeurs à regrouper
Dossier =
"C:\nom dossier"
'Nom de la feuille dans les classeurs fermés
'Ne pas oublier le symbole $ après le nom de la feuille
Feuille =
"Feuil1$"
i =
2
Fichier =
Dir
(
Dossier &
"\*.xls"
)
'boucle sur les fichiers du repertoire
Do
While
Len
(
Fichier) >
0
xConnect =
"DRIVER={Microsoft Excel Driver (*.xls)};"
&
_
"ReadOnly=1;DBQ="
&
Dossier &
"\"
&
Fichier
'connection classeur
Set
Cn =
New
ADODB.Connection
Cn.Open
xConnect
'Requete
Cible =
"SELECT * FROM ["
&
Feuille &
"];"
Set
Rs =
New
ADODB.Recordset
Rs.Open
Cible, xConnect, adOpenStatic
, adLockOptimistic
, adCmdText
'Ecriture dans la feuille de calcul
If
Not
Rs.EOF
Then
Cells
(
i, 1
).CopyFromRecordset
Rs
i =
Cells
(
i, 1
).End
(
xlDown).Row
+
1
Rs.Close
Cn.Close
Set
Cn =
Nothing
Set
Rs =
Nothing
Fichier =
Dir
(
)
Loop
MsgBox
"Terminé"
Excel dispose de la fonction =CELLULE
("nomfichier"
) qui permet d'afficher le
chemin, le nom du classeur et le nom de la feuille contenant la formule.
Il suffit ensuite d'écrire une fonction qui va extraire uniquement le nom du classeur.
Le classeur doit être préalablement sauvegardé.
=STXT
(CELLULE
("nomfichier"
);TROUVE
("["
;CELLULE
("nomfichier"
))+1
;TROUVE
("]"
;CELLULE
("nomfichier"
))-
TROUVE
("["
;CELLULE
("nomfichier"
))-1
)
Lorsque vous devez interrompre provisoirement un projet, vous pouvez être intéressé par la mémorisation des tailles de fenêtres et des paramètres d'affichage, pour un gain de temps lors de la reprise.
L'application dispose d'une option pour enregistrer, à n'importe quel moment, l'agencement de
tous les classeurs ouverts dans la session :
Sélectionnez l'onglet 'Affichage' dans le ruban.
Cliquez sur le bouton 'Enregistrer l'espace de travail' dans le groupe 'Fenêtre'.
La fenêtre d'enregistrement propose le nom 'resume.xlw' par défaut.
Vous pouvez modifier ce nom si vous le souhaitez.
L'extension .xlw représente les fichiers d'environnement.
Cliquez sur le bouton 'Enregistrer' pour valider.
Ensuite, fermez tous vos classeurs Excel.
Pour réouvrir tous vos fichiers dans la même disposition qu'au moment de l'enregistrement de
l'espace de travail, double cliquez sur le fichier .xlw depuis l'explorateur Windows ou utilisez
le menu Office/Ouvrir.
Remarque :
Le fichier d'environnement ne pourra pas retrouver un classeur qui aura été déplacé ou renommé
après avoir été mémorisé dans l'espace de travail.