2017-02-26 98 views
1

我的工作动态的外部工作簿的数据在Excel中引用的外部工作簿可以有人帮考虑以下几点:链接到基于另一个细胞

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

A1将包含任一

文件夹A
文件夹B

所以取决于A1的价值,我想以指向

d:\文件夹A报告\ 1.xls
d:\文件夹B报告\ 1.xls

我该如何做到这一点?

谢谢!

+0

你可以使用一个IF语句或VLOOKUP表。这当然假设你只需要返回一个取决于查找值的值。 –

+0

谢谢你的帮助!我只是希望将文件夹A填充到A2的路径中,就像调用变量一样。这样做不可能吗? – Andrew

+0

这当然是可能的,但我很抱歉,因为我不完全确定你要完成什么。您当然可以根据A1的值填充路径,并且有几种方法可以实现此目的。正如我所指出的,查找是这样做的一种方式。我觉得虽然你想要一个公式自己找到路径,而不需要在表格中提供它。这也是可能的,但这将进入VBA的领域,而不仅仅是Excel的公式。 –

回答

2

间接是你需要的功能:

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

我看到,虽然问题是如果该表不是打开它不会解决。

+0

谢谢你的回答。如果我硬编码的路径,我可以简单地打开工作簿,并关闭它,数据将更新...所以我写了一个宏,将打开我需要的所有电子表格,并关闭它们...对于INDIRECT函数,电子表格必须保持打开状态,还是可以使用相同的宏来打开和关闭我的外部源? – Andrew

+0

打开它,刷新它,关闭它,它将保持答案。我不得不问,为什么不直接从工作表中复制代码中的数据,并将它作为一个值放入目标工作表中,并且在运行时没有依赖关系? –

+0

手动操作太多了。很多标签和来源......迫不及待地回家尝试一下。再次感谢! – Andrew

0

由于INDIRECT不能在封闭的书工作,它是有昂贵的开他们,那么这种情况的正常soutions是

  1. 创建VBA一个链接。从Morefunc插件。
  2. 我的首选方法是用XLM其中Harlan Grove在他的下拉功能有所改进。

要使用你的目的:

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

到关闭文件的外部引用在Excel公式不能动态的,所以也许如此mething这样的:

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