VLookup 在另一个工作簿上

Posted

技术标签:

【中文标题】VLookup 在另一个工作簿上【英文标题】:VLookup On Another Workbook 【发布时间】:2017-01-17 19:51:20 【问题描述】:

尝试创建一个宏,该宏将从单元格 A7、A8、A9 等输入(13 位数字)直到到达空白单元格,然后针对另一个工作簿运行 vlookup。

但是,我只是收到 #N/A 错误,我不知道为什么。

我当前的代码:

Sub getData()

Application.EnableEvents = False
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.Calculation = xlManual

Dim wb As Workbook, src As Workbook
Dim srcRange As Range
Dim InputString
Dim OutputString
Dim i As Long

Set wb = ActiveWorkbook
Set src = Workbooks.Open("D:\Files\test1.csv", True, True)
Set srcRange = src.Sheets(1).Range("A1:H1").End(xlDown)

i = 7

Do While wb.ActiveSheet.Cells(i, 1) <> ""

    InputString = wb.Worksheets("Sheet 1").Cells(i, 1)

    OutputString = Application.VLookup(InputString, srcRange, 3, False)

    wb.Worksheets("Sheet 1").Cells(i, 2) = OutputString

    i = i + 1

Loop


src.Close (False)

Application.EnableEvents = True
Application.ScreenUpdating = True
Application.DisplayAlerts = True
Application.Calculation = xlAutomatic

End Sub

我认为值得注意的是,我正在查找的引用(“InputString”)在“src”文件中定义为自定义格式 #0。不知道是不是太重要了,应该还是整数吧?

此外,“OutputString”可以是数字或文本,这就是为什么我故意让它未定义的原因。我尝试将其定义为“Variant”、“String”和“Integer”,但这并没有真正改变任何东西。

谢谢。

【问题讨论】:

您的VLookup 正在尝试访问您设置为只有一列宽的范围的第 3 列。可能将"A1:A8" 更改为"A1:C8" @YowE3K - 抱歉,这是我使用测试电子表格时的错误。我已经编辑更正。它现在确实将初始范围设置为第一行。 (a) 我假设您已经检查了活动工作表的 A 列中的单元格至少在您尝试在工作表“工作表 1”上处理的范围内是非空白的。 (例如,如果活动工作表在单元格 A7 中没有任何内容,则循环不会处理“工作表 1”的单元格 A7 中的任何内容,这可能会在“工作表 1”的单元格 B7 中留下“#N/A”来自之前运行的宏。) (b) 你有没有单步执行代码来查看InputString 的值被设置为多少? (c) 您是否检查过 csv 文件是否包含您要查找的值? 【参考方案1】:

Set srcRange = src.Sheets(1).Range("A1:H1").End(xlDown)

这将在A 列上为您提供一个单个单元格的范围,即A20。 在单个单元格上执行VLookup 毫无意义。

你的意思可能是这样的:

With Sheets(1)
    Set srcRange = .Range("A1:H" & .Range("A1").End(xlDown).Row)
End With

这将设置为A1:H20

【讨论】:

谢谢!这正是我所需要的。我有点发现我正在寻找的地方有问题(得到 #N/A 而不是错误),但不知道如何正确选择范围。【参考方案2】:

首先您应该更改您的 src 范围,该范围实际上设置为仅抓取底行,而不是从上到下的范围。试试

Set wb = ActiveWorkbook
Set src = Workbooks.Open(""D:\Files\test1.csv", True, True)
With src.Sheets(1)
    Set srcRange = .Range(.Range("A1"), .Range("H1").End(xlDown))
End With

其次,我认为 CSV 文件不支持 13 位数字,但文本除外。 VLOOKUP 对 text vs general vs number 非常敏感,所以如果新的 src 范围没有帮助,请先尝试使用 CStr() 转换输入字符串。

祝你好运!

【讨论】:

谢谢,这是正确的。我有点发现问题出在我的范围上,因为它是 #N/A 而不是实际的 VBA 错误,但不知道如何正确选择范围。我对 vlookup 和变量类型了如指掌……这就是为什么我最初认为它与此有关。我希望使用字符串会起作用。

以上是关于VLookup 在另一个工作簿上的主要内容,如果未能解决你的问题,请参考以下文章

更改另一个工作簿上的值时,Application.Volatile 不会重新计算函数

VBA - 删除每张工作簿上的每 N 行(每张工作表 100k+ 值)

多个Google表格/工作簿上的SQL联盟

在隐藏的工作表或工作簿上可以执行哪些 Excel VBA 操作?

Google 电子表格 - 来自另一个工作簿的 VLookup 值

公式中另一个工作簿的不匹配的Vlookup数据