Voir aussi
Fermer sans enregistrer
Comment fermer excel sans enregistrer le classeur et sans avoir de message d'alerte ?
Deux solutions à mettre dans Thisworkbook

Pour qu'excel ne pose pas la question et ne sauvegarde pas

Private Sub Workbook_BeforeClose(Cancel As Boolean)
ActiveWorkbook.Close savechanges:=False
End Sub

Autre solution, faire croire à excel que l fichier est déjà sauvegardé:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
ActiveWorkbook.Saved = True
ActiveWorkbook.Close
End Sub
Patrice,
Ajouté ou modifié le 19/12/2004 (N°1547)
Transfert en bloc depuis un classeur fermé (ADO)
Est ce qu'on peut sous un seul appel de fonction transférer les valeurs d'un bloc de cellules "source"sur un classeur fermé à un bloc de cellules "cible" ?
Il est possible de lire et de récupérer des plages entières de cellules dans un
classeur fermé en utilisant les objets ADO (ActiveX Data Objects).
Ci-dessous un exemple de code fonctionnel, à recopier dans un module standard du
VBAProject de ton classeur "cible". Ce classeur "cible" doit comporter une
référence à la bibliothèque
Microsoft ActiveX Data Objects 2.x Library.
C'est la procédure GetExternalData qui fait le travail. La procédure LitDatas se
contente de l'appeler en lui passant les paramètres voulus et en renvoyant les
données récupérées à l'endroit voulu.

'====================
Sub LitDatas()
Dim Fich$, Arr

Fich = "d:\TestDataToRead.xls"
'récup des données à partir de l'adresse d'une plage de cellules
GetExternalData Fich, "Feuil1", "A10:G20", False, Arr
'récup des données à partir du nom d'une plage de cellules
' GetExternalData Fich, "", "essainom", False, Arr
With ThisWorkbook.Sheets("Feuil1")
.Range("A1", .Cells(UBound(Arr, 1), UBound(Arr, 2))).Value = Arr
End With

End Sub
=======================
'renvoie les valeurs d'une plage de cellules (srcRange)
'd'une feuille (srcSheet) d'un fichier (srcFile) fermé
'dans un tableau (outArr)
'le paramètre TTL indique si la plage a ou non une ligne d'entêtes
Sub GetExternalData(srcFile As String, _
srcSheet As String, _
srcRange As String, _
TTL As Boolean, _
outArr As Variant)
'd'après Héctor Miguel, mpep
Dim myConn As ADODB.Connection, myCmd As ADODB.Command
Dim HDR As String, myRS As ADODB.Recordset, RS_n As Integer, RS_f As Integer
Dim Arr

Set myConn = New ADODB.Connection
If TTL = True Then HDR = "Yes" Else HDR = "No"
myConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & srcFile & ";" & _
"Extended Properties=""Excel 8.0;" & _
"HDR=" & HDR & ";IMEX=1;"""
Set myCmd = New ADODB.Command
myCmd.ActiveConnection = myConn
If srcSheet = "" _
Then myCmd.CommandText = "SELECT * from `" & srcRange & "`" _
Else myCmd.CommandText = "SELECT * from `" & srcSheet & "$" & srcRange & "`"
Set myRS = New ADODB.Recordset
myRS.Open myCmd, , adOpenKeyset, adLockOptimistic
ReDim Arr(1 To myRS.RecordCount, 1 To myRS.Fields.Count)
myRS.MoveFirst
Do While Not myRS.EOF
For RS_n = 1 To myRS.RecordCount 'lignes
For RS_f = 0 To myRS.Fields.Count - 1 'colonnes
Arr(RS_n, RS_f + 1) = myRS.Fields(RS_f).Value
Next
myRS.MoveNext
Next
Loop
myConn.Close
Set myRS = Nothing
Set myCmd = Nothing
Set myConn = Nothing

outArr = Arr

End Sub
Frédéric Sigonneau, (N°694)
INDIRECT et les fichiers fermés
Est-il normal que je ne puisse pas utiliser INDIRECT pour établir une liaison vers un classeur fermé ? =INDIRECT(\\\"'C:\Mes Documents\[rien.xls]Feuil1'!$A$1\\\") qui marche très bien quand rien est ouvert, renvoie #REF! dès que rien.xls est fermé alors que ='C:\Mes Documents\[rien.xls]Feuil1'!$A$1 marche très bien même si rien est fermé
Oui c'est normal..

En gros : quand le classeur est en mode recalcul, Excel n'effectue
aucune opération susceptible d'interférer avec les calculs en cours. En
l'occurence, aller chercher le contenu d'un classeur fermé supposerait
qu'il établisse d'abord une liaison temporaire, lise la cellule, et
détruise ensuite cette liaison. Comme ce type d'action est verrouillé en
mode recalcul, INDIRECT échoue.

C'est pour la même raison qu'il est impossible, par exemple, d'ouvrir un
nouveau classeur ou de modifier le contenu d'une plage à l'intérieur
d'une Function appelée par une formule de cellule.

Une parade toutefois, à l'aide de VBA :

Function RECUP(Fichier As String, Feuille As String, _
Ligne As Long, Col As Integer)
With CreateObject("Excel.Application").Workbooks.Open(Fichier)
RECUP = .Worksheets(Feuille).Cells(Ligne, Col)
.Close False
End With
End Function

Ensuite, par exemple =RECUP("C:\Test.xls";"Feuil1";5;10) pour récupérer
la cellule Feuil1!J5 de ce classeur fermé (note qu'il est quand-même
temporairement ouvert par la fonction...)

Ca marche pour la seule raison que la fonction lit le contenu du
classeur fermé par l'intermédiaire d'une nouvelle instance d'Excel.
Celle-ci étant indépendante de la session active, le "verrouillage" n'a
plus lieu.

Attention, chaque appel de RECUP lançant une nouvelle instance d'Excel,
cette fonction n'est pas très rapide à l'exécution... à utiliser donc
avec modération!
Laurent Longre,
Ajouté ou modifié le 25/10/2003 (N°693)
Fermeture automatique d'un classeur
Est-il possible de sauvegarder et fermer un fichier Excel automatiquement 2 minutes après son ouverture ?
dans le module Thisworkbook
Private Sub Workbook_Open()
Application.OnTime Now + TimeValue("00:02:00"), "Sortie"
End Sub

dans un module standard
Sub sortie()
ThisWorkbook.Close
End Sub
Thierry Rural, (N°692)