如何在 Excel 中对另一个工作簿进行相对引用?
Posted
技术标签:
【中文标题】如何在 Excel 中对另一个工作簿进行相对引用?【英文标题】:How do I make a relative reference to another workbook in Excel? 【发布时间】:2012-07-22 16:45:36 【问题描述】:我正在制作一张表格来计算价格。该工作表必须参考其他几个工作簿才能获得不同组件的价格。这在我的计算机上运行良好,但是当我将它们移动到服务器或另一台计算机时,它找不到引用。
我的文件夹结构如下:
Folder
|-- prices.xlsx
|-- Fixed Components
| |-- ComponentsA.xlsx
| +-- ComponentsB.xlsx
|
+-- Variable Components
|-- ComponentsC.xlsx
+-- ComponentsD.xlsx
prices.xlsx
是引用其他工作表的主工作表。在我的计算机上,它使用绝对路径构建引用,因此当我复制文件时,路径会固定在我的计算机上,而不是引用另一台 PC 上的文件。
有什么方法可以使引用相对,以便我可以在主工作表中放入='\Variable Components\[ComponentsC.xlsx]Sheet1'!A1
之类的内容。我不想为此使用 VBA,因为人们不倾向于信任宏,然后抱怨这些功能不起作用。
【问题讨论】:
Excel 链接应在另一台电脑上自动更新,前提是文件夹结构保留,请参阅:support.microsoft.com/kb/328440 感谢您的回答,它确实应该这样做,但我似乎无法让它工作。它在本地移动工作表时有效,但是当我将它们复制到服务器(映射的网络驱动器)时,它仍在我的机器上寻找文件。 您可以检查文件 XML 属性以查看链接指向的位置。使用 Winzip 打开时,我会在Prices.xlsx\xl\externalLinks\_rels\externalLink1.xml.rels
中看到像 Target="FixedComponents/ComponentsA.xlsx"
这样的相对路径。你能检查一下吗?
【参考方案1】:
我见过的将外部文件组织到子文件夹中的唯一解决方案是使用 VBA 来解析公式中外部文件的完整路径。这是一个网站的链接,其中包含其他人使用的几个示例:
http://www.teachexcel.com/excel-help/excel-how-to.php?i=415651
或者,如果您可以将所有文件放在同一个文件夹中而不是将它们分成子文件夹,那么即使您将文件移动到网络位置,Excel 也将解析外部引用而不需要使用 VBA。然后,您的公式就变成了简单的 ='[ComponentsC.xlsx]Sheet1'!A1
,没有要遍历的文件夹名称。
【讨论】:
我确实通过将所有内容放在同一个文件夹中来解决它。现在不是很漂亮,但至少它可以解决问题! @James='[ComponentsC.xlsx]Sheet1'!A1
以前可以正常工作,但现在 Excel 会自动将链接更改为完整路径 :-(。我在 UNC 路径上。有什么想法吗?
@TSion.D.P - 我正在使用 Office 2010 Pro Plus。如果文件one.xlsx
和two.xlsx
位于网络驱动器(UNC 或映射驱动器号)上,并且如果文件one.xlsx
引用two.xlsx
,并且如果我只打开one.xlsx
,那么Excel 确实按照您的描述添加完整路径。但是,如果我在打开 one.xlsx
之前打开 two.xlsx
,则 Excel 不会添加完整路径,而是在公式中保留相对路径。
当被引用的文件关闭时,相同的文件夹方法似乎不起作用 - Excel 会插入完整路径。【参考方案2】:
我有一个类似的问题,我使用以下顺序解决了:
使用CELL("filename")
函数获取当前文件的当前工作表的完整路径。
使用 SEARCH()
函数查找当前 Excel 文件和工作表的 [FileName]SheetName 字符串的开头。
使用LEFT
函数提取包含当前文件的目录的完整路径名。
将第 3 步中找到的目录路径名称与文件名、工作表名称和要访问的单元格引用连接起来。
使用INDIRECT()
函数访问您在步骤#4 中创建的CellPathName
。
注意:这些相同的步骤也可用于访问名称是动态创建的文件中的单元格。在第 4 步中,使用从单元格内容、当前日期或时间等动态创建的文本字符串。
包含所有这些步骤的单元格参考示例(每个部件单独组装)是:
=INDIRECT("'" & LEFT(CELL("filename"),SEARCH("[MyFileName]MySheetName",CELL("filename")) - 1) & "[" & "OtherFileName" & "]" & "OtherSheetName" & "'!" & "$OtherColumn$OtherRow" & "'")
请注意,LibreOffice 使用的 CellPatnName 语法略有不同,如下例所示:
=INDIRECT(LEFT(CELL("filename"),SEARCH("[MyFileName]MySheetName",CELL("filename")) - 1) & "OtherFileName" & "'#$" & "OtherSheetName" & "." & "$OtherColumn$OtherRow")
【讨论】:
【参考方案3】:通过间接方式更简单、更短:INDIRECT("'..\..\..\..\Supply\SU\SU.ods'#$Data.$A$2:$AC$200")
但是如果工作簿中有很多链接,则间接()具有性能缺陷
我想念 LibreOffice 中的类似结构:['../Data.ods']#Sheet1.A1
。目的在这里:如果我在源文件系统的有限目录子树中创建一堆主工作簿和依赖报告工作簿,我可以用完整的工作簿包压缩整个目录子树,并通过电子邮件左右将其发送给其他合作人员。它将保存在目标系统上的某个其他绝对路径中,但链接在新的绝对路径中再次起作用,因为它是相对于子树根进行编码的。
【讨论】:
正如在其他 cmets 中提到的,INDIRECT 仅在提到的文件打开时才有效。我需要有一个解决方法。有什么建议吗?【参考方案4】:使用 =worksheetname() 和 =Indirect() 函数,并使用外部引用的 Excel 文件的名称命名父 Excel 文件中的工作表。每个外部引用的 excel 文件都位于它们自己的同名文件夹中。这些子文件夹只是为了更加清晰。
我做了如下:-
|----B列---------------|----C列------------|
R2) 父文件夹 --------> "C:\TEMP\Excel\"
R3) 子文件夹名称 ---> =worksheetname()
R5) 完整路径 --------------> ="'"&C2&C3&"["&C3&".xlsx]Sheet1'!$A$1"
R7) 间接函数-----> =INDIRECT(C5,TRUE)
在主文件中,我说过 5 个工作表,分别标记为 Ext-1、Ext-2、Ext-3、Ext-4、Ext-5。将上述公式复制粘贴到所有五个工作表中。在后台打开所有分别命名的 Excel 文件。由于某种原因,结果不会自动计算,因此必须通过编辑任何单元格来强制更改。 Volla,每个外部引用的 Excel 文件的单元格 A1 中的值都在主文件中。
【讨论】:
注意:Indirect() 仅在引用文件打开时才有效。【参考方案5】:假设您链接到共享驱动器,例如 S 驱动器?如果是这样,其他人可能以不同的方式映射驱动器。您可能需要使用“官方”驱动器名称//euhkj002/forecasts/bla bla。而不是 S// 在您的链接中
【讨论】:
【参考方案6】:在 Excel 中,有一种方法可以嵌入对文件或目录的相对引用。 您可以尝试在 Excel 单元格中输入:=HYPERLINK("..\Name_of_file_or_folder\","DisplayLinkName")
【讨论】:
如何使用此引用来访问该工作簿中的值?【参考方案7】:对我有用的是一个点。我的办公室是 365。 =HYPERLINK(".\Name_of_folder\","DisplayLinkName") =HYPERLINK(".\Name_of_file","DisplayLinkName")
【讨论】:
以上是关于如何在 Excel 中对另一个工作簿进行相对引用?的主要内容,如果未能解决你的问题,请参考以下文章
WPS表格出现“此工作簿包含其他数据的链接,是不是更新这些链接”怎么解决