在VBA中使用搜索自定义查找



我不确定,如何修复这个功能。

如果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

最新更新