Excel 已关闭工作簿的单元格引用使用单元格中的文件名
Excel cell reference from closed workbook using file name in cell
我有一个包含 96 个 xls 文件的中央位置;这 96 个文件中的每一个都代表位于此处的单独测试:
"\server5\Operations\MainBoard 测试中心位置请勿删除或重命名"
我创建了一个 Excel 工作簿,将每个单独测试的所有信息输入到单个 sheet 中。然后,我使用 VBA 提取文件名,并在同一工作簿的第二个 sheet 上向文件添加 link。我 link 将这些文件编辑为 sheet 1.
接下来,我在顶行添加了与执行的测试对应的所有信息,每个工作簿(测试)细分为一行。
现在我需要在新工作簿上填充 sheet 1(高级主板测试 log.xlsx)
到目前为止,此公式有效,但仅适用于打开的工作簿:
=INDIRECT("'\server5\Operations\MainBoard testing central location DO NOT REMOVE or RENAME\["&A7&"]Summary'!$E9")
其中A7代表文件名列,范围从A6到A103
摘要E9是我想在单元格C7中输入的单元格
请注意填充的值,这是因为我打开了这两本工作簿,全部#REF!单元格包含与填充单元格相同的公式。
如果您需要任何其他信息来完成这项繁琐的任务,请告诉我
我也试过微软推荐的方法:
='[20160613 1002257 35000010-01B.xls]Summary'!$E9
用包含文件名的单元格替换文件名:
='["&A7&"]Summary'!$E9
我得到了#REF!在单元格和公式栏中自动更改为:
='(\server5\Operations\MainBoard testing central location DO NOT REMOVE or RENAME\["&A7&"]Summary'!$E9
根据 Microsoft 的说法,Indirect() 函数必须打开工作簿。您可以使用 VBA 循环浏览目录,以使用此路径获取单元格值。
获得了一个 UDF,下面是您如何添加它:
在 excel 中打开 Visual Basic 编辑器(功能区的“开发”选项卡 - 您可能需要进入 Excel 选项才能取消隐藏)。
右键单击 VBA Project([您的工作簿名称]),突出显示插入,然后单击模块。
将以下内容粘贴到 module1 并将工作簿另存为 .xlsm。
代码:
Function GetField(Path As String, WorksheetName As String, CellRange As String) As Variant
Dim wb As Workbook
Dim ws As Worksheet
Dim rng As Range
Set wb = GetObject(Path)
Set ws = wb.Worksheets(WorksheetName)
Set rng = ws.Range(CellRange)
Application.DisplayAlerts = False
wb.Saved = True
wb.Close SaveChanges:=False
Application.DisplayAlerts = True
End Function
然后您只能在此工作簿中使用 =GetField()。
参数:
=getfield("\server5\Operations\MainBoard testing central location DO NOT REMOVE or RENAME\"&A6,"Summary","E9")
仅测试了一个文件,但您应该能够在 rows/columns 中对多个文件使用单元格引用、文件名等。
-确认这适用于多个 Rows/Columns
编辑:更改了关闭工作簿的方式,这些代码来自 Alistair Weir 在另一个问题中提供的一些代码。
我有一个包含 96 个 xls 文件的中央位置;这 96 个文件中的每一个都代表位于此处的单独测试:
"\server5\Operations\MainBoard 测试中心位置请勿删除或重命名"
我创建了一个 Excel 工作簿,将每个单独测试的所有信息输入到单个 sheet 中。然后,我使用 VBA 提取文件名,并在同一工作簿的第二个 sheet 上向文件添加 link。我 link 将这些文件编辑为 sheet 1.
接下来,我在顶行添加了与执行的测试对应的所有信息,每个工作簿(测试)细分为一行。
现在我需要在新工作簿上填充 sheet 1(高级主板测试 log.xlsx)
到目前为止,此公式有效,但仅适用于打开的工作簿:
=INDIRECT("'\server5\Operations\MainBoard testing central location DO NOT REMOVE or RENAME\["&A7&"]Summary'!$E9")
其中A7代表文件名列,范围从A6到A103
摘要E9是我想在单元格C7中输入的单元格
请注意填充的值,这是因为我打开了这两本工作簿,全部#REF!单元格包含与填充单元格相同的公式。
如果您需要任何其他信息来完成这项繁琐的任务,请告诉我
我也试过微软推荐的方法:
='[20160613 1002257 35000010-01B.xls]Summary'!$E9
用包含文件名的单元格替换文件名:
='["&A7&"]Summary'!$E9
我得到了#REF!在单元格和公式栏中自动更改为:
='(\server5\Operations\MainBoard testing central location DO NOT REMOVE or RENAME\["&A7&"]Summary'!$E9
根据 Microsoft 的说法,Indirect() 函数必须打开工作簿。您可以使用 VBA 循环浏览目录,以使用此路径获取单元格值。
获得了一个 UDF,下面是您如何添加它:
在 excel 中打开 Visual Basic 编辑器(功能区的“开发”选项卡 - 您可能需要进入 Excel 选项才能取消隐藏)。
右键单击 VBA Project([您的工作簿名称]),突出显示插入,然后单击模块。
将以下内容粘贴到 module1 并将工作簿另存为 .xlsm。
代码:
Function GetField(Path As String, WorksheetName As String, CellRange As String) As Variant
Dim wb As Workbook
Dim ws As Worksheet
Dim rng As Range
Set wb = GetObject(Path)
Set ws = wb.Worksheets(WorksheetName)
Set rng = ws.Range(CellRange)
Application.DisplayAlerts = False
wb.Saved = True
wb.Close SaveChanges:=False
Application.DisplayAlerts = True
End Function
然后您只能在此工作簿中使用 =GetField()。
参数: =getfield("\server5\Operations\MainBoard testing central location DO NOT REMOVE or RENAME\"&A6,"Summary","E9")
仅测试了一个文件,但您应该能够在 rows/columns 中对多个文件使用单元格引用、文件名等。
-确认这适用于多个 Rows/Columns
编辑:更改了关闭工作簿的方式,这些代码来自 Alistair Weir 在另一个问题中提供的一些代码。