Excel VBA工作表功能是否需要使用select来显示在正确的工作表上

Excel VBA工作表功能是否需要使用select来显示在正确的工作表上,excel,vba,Excel,Vba,我有以下代码,但我必须选择工作表,否则WorksheetFunction将返回错误: Function Find_Allocation_Acct_Row_Number(allocation_acct As String, allocation_cc As String) Dim WS As Worksheet Dim CC_row As Integer Dim search_rng As Range Set WS = Sheets(allocation_cc) WS.Select Set s

我有以下代码,但我必须选择工作表,否则WorksheetFunction将返回错误:

Function Find_Allocation_Acct_Row_Number(allocation_acct As String, allocation_cc As String)
Dim WS As Worksheet
Dim CC_row As Integer
Dim search_rng As Range

Set WS = Sheets(allocation_cc)
WS.Select

Set search_rng = WS.Range("E1:E2000")

CC_row = WS.Application.WorksheetFunction.Match(allocation_acct,search_rng, 0)

Find_Allocation_Acct_Row_Number = CC_row + 4
End Function
如何在不使用select命令的情况下在正确的工作表上选择正确的范围

说清楚一点,我总是能找到价值所在。我只需要返回该行,以便从中创建一个范围

我尝试了许多不同的方法将“搜索”更改为不同的变量或范围表达式,但没有成功

我得到的错误是:

Run-time error '1004':
Unable to get the Match property of the WorksheetFunction class

如果没有找到匹配项,它将抛出一个错误并停止代码。如果我们延迟绑定匹配并将结果发送到变体,我们可以测试错误:

Function Find_Allocation_Acct_Row_Number(allocation_acct As String, allocation_cc As String) As Long
    Dim WS As Worksheet
    Set WS = Worksheets(allocation_cc)

    Dim search_rng As Range
    Set search_rng = WS.Range("E1:E2000")

    Dim CC_row As Variant
    CC_row = Application.Match(allocation_acct, search_rng, 0)

    If Not IsError(CC_row) Then
        Find_Allocation_Acct_Row_Number = CC_row + 4
    Else
        Find_Allocation_Acct_Row_Number = -1
    End If
End Function

现在,如果找不到匹配项,它将返回
-1

错误消息是什么?注意-最好向函数传递工作表对象,而不是表示名称的字符串。而且最好使用
Long
而不是
Integer
。并且要明确-只要将
添加到函数声明的末尾,就可以添加
。您不需要
Match
上的
WS
Search\u rng
将工作表作为变量的一部分。您不应该需要
WS。如果您遇到错误,请选择
,这是因为当在搜索范围中找不到该值时,会产生一个停止代码的错误。如果您正在查找
0001
,它可能很简单,因为查找是一个格式化为显示lead
0
s的数字,而不是一个文本字符串。如果试图将格式化为
0000
的文本字符串
0001
1
匹配,则将找不到匹配项。@Vaslo问题不在于代码,而在于数据或调用函数的方式。很抱歉,我在上面添加了错误,因为该值始终存在。这条线将完全不同。@Vaslo从不认为不会发生错误。因为——它会的,墨菲定律。好吧,我相信大量的谨慎,并且可以添加建议,但是如果当我知道我的价值在那里时它出错了,不幸的是它不能解决我的问题。