VBA - Excel:当找不到匹配项时,Vlookup会崩溃我的程序

时间:2013-06-14 03:47:57

标签: excel vba vlookup

在我的程序中,用户键入一个邮政编码并获取与邮政编码(省,市,区)相关的输出信息。为此,我使用Vlookup函数。 那么,用户:

  1. 在主页中键入邮政编码
  2. 程序搜索数据库(在另一张表格中),其中邮政编码与城市,省,区相关联。
  3. 当匹配时,它将结果发送到主页面,因此用户只需键入邮政编码即可获得城市,省,区。非常简单的过程。
  4. 我使用此代码执行此操作:

    If Range("J9").Value <> "N/A" Then 'if there is actually a zip code entered by the user (if not, it will be "N/A")
    cityZip = Application.WorksheetFunction.VLookup(sMain.Range("J9").Value,
                     sZipCodes.Range("B2:E864"), 3, False)
    barangayZip = Application.WorksheetFunction.VLookup(sMain.Range("J9").Value,   
                     sZipCodes.Range("B2:E864"), 2, False)
    provinceZip = Application.WorksheetFunction.VLookup(sMain.Range("J9").Value,    
                     sZipCodes.Range("B2:E864"), 4, False)
    sMain.Range("J7").Value = provinceZip
    sMain.Range("J13").Value = cityZip
    sMain.Range("J16").Value = barangayZip
    Else
    End If
    

    当我的数据库中有一个邮政编码时,它可以正常工作。但如果没有,它会崩溃程序的执行并且我有一条错误消息(比如“执行错误'1004',无法读取Vlookup ......)。 如何修改我的代码只是说如果没有匹配,那么它应该什么都不做?我不知道如何在Vlookup函数中引入此请求。

    提前致谢!

    编辑:在遵循蒂姆·威廉姆斯的建议之后,这是我的新代码:

    'Using Zip Code
    If Range("J9").Value <> "N/A" Then
    provinceZip = Application.Lookup(sMain.Range("J9").Value, sZipCodes.Range("B2:E907"), 4, False)
    
    If IsError(provinceZip) = False Then
    cityZip = Application.Lookup(sMain.Range("J9").Value, sZipCodes.Range("B2:E907"), 3, False)
    barangayZip = Application.Lookup(sMain.Range("J9").Value, sZipCodes.Range("B2:E907"), 2, False)
    
    sMain.Range("J7").Value = provinceZip
    sMain.Range("J13").Value = cityZip
    sMain.Range("J16").Value = barangayZip
    Else
    'do nothing
    End If
    
    End If
    

    我的错误就在这一行:

    provinceZip = Application.Lookup(sMain.Range("J9").Value, sZipCodes.Range("B2:E907"), 4, False)
    

    =&GT;错误1004,参数数量无效

4 个答案:

答案 0 :(得分:4)

您应该阅读有关VBA错误处理的信息。 http://www.cpearson.com/excel/errorhandling.htm等来源可能有所帮助。也就是说,请尝试以下代码。

你想要这样的东西:

Public Function SafeVlookup(lookup_value, table_array, _
                        col_index, range_lookup, error_value) As Variant
    On Error Resume Next
    Err.Clear
    return_value = Application.WorksheetFunction.VLookup(lookup_value, _
                                table_array, col_index, range_lookup)
    If Err <> 0 Then
      return_value = error_value
    End If

    SafeVlookup = return_value
    On Error GoTo 0
End Function

在您的代码中,您可以将其命名为:

cityZip = SafeVlookup(sMain.Range("J9").Value, sZipCodes.Range("B2:E864"), 3, _
                   False, "")

最后一个参数是vlookup失败时返回的默认值。所以在这个例子中它会返回一个空字符串。

答案 1 :(得分:2)

我通常使用包含默认值的iferror()包装vlookup()。

语法如下:

iferror(vlookup(....), <default value when lookup fails>)

您也可以这样做:

Dim result as variant
result = Application.vlookup(......)
If IsError(result) Then
  ' What to do if an error occurs
Else
  ' what you would normally do
End if

答案 2 :(得分:1)

您从Vlookup更改为Lookup,其参数较少。只使用2个参数,你应该没问题:provinceZip = Application.Lookup(sMain.Range("J9").Value, sZipCodes.Range("B2:E907") )

答案 3 :(得分:-1)

SafeVlookup是一个很好的功能。 我还在学习VB。 我改变了这样,对我有用。

     Function SafeVlookup(lookup_value, _
                    range_lookup, col_index, error_value) As Variant
     .....
     return_value = Application.WorksheetFunction.vlookup(lookup_value, _
                    range_lookup, col_index, error_value)
     ....
     End Function

希望我能像这样使用它。