OVH Cloud OVH Cloud

une FN_Recherche (ouvrir et fermer feuille externe !)

1 réponse
Avatar
YannX
Bonjour,

Ma fonction recherche avance (la nuit porta conseil...;-)
Mais il me reste un probleme : pouvez-vous me donner LA solution ?

Ci-joint mon "grand-oeuvre" (merci a Isabelle de m'avoir "mis le point après
Application ! ")

Private Function FN_Search(cellul As Range, tabl As Range, colib As String,
titr As Range)
'
FN_Search = " #N/A#! "
' ===================> il faut que le fichier cité dans le Range tabl
soit ouvert !!!!!!!!! => comment le faire
FN_Search = Application.VLookup(cellul, tabl, Application.Match(colib,
titr, 0), 0) '
' ===================> et il faut explicitement lancer un recalcul ?
(genant en tests mais bof.... voir citation plus bas ! )
Exit_FN_Search:
End Function

Donc le problème : le <tabl> est un range éventuellement en provenance d'un
fichier externe (qui peut etre non ouvert !)
Comment ouvrir (et refermer ensuite s'il n'etait pas ouvert, c'est-à-dire en
MEMOIRE VIVE de ce poste) ce fichier Excel dans la fonction d'appel ?
ce ficheir étant de la forme : <tabl> = RANGE( <fic> & "données!table " )

Merci

PS Références balayées => laquelle n'ai-je pas trouvé ?

http://www.excelabo.net/xl/fichiers.php#dejàouvertppt Comment savoir si un
fichier Excel, Word ou Powerpoint et déjà utilisé sans ouvrir le fichier ?
Inapplicable car le fichier peut etre ouvert en mise-à-jour par un autre
poste !
Cette fonction devrait faire l'affaire. ! ! ! Negatif, voir plus haut

Function IsFileOpen(filename As String)
Dim filenum As Integer, Errnum As Integer
On Error Resume Next
filenum = FreeFile()
Open filename For Input Lock Read As #filenum
Close filenum
Errnum = Err
On Error GoTo 0
Select Case Errnum
Case 0
IsFileOpen = False
Case 70
IsFileOpen = True
End Select
End Function PSources : J'ai rencontré le meme problème explicité
Pour information (citation de
http://www.excelabo.net/xl/fichiers.php#indirectfermé)

Excel 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..



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

1 réponse

Avatar
isabelle
bonjour Yann,

je ne crois pas que l'on puisse ouvrir et refermer un fichier à partir
d'une fonction, par contre pour le recalcul place cette ligne au début
du code,

Application.Volatile

Volatile, méthode
Cette méthode marque comme volatile une fonction personnalisée. Une
fonction volatile doit être recalculée chaque fois qu'un calcul est
effectué dans une cellule quelconque de la feuille de calcul.

isabelle


Bonjour,

Ma fonction recherche avance (la nuit porta conseil...;-)
Mais il me reste un probleme : pouvez-vous me donner LA solution ?

Ci-joint mon "grand-oeuvre" (merci a Isabelle de m'avoir "mis le point après
Application ! ")

Private Function FN_Search(cellul As Range, tabl As Range, colib As String,
titr As Range)
'
FN_Search = " #N/A#! "
' ===================> il faut que le fichier cité dans le Range tabl
soit ouvert !!!!!!!!! => comment le faire
FN_Search = Application.VLookup(cellul, tabl, Application.Match(colib,
titr, 0), 0) '
' ===================> et il faut explicitement lancer un recalcul ?
(genant en tests mais bof.... voir citation plus bas ! )
Exit_FN_Search:
End Function

Donc le problème : le <tabl> est un range éventuellement en provenance d'un
fichier externe (qui peut etre non ouvert !)
Comment ouvrir (et refermer ensuite s'il n'etait pas ouvert, c'est-à-dire en
MEMOIRE VIVE de ce poste) ce fichier Excel dans la fonction d'appel ?
ce ficheir étant de la forme : <tabl> = RANGE( <fic> & "données!table " )

Merci

PS Références balayées => laquelle n'ai-je pas trouvé ?

http://www.excelabo.net/xl/fichiers.php#dejàouvertppt Comment savoir si un
fichier Excel, Word ou Powerpoint et déjà utilisé sans ouvrir le fichier ?
Inapplicable car le fichier peut etre ouvert en mise-à-jour par un autre
poste !
Cette fonction devrait faire l'affaire. ! ! ! Negatif, voir plus haut

Function IsFileOpen(filename As String)
Dim filenum As Integer, Errnum As Integer
On Error Resume Next
filenum = FreeFile()
Open filename For Input Lock Read As #filenum
Close filenum
Errnum = Err
On Error GoTo 0
Select Case Errnum
Case 0
IsFileOpen = False
Case 70
IsFileOpen = True
End Select
End Function PSources : J'ai rencontré le meme problème explicité
Pour information (citation de
http://www.excelabo.net/xl/fichiers.php#indirectfermé)

Excel 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..

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