|  | 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 
  
 
  |  
  |  | 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
 
  |  
  |  | 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 
  
 
  |  
  |  | 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.
  
 
  |  
  |  | 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.
  
 
  |  
  |  | 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
  |  
  |  
  |  | 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.
 
  |  
  |  | 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.
  
 
  |  
  |  | 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.
  
 
  |  
  |  | 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. 
 
 
  |  
  |  | 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
    
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
  |  
 
  
 
  |  
  |  | 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.
  
  |  
  |  | auteur : SilkyRoad |  | Vba |  
Sub OuvertureClasseur()
    Dim Fichier As String
    Dim Wb As Workbook
    
    Fichier = "C:\monClasseurBase.xls"
    
    
    Application.EnableEvents = False
    
    Set Wb = Workbooks.Open(Filename:=Fichier)
    
    Application.EnableEvents = True
    
    
    
    
End Sub
  |  
  |  
  |  | auteur : SilkyRoad |  | Vba |  
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
  |  
 
  
 
  |  
  |  | 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.
				
				
				
  |  
  |  | 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.
	
 
  |  
  |  | 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...  ) .
  
 
  |  
  |  | 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)
    
    If Wb.Name <> ThisWorkbook.Name Then MsgBox Wb.Name
End Sub
  |  
  |  
  |  | 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".
  	
 
  |  
  |  | 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
  |  
  |  
  |  | 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
 
Cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
    "Data Source=" & ThisWorkbook.Path & "\Classeur1_Fermé.xls;" & _
    "Extended Properties=""Excel 8.0;HDR=NO;"""
               
oProdRS.Open "SELECT * FROM [Feuil1$]", Cn, adOpenStatic
 
 
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;"""
 
Set oRS = New ADODB.Recordset
oRS.Open "Select * from [Feuil1$]", oConn, adOpenKeyset, adLockOptimistic
    
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
  |  
  |  | 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
Private Const Chemin As String = "J:\dossier\journal.txt"
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
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.
  
 
  |  
  |  | 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
  
 
  |  
  |  | 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
            
                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
            
                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
    
        If Not IsMissing(Chemin) Then
            Doc = Chemin & Application.PathSeparator & Doc
        End If
    
        If Not IsMissing(MAJLiaisons) Then
            Workbooks.Open Doc, MAJLiaisons
        Else
            Workbooks.Open Doc
        End If
    
        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
            
            
            Exit Sub
        End If
    On Error GoTo Ouvre
    Workbooks(Doc & ".xls").Activate
        If Err.Number = 0 Then
            
            
            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 :
  
 
  
	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
  
 
  
	ou 
	
  
 
  
	et cela devrait fonctionner indépendamment des infos fournies ou non pour l'extension. 
  
 
  |  
 
 
 
						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. 
												 |