【问题标题】:Refer to Excel workbook by path, based on cell value data根据单元格值数据,按路径参考 Excel 工作簿
【发布时间】:2012-11-28 11:35:38
【问题描述】:

我有一个 Excel 工作表,它从其他已关闭的 Excel 工作簿中提取数据。目前,当我列出关闭的工作簿的整个路径时,它工作正常,但我想使用存储在单独单元格中的变量作为路径名的一部分。

例如,我试图引用一个名为

的工作簿

workbook12.10.12.xls

在一个单独的工作簿(我们会说“活动”工作簿)中,我有一个带有公式的单元格

=INDEX('C:\Path[workbook12.10.12.xls]SHEET1'!$B$1:$B$5, MATCH("匹配文本", 'C:\Path[workbook12.10.12.xls]SHEET1' !$A$1:$A$5, 0))

在 workbook12.10.12 的 B 列中查找与 A 列中包含“匹配文本”的单元格相对应的值。这很好用;但是,我在活动工作簿中有一个单元格,其值为

12.10.12

并且想以某种方式在 INDEX 函数中引用该值。

我无法打开其他工作簿,因此 INDIRECT 功能无济于事。谷歌搜索似乎表明 Excel 对这类事情没有简单的一站式解决方案......有人可以帮忙吗?谢谢!

【问题讨论】:

    标签: excel excel-formula


    【解决方案1】:

    来自Frank Kabel's 2004 post at Dicks Blog 你可以

    1. 使用 Laurent Longre 开发了免费插件MOREFUNC.XLL,其中包括函数 INDIRECT.EXT
    2. 使用 SQL.REQUEST 作为described here *似乎不再受支持,我不清楚这是否可以处理您的INDEX\MATCH 请求
    3. 使用 Harlan Grove 的 PULL 函数

    此外,您还可以:

    1. 直接通过代码创建一个“脏链接”,该代码输入引用您需要的工作簿的公式
    2. 对于提取值 - 但不适用于处理范围 - 您可以使用 Walkenbach 的 ExecuteExcel4Macro XLM method

    【讨论】:

    • 我在选项卡中打开了所有链接,现在这个会话看起来像一个墓地。也许可以使用网站的缓存版本。
    【解决方案2】:

    我认为您要做的是在特定文件(命名日期)中找到特定记录。 您可以通过一个简单的 VBA 代码来完成。

    假设您要在 A1 中搜索记录#say REC001,日期文件 12.10.12 在单元格 C1,并将结果显示在单元格 A7

    在要输入输入和获取输出的工作表上,右键单击工作表选项卡并选择“查看代码”并粘贴以下代码:

    Private Sub Worksheet_Change(ByVal Target As Range)
    If Intersect(Target, Range("C1")) Is Nothing Then Exit Sub
    Range("A7").Formula = "=INDEX('C:\TEMP\[workbook" & Range("C5").Value & ".xls]SHEET1'!$B$1:$B$5, MATCH(" & Range("A1").Value & ", 'C:\TEMP\[workbook" & Range("C5").Value & ".xls]SHEET1'!$A$1:$A$5, 0))"
    End Sub
    

    那么每次编辑 C1 时,公式都会更新。

    实际上,我认为您不应该在您的情况下使用 INDEX 函数。使用 VLOOKUP 更简单。例如:

    Range("A8").Formula = "=vlookup(" & Range("A1").Value & ",'C:\TEMP\[workbook" & Range("C5").Value & ".xls]SHEET1'!$A$1:$B$5,2,false)"
    

    您必须注意以下几点: 1.您将代码粘贴到 Sheet1 对象(或工作表名称)上,但不插入新模块 2.你的目标文件的路径和文件名是正确的,包括.xls和.xlsx 3. 您的原始文件仅涵盖 $B$5 4.在VBA上,建议您将文件保存为.xlsm格式

    【讨论】:

    • 谢谢!我一直在研究这个,你是对的,VLOOKUP 似乎是要走的路。不幸的是,我的 Range.Formula 吐出一个语法错误,我不确定问题是什么——可能与引号的使用有关吗?我对这个属性不是很熟悉,也无法通过谷歌找到任何以这种方式构建公式的东西。我认为我们绝对是在正确的轨道上,所以感谢您的帮助!
    • 记得在&前后加空格。如果公式中有 ",请使用 ""
    • 例如你想要公式 =if(a1="abc","tr"),
    • range.formula 是 "=if(a1=""abc"",""tr"")"
    • 很抱歉在代码中发现了两个语法错误。现已更正
    【解决方案3】:

    您可以在 excel 中的名称中存储完整引用,包括封闭文件中某个范围的文件路径(直接或通过 VBA 根据不同单元格中的选择并使用上述 Worksheet_Change 过程),然后参考像往常一样在公式中使用名称的文件。这克服了 INDIRECT 函数的限制。

    VBA 非常简单:

    New_Ref = Sheets("Wells").Range("K6")

    ActiveWorkbook.Names("MyWorkbook").RefersTo = "=" & New_Ref

    唯一的诀窍是确保在名称中包含“=”。

    一旦发现这一点,名称就会有大量用途。我已经使用它轻松地从远程共享点站点上的已关闭文件中获取数据 - 我假设共享点处理所有权限。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-11
      • 1970-01-01
      相关资源
      最近更新 更多