Paul
=IF(WbIsOPen(Wkbk_name), INDIRECT(...), PULL(...))
--
HTH
Bob Phillips
... looking out across Poole Harbour to the Purbecks
(remove nothere from the email address if mailing direct)
"paul" <anon...@discussions.microsoft.com> wrote in message
news:1410a01c44464$6acc5190$a101...@phx.gbl...
But as a kludgy workaround you may use a formula like the
following:
=IF(ISERROR(function_with_INDIRECT),
function_with_PULL,function_with_INDIRECT)
>.
>
If I hadn't screwed up the 'fix' I made to the pull function at the end of
March, it would work with open as well as closed files. It should work with
both, so here's another fix, rather more thoroughly tested than the last version
I spewed forth.
'----- 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-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-28 changes **
'** begin 2004-03-25 changes **
n = InStrRev(Len(xref), 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)
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 -----
--
To top-post is human, to bottom-post and snip is sublime.
--
For everyone's benefit keep the discussion in the newsgroup.
Regards,
Peo Sjoblom
"Harlan Grove" <hrl...@aol.com> wrote in message
news:SKKtc.4537$H4....@www.newsranger.com...
VLOOKUP($A$3,Personal.xls!pull($C$3),5,FALSE)
where C3 contains
'Q:\NHL\[After Purge Accounts List 040518.xls]ImportData'!
$A$1:$H$50
It works successfully when using the old pull function
from closed workbooks but returns #value when the target
book is open.
Any ideas?
Paul
>.
>
Yes. I should test in both XL8/97 and XL2K before posting. I had written and
tested pull under XL8/97, and it seems XL2K and later may handle some things
differently. See the comments for details. This version works with the
sample workbooks you sent me.
'----- 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 **
Just tested this version in Excel 2003 and it works fine..
Cheers
Paul
>-----Original Message-----
>"Paul" <anon...@discussions.microsoft.com> wrote...
>>The following VLOOKUP returns #value for both open and
>>closed workbooks when using the pull function posted
below
>>
>>VLOOKUP($A$3,Personal.xls!pull($C$3),5,FALSE)
>>where C3 contains
>>'Q:\NHL\[After Purge Accounts List 040518.xls]
ImportData'!
>>$A$1:$H$50
>>
>>It works successfully when using the old pull function
>>from closed workbooks but returns #value when the target
>>book is open.
>>Any ideas?
>....
>.
>
=CELL("contents",'P:\Blanco Kitchen - 200447\[200447-Process
Map.xls]Actions'!$C$4:$D$4)
It works fine if the Blanco Kitchen doc is open, but I have over twenty
projects to tract simultaneously and it is a hassle to open all of them
to update the master doc.
Any help would be appreciated.
Regards,
Mark Benzell
Inside & Out Remodelers
='P:\Blanco Kitchen - 200447\[200447-Process Map.xls]Actions'!$C$4
(not quite sure why you were using two cells (c4:d4), though.)
--
Dave Peterson