une FN_Recherche (ouvrir et fermer feuille externe !)
1 réponse
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.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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.
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.
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.