【问题标题】:Display a message box when vlookup returns or does not return a match [duplicate]当vlookup返回或不返回匹配时显示一个消息框[重复]
【发布时间】: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.VlookupWorksheetFunction.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 完成!我省略了一些冗长的错误处理示例,但添加到您现有的答案中。

标签: excel vba


【解决方案1】:

您可以通过简单地为有问题的单元格声明 Validation rules 来做到这一点。

您需要选择Validation,然后选择验证列表中的单元格(包含您需要的单元格的另一个范围)。

如果您绝对需要在 VBA 中执行此操作,则必须进行一些错误捕获。

基本上你需要添加代码:

Function ThisFunction()
    On Error GoTo  ErrorHandler

    ' Your normal code
    ' The next two lines are VERY IMPORTANT. If you don't Exit, you'll get weird logical errors on runtime
    ThisFunction = '...
    Exit Function
ErrorHandler:
' Code to return the results in case of Error
ThisFunction = '...
End Function

No Match 结果出现错误,WorksheetFunction.VLookup() 无法直接处理该错误

这段代码,具体要修改为

    Sub check_name()
    On Error GoTo ErrorHandler
    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" ' Never invoked
    End If
    Exit Sub
ErrorHandler:
    MsgBox "Not ok"
End Sub

这是完成此任务的一种非常低效的方法,但这是解决问题的最少修改方法,因此它将适合您在此子例程中的其余代码

【讨论】:

  • 哈哈,没问题,只要我靠近电脑我都会这样做,通常我会用手机或平板电脑输入这些内容,因此处理格式和内容很困难,我一直保持最低限度,这将有助于这个问题。但请注意。
猜你喜欢
  • 2018-09-24
  • 1970-01-01
  • 2019-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-18
相关资源
最近更新 更多