Salut
J'ai trouvé ç sur 'Excelabo', mais n'ai jamais eu à le tester. JE ne sais pas non plus si ça répondra entièrement à ta question.
Liaison vers un classeur fermé
Pourquoi ne peut-on pas utiliser INDIRECT pour établir une liaison vers un classeur fermé?
=INDIRECT("'C:\Mes Documents\[truc.xls]Feuil1'!$A$1") marche très bien quand truc est ouvert, mais renvoie #REF! dès que truc.xls est fermé alors que ='C:\Mes Documents\[truc.xls]Feuil1'!$A$1 marche très bien même si truc est fermé
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!