使用 VBA 中的搜索进行自定义查找

Custom lookup using search in VBA

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

如果 Isnumber(search) 为真,则从 lookup_table

获取值

第二轮结束

Image of excel data

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() 无法捕获 run-time 错误 (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")) 处收到另一个错误并且事情发生故障。 (因此,您的 second 示例实际上也遇到了错误,但它从未遇到过另一个错误。)

您可以按如下方式解决此问题:

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