【问题标题】:Why do I get #N/A's when using VLookup in VBA to reference another Excel file?为什么在 VBA 中使用 VLookup 引用另一个 Excel 文件时会出现 #N/A?
【发布时间】:2020-12-28 22:12:27
【问题描述】:

我正在尝试在 VBA 中编写一个引用另一个工作簿的 VLookup。基本上我正在尝试查找 2 个工作簿。

这是我的目标的简单概述:

  • 在工作簿 1 的 A 列中的所有行中查找值
  • 从工作簿 2 的 A 列(对应于工作簿 1 中的 A 列的值)和 C 列(要复制的值)中提取信息,并将其放在工作簿 1 的 B 列中的相应单元格(行)中。附加条件:(1)如果单元格中已经存在值,则覆盖;(2)如果没有为单元格找到值,则保持单元格不变。所以也没有#N/A。
  • 继续并重复该过程,直到工作簿 1 的 A 列中没有更多条目

下面是我已经拥有的代码。我偶然发现代码不起作用的事实。对于 B 列中的每一行,我不断得到#N/As,而至少应该找到一些值并将其粘贴到某些单元格中。出于测试目的,我将 workbook2 中的引用表复制到 workbook1 中的工作表中,当我在同一个 workbook1 中引用该特定工作表时,代码似乎可以工作。

Sub Import()

Dim rw As Long, x As Range
Dim extwbk As Workbook, twb As Workbook

Set twb = ThisWorkbook
Set extwbk = Workbooks.Open("C:\Documents\workbook2.csv")
Set x = twb.Worksheets("Sheet1").Range("A1:H100")

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,3,False)
     Next rw

End With


End Sub

您在我的代码中看到错误吗?或者有没有人有更好的方法来完成这项任务?最好,我还想打开一个选定的文件,而不是引用完整路径。

提前致谢!

【问题讨论】:

  • 请尝试格式化两个比较以相同方式的范围。在这种情况下,最好的格式是使用 TextToColumns (from Data)...
  • @FaneDuru 虽然扩展名不同,但格式相同

标签: excel vba excel-formula vlookup


【解决方案1】:

不妨试试这个:

    For ...    
         on Error Resume Next
         .Cells(rw, 2).Value = WorksheetFunction.Vlookup(.Cells(rw,1).Value, x, 3, False))
    Next ...

但是,如果我没听错的话,“x”是您搜索值的范围,并且它被定义为同一张纸上的范围。所以范围重叠了!?

【讨论】:

  • x 是 vlookup 应该运行的范围,对吧?所以 x 包括 workbook2 的 A 列到 H 列。 workbook2 的 A 列包含与 workbook1 的 A 列相同的值,C 列(第三列)包含应根据查找复制的值。
  • 这似乎有效!我现在可以获取粘贴在 vlookup 找到匹配项的单元格中的值。但是,当找不到匹配项时,如何摆脱#N/A?我想保持未发现匹配的单元格被#N/A覆盖
  • 如果这行得通,那么将原始代码中的 .Value2 更改为 .Value 看看会发生什么。
  • 是的,但在您的代码中,这一切都发生在同一个工作簿中。 x 也被定义为 twb 中的范围(= workbook1!?)。比你应该调整对“extwbk”的引用
  • @stephie 你是对的!它现在可以正常工作了!
【解决方案2】:

可能是因为这一行:

Set x = twb.Worksheets("Sheet1").Range("A1:H100")

引用了错误的工作簿。应该是:

Set x = extwbk.Worksheets("Sheet1").Range("A1:H100")

处理 N/A 值 在你的循环中尝试这样的代码:

For rw = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
        If Application.IsNA(Application.VLookup(.Cells(rw, 1).Value2, x, 3, False)) Then
            .Cells(rw, 2) = "NOT FOUND"
        Else
            .Cells(rw, 2) = Application.VLookup(.Cells(rw, 1).Value2, x, 3, False)
        End If
         
     Next rw

将“NOT FOUND”替换为您想要显示的任何内容,或者如果您想要一个空单元格,则只需“”

【讨论】:

  • !我现在可以获取粘贴在 vlookup 找到匹配项的单元格中的值。但是,当找不到匹配项时,如何摆脱#N/A?我想保持未发现匹配的单元格被#N/A覆盖
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-10
  • 1970-01-01
  • 2018-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-16
相关资源
最近更新 更多