WorksheetFunction 错误子或函数未定义

WorksheetFunction error sub or function not defined

我想知道是否有人可以帮助我。我创建了一个非常简单的用户表单来记录信息。但是,我的问题是当其中一个字段为空白时,我收到一条错误消息:

Sub or Function not defined.

Private Sub CommandButton1_Click()

Dim iRow As Long
Dim ws As Worksheet
Set ws = Worksheets("Data")

'find first empty row in database
iRow = ws.Cells.Find(What:="*", SearchOrder:=xlRows, _
    SearchDirection:=xlPrevious, LookIn:=xlValues).Row + 1

'check for a Name number
    If Trim(QueryType.Value) = "" Then
        QueryType.SetFocus
            MsgBox "Please complete the form"
        Exit Sub
    End If

    'copy the data to the database
    ws.Cells(iRow, 1).Value = Format(Now, "DD/MM/YYYY")
    ws.Cells(iRow, 2).Value = Format(Now, "HH:MM")
    ws.Cells(iRow, 3).Value = Application.UserName
    ws.Cells(iRow, 4).Value = CType.Value
    ws.Cells(iRow, 5).Value = IName.Value
    ws.Cells(iRow, 6).Value = QType.Value
    ws.Cells(iRow, 7).Value = 1
    ws.Cells(iRow, 8).Value = Format(Date, "MMM-YY")
    'ws.Cells(iRow, 9).Value = Application.WorksheetFunction.VLookup(InternalName.Value, Sheet2.Range("C1:D23"), 2, 0)
    'ws.Cells(iRow, 9).Value = Application.WorksheetFunction.IfError(VLookup(InternalName.Value, Sheet2.Range("C1:D23"), 2, 0), "")
   ws.Cells(iRow, 10).Value = Application.WorksheetFunction.VLookup(InternalName.Value, Sheet2.Range("C1:E23"), 3, 0)
    ws.Cells(iRow, 11).Value = "IB"

Unload Me

MsgBox "Data added", vbOKOnly + vbInformation, "Data Added"

End Sub

问题出在我收到错误的任一注释掉的行中。只有当我将下拉框留空时,我才会收到。如果填充,则不会发生错误。我可以轻松地为 "Not Applicable" 添加一个额外的菜单选项,但我宁愿它只是空白。请问有人有什么建议吗?

三件事。

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- WorksheetFunctionApplication 对象中的相同方法的工作方式不同。在前者中,如果结果是错误的(例如:与搜索值不匹配),则会在 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])..(对我来说毫无意义)。