【问题标题】:VBA simple Vlookup to closed workbook - syntax errorVBA简单的Vlookup到关闭的工作簿 - 语法错误
【发布时间】:2019-07-27 13:34:32
【问题描述】:

我有一个电子表格,它使用常规的 Vlookup 函数来访问另一个名为 archive.xlsx 的工作簿中的数据,该工作簿与我的活动工作簿保存在同一位置。正常/非 VBA 函数看起来像这样并且按预期工作:

=VLOOKUP(A2,[archive.xlsx]watchlist!A2:L2000,5,FALSE)

我正在尝试在 VBA 中重新创建它,目标是能够运行它而无需手动打开/关闭 archive.xlsx 文件。我对 VBA 不是很有经验,所以我在这里查看了一些其他帖子,提出了类似的问题,并最终得到了这行代码(适用于我自己的公式),显然适用于其他一些用户:

Sub Vlookup()

Range("E2") = Application.Vlookup(Range("A2"),([archive.xlsx]watchlist.Range("A2:L2000")),5,FALSE)

End Sub

(Vlookup 结果应该转到单元格 E2)

然而,这给了我一个语法错误。我一直在看这个大约一个小时,并尝试改变几十个小东西,但我根本无法让它工作。这可能是非常愚蠢的事情,但谁能看到我在这里做错了什么?

【问题讨论】:

    标签: excel vba vlookup


    【解决方案1】:

    您不能使用该语法有很多原因。首先,这不是访问范围的正确语法。此外,这不是传递archive.xlsx 的方法(它不是变量!)。您需要获取路径(与当前工作簿的路径相同,因为它们位于同一位置)并然后构建正确的字符串引用,如下所示:

    Sub Vlookup()
    
    Dim VLPath As String
    With ThisWorkbook
        'Now get the full path to the table being looked up in archive.xlsx
        VLPath = "'" & .Path & "\[archive.xlsx]watchlist'!A2:L2000"
        .Range("E2").Formula = "=VLOOKUP(A2," & VLPath & ",5,FALSE)"
    End With
    
    End Sub
    

    一些解释:

    如果您关闭了archive.xlsx并检查了当前工作簿单元格E2中的公式,它将包含archive.xlsx的完整路径,例如:

    VLOOKUP(A2,'C:\blah\[archive.xlsx]watchlist'!A2:L2000,5,FALSE)

    这是我们需要在 VBA 中使用的路径和字符串模式。现在我们如何得到它?由于我们知道它与您当前的工作簿位于同一文件夹中,因此我们调用 .Path 函数来获取该位置,然后我们可以构建上面查找字符串的精确副本。 这就是代码的作用!

    【讨论】:

      【解决方案2】:

      如果您在电子表格中应用此函数=VLOOKUP(A2,[archive.xlsx]watchlist!A2:L2000,5,FALSE),并关闭工作簿archive.xlsx,您将看到函数中的路径变为文件的完整路径。

      会变成这样:

      =VLOOKUP(A2,'C:\-------\[archive.xlsx]watchlist'!A2:L2000,5,FALSE)

      现在在 VBA 中,我认为您应该像这样使用具有完整路径的函数:

      Range("E2").Formula = "=Vlookup(" & Range("A2") & ",'C:\-----\[archive.xlsx]watchlist'!A2:L2000,5,FALSE)"
      

      【讨论】:

        【解决方案3】:

        如果您需要单元格中的公式,也可以简单地在 E2 单元格中编写类似的内容

        =VLOOKUP(1,'D:[archive.xlsx]Sheet1'!$A$1:$L$2000,5,FALSE)

        如果你想让它与 VBA 一起工作,你可以这样做:

        Sub Vlookup()
            Range("E2").FormulaR1C1 = "=VLOOKUP(1,'D:\[archive.xlsx]Sheet1'!R1C1:R2000C12,5,FALSE)"
            Application.Calculate
            Range("E2").Value = Range("E2").Value
        End Sub
        

        只需更改文件路径

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-05
          • 2013-06-21
          • 1970-01-01
          相关资源
          最近更新 更多