Gmail Calendar Documents Reader Web more »
Recently Visited Groups | Help | Sign in
Google Groups Home
Message from discussion INDIRECT.EXT function, PULL function
The group you are posting to is a Usenet group. Messages posted to this group will make your email address visible to anyone on the Internet.
Your reply message has not been sent.
Your post was successful
 
From:
To:
Cc:
Followup To:
Add Cc | Add Followup-to | Edit Subject
Subject:
Validation:
For verification purposes please type the characters you see in the picture below or the numbers you hear by clicking the accessibility icon. Listen and type the numbers you hear
 
Harlan Grove  
View profile  
 More options May 31 2004, 3:09 am
Newsgroups: microsoft.public.excel.worksheet.functions
From: "Harlan Grove" <hrln...@aol.com>
Date: Mon, 31 May 2004 07:09:20 GMT
Local: Mon, May 31 2004 3:09 am
Subject: Re: INDIRECT.EXT function, PULL function
"Paul" <anonym...@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?

...

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

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


    Reply to author    Forward  
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.

Create a group - Google Groups - Google Home - Terms of Service - Privacy Policy
©2009 Google