使用Excel中VBA模块的Vlookup检查值是否在表中

使用Excel中VBA模块的Vlookup检查值是否在表中,excel,vba,Excel,Vba,我在工作表中有一个范围,我想检查用户输入到不同工作表的不同单元格中的值是否在该范围内。如果该值不在该范围内(即,用户输入的值不正确),我想标记一个测试字段以提醒用户。我这样做是作为一个更大的验证功能的一部分 如果值在该范围内,则此操作有效,但如果值不在该范围内,则函数将抛出错误(不通知我)并退出 Public Function ValidateField(dataValue as Range) as Integer Dim result As Variant Dim sh

我在工作表中有一个范围,我想检查用户输入到不同工作表的不同单元格中的值是否在该范围内。如果该值不在该范围内(即,用户输入的值不正确),我想标记一个测试字段以提醒用户。我这样做是作为一个更大的验证功能的一部分

如果值在该范围内,则此操作有效,但如果值不在该范围内,则函数将抛出错误(不通知我)并退出

 Public Function ValidateField(dataValue as Range) as Integer
     Dim result As Variant

     Dim sheet As Worksheet
     Dim range As range

     Set sheet = ActiveWorkbook.Sheets("Menu")
     Set range = sheet.range("BC141:BD175")


     result = WorksheetFunction.VLookup(CDec(dataValue), range, 1, False)

     'this does not work
     If InStr(CStr(result), "Error") > 0 Or result = "" Then
        ValidateField = 1
        Exit Function
     End If
     If CDec(result) <> CDec(dataValue) Then
        ValidateField = 1
        Exit Function
     End If
End Function
公共函数ValidateField(数据值作为范围)作为整数
作为变量的模糊结果
将工作表设置为工作表
变暗范围作为范围
Set sheet=ActiveWorkbook.Sheets(“菜单”)
设置范围=图纸范围(“BC141:BD175”)
结果=工作表函数.VLookup(CDec(数据值),范围,1,False)
这是行不通的
如果InStr(CStr(result),“Error”)>0或result=“”,则
ValidateField=1
退出功能
如果结束
如果CDec(结果)CDec(数据值),则
ValidateField=1
退出功能
如果结束
端函数
改用这个

'~~> Check if `CDec(dataValue)` exists in Column BC
If Application.WorksheetFunction.CountIf(Rng.Columns(1), CDec(dataValue)) = 0 Then
    '
    '~~> Not Found... Do Something
    '
    Exit Function
End If
这是以前的事

result = WorksheetFunction.VLookup(CDec(dataValue), range, 1, False)
顺便说一句,我注意到了一些事情。您正在
Vlookup
中使用
1
。如果只想检查值是否在Col
BC
中,则不需要
Vlookup
。为此,您可以使用
CountIf