VBA – Excel:找不到匹配时,Vlookup崩溃我的程序
在我的程序中,用户键入一个邮政编码,并获得与邮政编码(省,市,区)有关的输出信息。 为此,我使用Vlookup函数。 所以,用户:
- 在主表中键入一个邮政编码
- 程序在一个数据库(在另一张表)中search邮政编码与市,省,区相关的数据库。
- 当匹配时,将结果发送到主页面,用户只需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这样的源可能会有所帮助。 这就是说,请尝试下面的代码。
你想要的东西像:
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
希望我能像这样使用它。