Excel VBA VLookup失败

无论如何我不是VBA专家,但我知道基本要做 . 我正在编写一个脚本来帮助当地的动物收容所 . 他们手动将四张纸合并为一份报告 . 所有四个报告都包含一个公共变量,我将其命名为AnimalID . 目的是在狂犬病更新表上找到AnimalID,并将截止日期返回到报告表(209个实例,以Count递增) . 我已复制下面其中一个选项的代码 . 当我尝试运行脚本时,我收到以下错误(通过msgbox Err.Description):

错误:“对象'WorksheetFunction'的方法'VLookup'失败”

AnimalID位于狂犬病更新表的第一列和报告的第Q列 . 狂犬病更新表上的K列包含到期日期,应该复制到报告的P列 . 我已经尝试将AnimalID格式化为文本和数字,但没有成功 .

Dim Count As Long
Dim AnimalID, Renewal As Range

Worksheets("Report").Activate
Range("Q:Q").NumberFormat = "@"
Worksheets("Rabies Renewal").Activate
Range("A:A").NumberFormat = "@"

Worksheets("Rabies Renewal").Activate
Set Renewal = Sheets("Rabies Renewal").Range("A:AO")

Worksheets("Report").Activate

Range("Q8").Select
Range(ActiveCell, ActiveCell.End(xlDown)).Select
Count = Selection.Count

For Count = 1 To Count
    AnimalID = "Q" & Count + 7

    Range("P" & Count + 7).Select
    ActiveCell.Value = WorksheetFunction.VLookup(AnimalID, Renewal, 11, False)
Next Count

我还尝试了一些语法变体,包括查找值为Range(AnimalID).Value;将函数定义为Application.WorksheetFunction.VLookup;表数组作为范围;和rangelookup同时为true和false . 任何建议将不胜感激 . 谢谢您的帮助!

回答(2)

2 years ago

你需要 Se t Range object,而不仅仅是连接一个看起来像单元格地址的字符串 . 但是,您可以使用该连接字符串来帮助定义Range对象 .

Set AnimalID = Range("Q" & Count + 7)

这将在For ...Next Statement的第一次传递时将 AnimalID 设置为 Report 工作表的Q8单元格,并且每次后续传递都会进一步向下移动单元格 .

这是对您的程序的更广泛的重写,无需使用 .Select.Activate 命令¹ .

Dim cnt As Long
Dim AnimalID As Range, Renewal As Range  '<~~declare these PROPERLY!

With Worksheets("Rabies Renewal")
    .Range("A:A").NumberFormat = "@"
    Set Renewal = .Range("A:AO")
End If

With Worksheets("Report")
    .Range("Q:Q").NumberFormat = "@"

    For cnt = 8 To .Cells(Rows.Count, "Q").End(xlUp).Row
        Set AnimalID = .Range("Q" & cnt)
        .Range("P" & cnt) = _
            WorksheetFunction.VLookup(AnimalID, Renewal, 11, False)
    Next Count
End With

¹请参阅如何避免在Excel VBA宏中使用选择以获取更多方法,以避免依赖选择和激活来实现目标 .

2 years ago

这是查找失败的预期结果 . 如果在工作表中有一个VLOOKUP()公式,如:

enter image description here

您收到#N / A错误,因为小表中不存在 11 .

如果你在VBA中运行相同的东西:

Sub FailedLookup()
   Dim v As Variant
   v = WorksheetFunction.VLookup(11, Range("A:B"), 2, False)
End Sub

#N / A没有通过,相反我们看到:

enter image description here