使用 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
我不确定,如何修复此功能。
如果 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