【问题标题】:Using VLookup in VBA to reference another Excel file在 VBA 中使用 VLookup 来引用另一个 Excel 文件
【发布时间】:2015-09-23 15:51:29
【问题描述】:

我正在尝试在 VBA 中编写一个引用另一个文件的 VLookup 表。这是我的目标的简单概述:

  • 在另一个 Excel 文件的单元格 A2 中查找值
  • 从另一个 Excel 文件的第 2 列中提取信息并放在单元格 B2 中
  • 移动到单元格 A3 并重复该过程,直到 A 列中没有更多条目

这是我已经拥有的代码。我不断收到一条错误消息,提示“无法获取 WOrksheetFunction 类的 VLookup 属性”。我检查了引用该错误的其他帖子,但它们没有任何帮助。你们都在我的代码中看到错误吗?或者有没有人有更好的方法来完成这项任务?

Sub SBEPlannerAdder()

Dim wbk As Workbook
Set wbk = Workbooks.Open("C:\Users\user\Documents\Support File\Planner.xlsx")

With Sheets("Sheet1")

    ' Selects the first cell to check
    Range("A2").Select
    Dim x As Variant
    x = wbk.Worksheets("Sheet1").Range("A1:C1752")

    ' Loops through all rows until an empty row is found
    Do Until IsEmpty(ActiveCell)

        Range(ActiveCell.Offset(0, 1) & ActiveCell.Row).Value = Application.WorksheetFunction.VLookup((ActiveCell.Column & ActiveCell.Row), x, 2, 0)
        ActiveCell.Offset(1, 0).Select
    Loop
End With

Call wbk.Close(False)
End Sub

【问题讨论】:

  • 这可能是因为 vlookup 没有返回值,或者换句话说,结果是“N/A”。如果是这种情况,请删除 .worksheetFunction 并运行它,然后您将需要一个 if 语句来处理“N/A”。
  • 你不能在工作表本身中使用 vlookup。那么作为引用其他文件和范围的函数呢?您的搜索字符串是 Column & Row,这将导致一个数字作为字符串。这是故意的吗?

标签: excel vba vlookup


【解决方案1】:

当您打开工作簿时,它会成为活动工作簿。看来您从未将控制权交还给目标工作簿。

Sub SBEPlannerAdder()
    Dim rw As Long, x As Range
    Dim extwbk As Workbook, twb As Workbook

    Set twb = ThisWorkbook
    Set extwbk = Workbooks.Open("C:\Users\user\Documents\Support File\Planner.xlsx")
    Set x = extwbk.Worksheets("Sheet1").Range("A1:C1752")

    With twb.Sheets("Sheet1")

        For rw = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
            .Cells(rw, 2) = Application.VLookup(.Cells(rw, 1).Value2, x, 2, False)
        Next rw

    End With

    extwbk.Close savechanges:=False
End Sub

请参阅How to avoid using Select in Excel VBA macros,了解更多摆脱依赖选择和激活来实现目标的方法。

【讨论】:

  • ++ SelectActivate 是邪恶的!
【解决方案2】:

这取决于您打算一次性执行此操作还是重复执行此操作。我反复假设,因为手动执行此操作并不是那么困难。

我首先要看的是你的论点。前两个应该是范围。所以要清楚,也许你可以做类似的事情

Dim x As Range
set x = wbk.Worksheets("Sheet1").Range("A1:C1752")
...

Range(ActiveCell.Offset(0, 1) & ActiveCell.Row).Value = Application.WorksheetFunction.VLookup(Range(Activecell.Address), x, 2, 0)

重要的一点是确保您的前两个参数是 Vlookup 函数的范围。

【讨论】:

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