我想知道是否有人可以帮助我。我创建了一个非常简单的用户表单来记录信息。我的问题是,当其中一个字段为空时,我收到一条错误消息:
Sub或Function未定义。
# coding: utf-8
x = u'LÄCHERLICH'
print x.lower().encode('utf8')
问题出在我收到错误的任何一条注释掉的行中。如果我将下拉框留空,我才会收到。如果填充,则不会发生错误。我可以轻松地为“不适用”添加额外的菜单选项,但是它只是空白。有人有任何建议吗?
答案 0 :(得分:3)
三件事。
1- VLookup
本身不是VBA函数,它是Application
对象或WorksheetFunction
对象的成员方法。因此,您应该使用来限定VLookup
,即使您使用其他方法(例如WorksheetFunction.IfError(...)
)。
ws.Cells(iRow, 9).Value =
WorksheetFunction.IfError(WorksheetFunction.VLookup(InternalName.Value, Sheet2.Range("C1:D23"), 2, 0), "")
' ^^^^^^^^^^^^^^^^^^
2- WorksheetFunction
和Application
个对象中的相同方法的工作方式不同。在前者中,如果结果是错误(例如:搜索值不匹配),则在VBA中引发错误。在后者中,不会引发错误,但返回的值为Error Variant
。对于VBA,后一种形式通常更安全,因为您不需要一些On Error Resume Next
左右,但您可以使用If(IsError(result))
检查结果。
3-如果您的搜索条件为空或不匹配,则由于使用WorksheetFunction.VLookup
而导致错误(根据2)。如果您只想设置结果值并继续,则可以使用Application.VLookup
代替:
ws.Cells(iRow, 9).Value = Application.IfError(Application.VLookup(InternalName.Value, Sheet2.Range("C1:D23"), 2, 0), "")
P.S。我个人更喜欢Application.
。有些人更喜欢WorksheetFunction
,主要是因为它提供了Intellisense,但我觉得它很无用,因为Intellisense中方法的参数是未命名和无类型的,即VLookup(arg1, arg2, arg3, [arg4])
..(对我来说没有意义)。< / p>