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- 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])
..(对我来说毫无意义)。
我想知道是否有人可以帮助我。我创建了一个非常简单的用户表单来记录信息。但是,我的问题是当其中一个字段为空白时,我收到一条错误消息:
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- 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])
..(对我来说毫无意义)。