我不确定,如何修复这个功能。
如果Isnumber(search)为真,则从lookup_table中获取值
在第二轮之后结束
excel数据图片
Function Slookup(lookup_value As String, lookup_table As Range) As String
Dim i As Integer
On Error GoTo Err
Dim valuetxt As Boolean
Dim cc As Integer
cc = lookup_table.Rows.Count
For i = 1 To cc
valuetxt = IsError(Application.WorksheetFunction.Search(lookup_table.Cells(i, 1), lookup_value))
If Not valuetxt Then
Slookup = lookup_table.Cells(i, 2)
Exit Function
End If
Slookup = ExcelError.ExcelErrorNA
Err:
Next i
End Function
Tim Williams指出IsError()
不能捕获运行时错误(1004
)是正确的。因此,您的IsError()
没有做太多,除了在没有错误时为If Not valuetxt Then
提供必要的False
。
真正的问题在于错误处理程序留在循环中。一旦你已经进入Err:
,On Error GoTo Err
将不会被触发。代码在第三个示例中失败,因为这是您遇到错误的第二次时间。
。在第三个示例中,您将在IsError(Application.WorksheetFunction.Search("A", "E G F"))
和移动到Err:
。但是,您没有退出循环,所以现在您将在IsError(Application.WorksheetFunction.Search("B", "E G F"))
处得到另一个错误,并且程序崩溃了。(所以,你的第二个例子实际上也遇到了一个错误,但它从来没有遇到过另一个错误。)
你可以这样修改:
Function SlookupAdj(lookup_value As String, lookup_table As Range) As String
Dim i As Integer
Dim valuetxt As Boolean
Dim cc As Integer
cc = lookup_table.Rows.Count
For i = 1 To cc
On Error Resume Next
valuetxt = IsError(Application.WorksheetFunction.Search(lookup_table.Cells(i, 1), lookup_value))
If Err Then
Err.Clear
Else
If Not valuetxt Then
SlookupAdj = lookup_table.Cells(i, 2)
Exit Function
End If
End If
SlookupAdj = ExcelError.ExcelErrorNA
Next i
End Function
在这段修改后的代码中,我们遇到了同样的错误,但只是跳过它,处理存在错误(If Err Then
)的事实,清除它,然后确保我们永远不会到达If Not valuetxt Then
的求值。
再一次,Tim Williams是正确的,他注意到你正在尝试做的事情,使用Instr()
更容易完成。像这样:
Function InstrMethod(lookup_value As String, lookup_table As Range) As String
Dim i As Integer
Dim valuetxt As Boolean
Dim cc As Integer
cc = lookup_table.Rows.Count
For i = 1 To cc
valuetxt = InStr(lookup_value, lookup_table.Cells(i, 1))
If valuetxt Then
InstrMethod = lookup_table.Cells(i, 2)
Exit Function
End If
Next i
End Function