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+ 值)
在隐藏的工作表或工作簿上可以执行哪些 Excel VBA 操作?