链接到基于另一个单元格的外部工作簿

时间:2017-02-26 22:24:41

标签: excel excel-vba excel-formula vba

我正在使用Excel中的动态外部工作簿数据引用,有人可以帮助您考虑以下事项:

我在A2的工作簿中有  = 'C:\'&A1&' Reports\[1.xls]Sheet1'!C1)

A1将包含

  

文件夹A
  文件夹B

因此,根据A1中的值,我想指向

  

D:\文件夹A报告\ 1.xls
  D:\ Folder B Reports \ 1.xls

我怎样才能做到这一点?

谢谢!

3 个答案:

答案 0 :(得分:2)

间接是你需要的功能:

=INDIRECT("'C:\" & A1 & " Reports\[1.xls]Sheet1'!C1")

我看到的问题是,如果工作表未打开,它将无法解决。

答案 1 :(得分:1)

由于INDIRECT并不适用于已关闭的书籍而且打开它们的成本很高,因此正常的原因是

  1. 使用VBA创建链接。
  2. 使用 Morefunc 插件中的Indirect.Ext
  3. 我喜欢的方法,使用XLM Harlan Grove在下面的 pull 函数中进行了改进。
  4. 用于您的目的:

    =pull("'C:\"&A1&"\"&"[1.xls]Sheet1'!C1")

    来自https://numbermonger.wordpress.com/2012/02/11/excel-pull-function-creating-dynamic-links-to-closed-workbooks/

    拉动功能

    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
    

答案 2 :(得分:0)

Excel公式中对已关闭文件的外部引用不是动态的,所以可能是这样的:

=IF(A1="Folder A", 'C:\Folder A Reports\[1.xls]Sheet1'!C1,
                   'C:\Folder B Reports\[1.xls]Sheet1'!C1)