VBA – Excel:找不到匹配时,Vlookup崩溃我的程序

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

  1. 在主表中键入一个邮政编码
  2. 程序在一个数据库(在另一张表)中search邮政编码与市,省,区相关的数据库。
  3. 当匹配时,将结果发送到主页面,用户只需input邮政编码就可以得到一个城市,省份,地区。 非常简单的过程。

我使用这个代码来做到这一点:

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函数中引入这个请求。

提前致谢 !

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

 '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) 

=>错误1004,参数的数目无效

您应该阅读VBAerror handling。 像http://www.cpearson.com/excel/errorhandling.htm这样的源可能会有所帮助&#x3002; 这就是说,请尝试下面的代码。

你想要的东西像:

 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失败,最后一个参数是返回的默认值。 所以在这个例子中它会返回一个空string。

我通常用包含默认值的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 

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

SafeVlookup是一个很好的function。 我还在学习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 

希望我能像这样使用它。