Accueil
Accueil Le Club Delphi Kylix C C++ Java J2EE DotNET & C# Visual Basic Access Pascal Dev Web PHP ASP XML UML SQLSGBD Windows Linux Autres
logo
Sommaire > Les classeurs
        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 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 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 ?
        Faut-il préciser l'extension lorsque l'on manipule un classeur par macro ?
        3.1. Les sauvegardes (13)
                Comment fermer un classeur sans enregistrer les changements ?
                Comment sauvegarder un classeur par macro ?
                Comment enregistrer les modifications dans un classeur ?
                Comment créer une copie de sauvegarde du classeur actif ?
                Comment fermer un classeur en sauvegardant les modifications ?
                Comment fermer un classeur sans sauvegarder les modifications ?
                Comment afficher la boite de dialogue 'Enregistrer sous' ?
                Comment bloquer l'utilisation du bouton 'Enregistrer sous' par macro ?
                Comment sauvegarder chaque feuille au format htm ?
                Comment protéger un classeur par mot de passe, dans Excel2007 ?
                Quelle est la différence entre les extensions xlsx et xlsm pour sauvegarder des classeurs Excel 2007 ?
                Comment sauvegarder un classeur sur une clé USB dont la lettre racine peut varier ?
                Pourquoi les modifications de code VBA ne sont pas prises en compte dans mon complément .xla, lorsque je ferme Excel ?
        3.2. Les propriétés du classeur (9)
                Comment lire les propriétés dans le classeur ?
                Comment modifier une propriété prédéfinie ?
                Comment ajouter une propriété personnalisée dans le classeur ?
                Comment lire, modifier ou supprimer les propriétés personnalisées ?
                Comment lire Les propriétés prédéfinies d'un classeur fermé ?
                Comment modifier Les propriétés prédéfinies d'un classeur fermé ?
                Comment ajouter une propriété personnalisée dans un classeur fermé ?
                Comment lire une propriété personnalisée dans un classeur fermé ?
                Comment accéder aux propriétés du classeur dans Excel 2007 ?

precedent    sommaire    suivant   


Comment ajouter un classeur contenant juste une feuille ?
auteur : Bidou
Il y a deux méthodes. On peut restreindre le nombre de feuilles de calcul créées dans un nouveau classeur

Vba

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

Vba

Application.Workbooks.Add xlWBATWorksheet


contient une feuille de calcul

Vba

Application.Workbooks.Add xlWBATChart


Contient une feuille graphique



Comment ouvrir un classeur ?
auteur : Bidou
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

Vba

Application.Workbooks.Open "d:\tuto.xls"



On peut aussi passer par la méthode GetOpenFilename pour laisser l'utilisateur sélectionner le fichier

Vba

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


Comment travailler sur deux classeurs ?
auteur : Bidou
Dans ce cas on utilises des variables:

Vba

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



Je ne comprends pas la protection du classeur !
auteur : Bidou
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 :

Vba

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.



Comment dupliquer une plage sur plusieurs feuilles du classeur ?
auteur : Bidou
On utilise la méthode FillAcrossSheet de l'objet WorkBook

Vba

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.



Comment empêcher la fermeture de mon classeur ?
auteur : Bidou
Dans le module ThisWorkbook on met

Vba
 
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

Vba

Application.EnableEvents = False
ThisWorkbook.Close True

Comment utiliser les évènements du module objet ThisWorkbook ?
auteur : SilkyRoad
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.



Quelle est la différence entre les propriétés ActiveWorkbook et ThisWorkbook ?
auteurs : Bidou, Etienne Bar, SilkyRoad
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.




Après l'appel de OpenLinks plus de possibilité de savoir aisément quel classeur est désigné par ActiveWorkbook.



Comment convertir une macro complémentaire XLA en classeur Excel XLS ?
auteur : SilkyRoad
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.



Comment récupérer les données dans un classeur Excel endommagé ?
auteur : SilkyRoad
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.

Consultez le tutoriel.

Nota:
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.



Comment lire et écrire dans des classeurs fermés ?
auteur : SilkyRoad
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 Excel2007 (xlsx et xlsm), en utilisant le modèle ADO, appliquez la chaîne de connexion suivante:

Vba

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




Comment se déplacer rapidement entre les classeurs ouverts ?
auteur : SilkyRoad
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.





Comment désactiver l'évènement Workbook_Open d'un classeur ouvert par macro ?
auteur : SilkyRoad
Appliquez la valeur False à la propriété EnableEvents. De cette manière, la procédure évènementielle Workbook_Open ne se déclenchera pas.

Vba

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

Comment convertir un classeur au format PDF ou XPS ?
auteur : SilkyRoad
Microsoft Office system 2007 dispose d'un complément gratuit pour enregistrer ou exporter vos fichiers aux formats PDF et XPS.

Description de la prise en charge d'autres formats de fichiers, tels que les formats PDF et XPS.

Installez et utilisez le complément pour convertir un document Office au format PDF ou XPS.

Comment enregistrer un fichier au format PDF


Si vous souhaitez ensuite créer un enregistrement pdf par macro, utilisez cette syntaxe:

Vba

'Attention:
'Si le fichier existe déjà il sera éceasé 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:

Vba

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




Comment vérifier la compatibilité d'un classeur Excel 2007 avec les versions Excel antérieures ?
auteur : SilkyRoad
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 65536ième ligne et de la 256ieme 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.

Téléchargez le pack de compatibilité.

Comment ouvrir et enregistrer des Excel 2007 dans des versions antérieures d'Office.



Comment supprimer les données confidentielles contenues dans le classeur ?
auteur : SilkyRoad
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 Excel2007, 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.



Comment créer un nouveau modèle dans Excel 2007 ?
auteur : SilkyRoad
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... ) .



Comment identifier automatiquement l'ouverture de nouveaux classeurs ?
auteur : SilkyRoad
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é.

Vba

Option Explicit
 
Public WithEvents XL As Excel.Application
 

Private Sub Workbook_Open()
  Set XL = Excel.Application
End Sub
 
 
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

Comment suivre et auditer les révisions dans un classeur partagé ?
auteur : SilkyRoad
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 Excel2007, cette fonction est accessible depuis l'onglet "Révision", groupe "Modifications".



Comment vérifier si un classeur est déjà ouvert ?
auteur : SilkyRoad
Vba

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

Comment transférer les données entre 2 classeurs fermés ?
auteur : SilkyRoad
"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".

Vba

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
lien : Lire et écrire dans les classeurs Excel fermés

Comment créer un journal de suivi des consultations d'un classeur en réseau ?
auteur : SilkyRoad
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:

Vba

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.



Comment ouvrir automatiquement un classeur spécifique à chaque démarrage d'Excel ?
auteur : SilkyRoad
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



Faut-il préciser l'extension lorsque l'on manipule un classeur par macro ?
auteur : Michel Gaboly
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,

Vba

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:

Vba

Workbooks("MonClasseur.xls").Activate



Il est important de noter que:

Vba

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:

Vba

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:

Vba

    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 :

Vba

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 Excel2007, "xlsx" et "xlsm".



Une seconde piste consiste simplement à affecter le classeur à une variable objet :

Vba

Dim wb as Workbook
    Workbooks("Document")
    Set wb = ActiveWorkbook
    ' ...


Par la suite, on peut utiliser

Vba

wb.Activate


ou

Vba

wb.Close


et cela devrait fonctionner indépendamment des infos fournies ou non pour l'extension.



precedent    sommaire    suivant   

Consultez les autres F.A.Q's


Les sources présentés sur cette pages sont libre de droits, et vous pouvez les utiliser à votre convenance. Par contre cette page de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright ©2008  Developpez LLC. Tout droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérets. Cette page est déposée à la SACD.

Vos questions techniques : forum d'entraide Accueil - Publiez vos articles, tutoriels, cours et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones. Nous contacter - Copyright 2000..2005 www.developpez.com