Excel VBA VLookup失败

我不是一个VBA专家,但是知道足够的基础知识。 我正在编写一个脚本来帮助当地的动物收容所。 有四张纸,他们已经手动合并成一个报告。 所有四个报告都包含一个公共variables,我已经命名为AnimalID。 目的是在狂犬病更新表上findAnimalID,并返回到报告表的有效期(209个实例按Count增加)。 我已经复制下面的select之一的代码。 当我尝试运行该脚本时,收到以下错误(通过msgbox Err.Description):

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

AnimalID's在“狂犬病更新表”的第一栏和报告的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 

我也尝试了一些语法变体,包括查找值作为范围(AnimalID).Value; 将函数定义为Application.WorksheetFunction.VLookup; 表数组作为范围; 和范围查找都是真的和假的。 任何build议将不胜感激。 感谢您的帮助!

您需要Se 范围对象 ,而不是只是连接一个看起来像单元格地址的string。 但是,您可以使用该串联string来帮助定义Range对象。

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

在For … Next语句的第一次通过时,将把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 VBAmacros中select更多的方法来摆脱依靠select和激活来实现您的目标。

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

在这里输入图像说明

你得到了#N / A错误,因为小表中不存在11

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

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

#N / A不通过,而是我们看到:

在这里输入图像说明