【发布时间】:2014-08-26 19:43:51
【问题描述】:
我正在尝试显示一个消息框*,指示 vlookup 公式何时与数组中的名称匹配,何时不匹配。
使用以下数据,我当前的代码可以正常工作:
Name Name
John John
它返回以下消息框:“Ok”
Sub check_name()
Dim name As String
name = Range("A2")
If Application.WorksheetFunction.VLookup(Range("A2"), Range("B1:B2"), 1, False) = name Then
MsgBox "Ok"
Else
MsgBox "Not Ok"
End If
End Sub
但是当没有匹配时代码不起作用。
使用以下数据,我试图显示:“Not Ok”。
Name Name
John Wayne
我收到以下消息:
运行时错误“1004”
应用程序定义或对象定义的错误
我猜If 语句在vlookup 不返回匹配项时不起作用,即如果公式返回#N/A(不可用)。
我尝试将变量name 定义为布尔值。使它等于用IsNA 包裹的vlookup 公式,然后我尝试在If 语句中使用'name',但我得到了与上面显示的结果相同的模式。
我该如何度过这个难关?谢了。
* 使用 VBA 寻找答案
【问题讨论】:
-
@DavidZemens 它的 Doug 来自应使用的副本的回答。同意接受的不顺利。
-
Application.Vlookup和WorksheetFunction.Vlookup的区别基本上是前者在未找到匹配时会返回错误值,而后者会引发错误 停止代码执行。因此,请使用Application.Vlookup(或Application.Match也可以)来测试错误并进行相应处理。 -
好点@DavidZemens。尽管在大多数情况下,它们可以互换使用,并且
Worksheetfunction.的性能要好得多,但这是两者之间不太为人所知的区别之一。 -
声明一个字符串变量:
Dim msg$。将 IIF 函数的结果分配给该变量:msg = IIF(IsError(Application.Match(name, Range("B1:B2"), False)), "Not OK", "OK"),然后显示消息:msgBox msg,最后对该字符串的值进行简单的布尔测试以有条件地退出:If msg = "Not OK" Then Exit For。 -
@DougGlancy 完成!我省略了一些冗长的错误处理示例,但添加到您现有的答案中。