4

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

  1. 在主工作表中输入邮政编码
  2. 在其中邮政编码与城市、省、区相关联的数据库(在另一张表中)中的程序搜索。
  3. 当匹配时,它将结果发送到主页,因此用户只需输入邮政编码即可获得城市、省、区。很简单的过程。

我使用此代码这样做:

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

提前致谢 !

编辑:这是我的新代码,遵循 Tim Williams 的建议:

'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,参数数量无效

4

4 回答 4

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 失败时返回的默认值。所以在这个例子中它会返回一个空字符串。

于 2013-08-16T15:46:35.100 回答
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
于 2013-06-25T20:35:10.050 回答
1

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

于 2014-08-28T16:05:33.220 回答
-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

希望我能像这样使用它。

于 2014-04-21T05:21:08.200 回答