【问题标题】:WorksheetFunction error sub or function not definedWorksheetFunction 错误子或未定义函数
【发布时间】:2017-05-12 09:59:46
【问题描述】:

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

子或函数未定义。

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

问题出在我收到错误的注释行之一。只有当我将下拉框留空时我才会收到。如果已填充,则不会发生错误。我可以很容易地为“不适用”添加一个额外的菜单选项,但宁愿它只是空白。请问大家有什么建议吗?

【问题讨论】:

  • 调试时突出显示哪一行?
  • @Kelaref 无论 iRow,9 我取消注释。对不起,我应该说。我最初只是将它作为一个vlookup。当我收到错误时,我认为 Iferror 函数可以解决问题,但它会产生相同的结果。

标签: vba excel compiler-errors worksheet-function


【解决方案1】:

三件事。

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), "")

附言我个人大多数时候更喜欢Application.。有些人更喜欢WorksheetFunction,主要是因为它提供了 Intellisense,但我觉得这没什么用,因为 Intellisense 中方法的参数是未命名且未键入的,即 VLookup(arg1, arg2, arg3, [arg4])..(对我来说毫无意义)。

【讨论】:

    猜你喜欢
    • 2015-10-26
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多