我不确定,如何修复此功能。
如果 Isnumber(search) 为真,则从 lookup_table 中获取值
第二轮结束后
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()
事情。False
If Not valuetxt Then
真正的问题在于您的错误处理程序停留在循环中。On Error GoTo Err
一旦你已经在里面就不会被触发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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句