Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Fonction INDIRECT.EXT qui ne fonctionne pas

5 réponses
Avatar
Robert
Bonjour,

Sur vos conseils, j'ai utilisé la fonction "INDIRECT.EXT" de Laurent Longre,
mais je n'arrive pas a la faire fonctionner lorsque le fichier lié est fermé
.
Pouvez vous m'aider à résoudre ce problème

Merci Robert

5 réponses

Avatar
Starwing
Bonjour Robert,

Sur vos conseils, j'ai utilisé la fonction "INDIRECT.EXT"


Je n'étais pas là, mais bon....

La fonction INDIRECT.EXT de Laurent Longré
fonctionne de cette maniere:
=INDIRECT.EXT("'c:Excel[Excel.xls]Feui1'!$A$1") ou
=INDIRECT.EXT("'c:Excel[Excel.xls]Feui1'!$A$1";VRAI)
Renvoie la valeur de la cellule A1 d'un classeur fermé.

=INDIRECT.EXT("'c:Excel[Excel.xls]Feui1'!$A$1";FAUX)
Ne renvoie pas la mise à jour de la valeur de la cellule
A1 d'un classeur fermé. Pour ce faire, il faut appuyer sur
Ctrl + Alt + F9

De plus, la fonction SOMMEPROD ( qui est déjà existante
dans Excel )fait le même genre de truc:
=SOMMEPROD(('c:Excel[Excel.xls]Feuil1'!$A$1))
Renvoie la valeur de la cellule A1 d'un classeur fermé...

A toi de voir...

Starwing

Avatar
Robert
Oui, mais j'ai des problème lorsque on fait référence a une plage, la
fonction ne marche que si le fichier lié est ouvert
ex:

Avec D2 qui contient le chemin "c:monrepertoiremonfichier[monOnglet]'!A1
=INDIRECT.EXT(D2) FONCTIONNE mais

Avec D20 qui contient :
"c:monrepertoiremonfichier[monOnglet]'!$A$3:$E$34"
=RECHERCHEV(G1;INDIRECT.EXT(D20);2) ne fonctionne pas lorsque le fichier
n'est pas ouvert

Evidemment c'est le deuxieme exemple que j'ai besoin d'effectuer.
qu'en pensez vous

Robert
Avatar
Starwing
Bonsoir Robert,

Malheureusement, pour ce que tu veux faire, la fonction
INDIRECT.EXT ET SOMMEPROD sont inefficaces. Tu ne pourras
donc pas utiliser INDIRECT.EXT et RECHERCHEV.

Pour contrer ce genre de problème, Harlan Grove a écrit ce
code qui fonctionne très bien...
Pour ce genre de problème, utilise plutôt ceci.

'----- begin VBA -----
Function pull(xref As String) As Variant
'inspired by Bob Phillips and Laurent Longre
'but written by Harlan Grove
'--------------------------------------------------------
---­------
'Copyright (c) 2003 Harlan Grove.
'
'This code is free software; you can redistribute it
and/or modify
'it under the terms of the GNU General Public License as
published
'by the Free Software Foundation; either version 2 of
the License,
'or (at your option) any later version.
'--------------------------------------------------------
---­------
'2004-05-30
'still more fixes, this time to address apparent
differences between
'XL8/97 and later versions. Specifically, fixed the
InStrRev call,
'which is fubar in later versions and was using my own
hacked version
'under XL8/97 which was using the wrong argument syntax.
Also either
'XL8/97 didn't choke on CStr(pull) called when pull
referred to an
'array while later versions do, or I never tested the
2004-03-25 fix
'against multiple cell references.
'--------------------------------------------------------
---­------
'2004-05-28
'fixed the previous fix - replaced all instances
of 'expr' with 'xref'
'also now checking for initial single quote in xref, and
if found
'advancing past it to get the full pathname [dumb,
really dumb!]
'--------------------------------------------------------
---­------
'2004-03-25
'revised to check if filename in xref exists - if it
does, proceed;
'otherwise, return a #REF! error immediately - this
avoids Excel
'displaying dialogs when the referenced file doesn't
exist
'--------------------------------------------------------
---­------


Dim xlapp As Object, xlwb As Workbook
Dim b As String, r As Range, C As Range, n As Long


'** begin 2004-05-30 changes **
'** begin 2004-05-28 changes **
'** begin 2004-03-25 changes **
n = InStrRev(xref, "")


If n > 0 Then
If Mid(xref, n, 2) = "[" Then
b = Left(xref, n)
n = InStr(n + 2, xref, "]") - n - 2
If n > 0 Then b = b & Mid(xref, Len(b) + 2, n)


Else
n = InStrRev(Len(xref), xref, "!")
If n > 0 Then b = Left(xref, n - 1)


End If


'** key 2004-05-28 addition **
If Left(b, 1) = "'" Then b = Mid(b, 2)


On Error Resume Next
If n > 0 Then If Dir(b) = "" Then n = 0
Err.Clear
On Error GoTo 0


End If


If n <= 0 Then
pull = CVErr(xlErrRef)
Exit Function
End If
'** end 2004-03-25 changes **
'** end 2004-05-28 changes **


pull = Evaluate(xref)


'** key 2004-05-30 addition **
If IsArray(pull) Then Exit Function
'** end 2004-05-30 changes **


If CStr(pull) = CStr(CVErr(xlErrRef)) Then
On Error GoTo CleanUp 'immediate clean-up at this
point


Set xlapp = CreateObject("Excel.Application")
Set xlwb = xlapp.Workbooks.Add 'needed
by .ExecuteExcel4Macro


On Error Resume Next 'now clean-up can wait


n = InStr(InStr(1, xref, "]") + 1, xref, "!")
b = Mid(xref, 1, n)


Set r = xlwb.Sheets(1).Range(Mid(xref, n + 1))


If r Is Nothing Then
pull = xlapp.ExecuteExcel4Macro(xref)


Else
For Each C In r
C.Value = xlapp.ExecuteExcel4Macro(b & C.Address
(1, 1, xlR1C1))
Next C


pull = r.Value


End If


CleanUp:
If Not xlwb Is Nothing Then xlwb.Close 0
If Not xlapp Is Nothing Then xlapp.Quit
Set xlapp = Nothing


End If


End Function
'----- end VBA -----


Exemple à exécuter:

=RECHERCHEV("Valeur cherchée";PULL("'C:Excel[Excel.xls]
Sheet1'!$A$1:$B$10");2;0)


Starwing
Avatar
Robert
Merci pour ta participation a la résolution de mon problème

J'ai essayé la fonction PULL, mais l'exécution me semble très longue (j'ai
env 60 cellule qui vont utiliser cette fonction), la je l'ai essayée sur 2
cellule.
N'y a t-il pas moyen d'accélérer le traitement, (je n'utilise peut-etre pas
la bonne méthode, je l'ai collée dans un module VB)

Autre question :
Dans l'exemple que tu m'as indiqué ci dessous, pour le parametre
"Valeur_Proche" de la fonction RECHERCHEV tu a mis 0, je ne comprend pas
pourquoi .
Ce qui est sur sans ce parametre l'ensemble de la formule ne fonctionne pas
et me retourne une mauvaise valeur.

Robert


Exemple à exécuter:

=RECHERCHEV("Valeur cherchée";PULL("'C:Excel[Excel.xls]
Sheet1'!$A$1:$B$10");2;0)


Starwing
Avatar
Starwing
Bonsoir Robert,

J'ai essayé la fonction PULL, mais l'exécution me semble
très longue


C'est très possible que l'éxécution de la procédure prenne
un certain temps, malheureusement, il n'existe pas de
solution plus rapide. A moins, peut-être, dépendamment du
résultat souhaité... Une formule telle que:

=INDEX(PULL("'C:Excel[Excel.xls]Feuil1'!
$b$1:$b$10");EQUIV($A$1;PULL("'c:Excel[Excel.xls]Feuil1'!
$a$1:$a$10");0))

la bonne méthode, je l'ai collée dans un module VB)


C'est exactement là qu'il fallait mettre le code!

Dans l'exemple que tu m'as indiqué ci dessous, pour le
parametre

"Valeur_Proche" de la fonction RECHERCHEV tu a mis 0, je
ne comprend pas

pourquoi .


La valeur 0 ou FAUX dans cette formulation, exige un
résultat EXACT de la valeur cherchée. Si elle ne le trouve
pas, la formule retourneras #NA!.
Normalement, la valeur 1 ou VRAI, n'exigera pas un
résultat EXACT de la valeur cherchée mais permettra de
trouver le résultat le plus proche. Mais avec la fonction
PULL, il est possible que l'on ne peut pas utiliser la
valeur 1 ou VRAI. Il faudrait vérifier.


Starwing