运行时错误'1004'无法获取WorksheetFunction类的Match属性

时间:2013-09-26 14:17:34

标签: vba excel-vba match excel

在我的宏中,我有以下代码:

i = Application.WorksheetFunction.Match(str_accrual, Range(Selection, Selection.End(xlToRight)), 0)

其中'str_accrual'是此行前面捕获的字符串,所选范围是单行,例如从“A1”到“BH1”,结果将是一个数字,即该字符串在该范围内的位置选择。

当我运行宏时,我收到错误:

  

运行时错误'1004'无法获取WorksheetFunction类的Match属性

但是当我使用(F8)键逐行运行宏时,我没有得到这个错误,但是当我连续运行宏时,我得到了错误。同样,如果中止宏并再次运行它,则不会出现错误。

6 个答案:

答案 0 :(得分:1)

我试了好几次。似乎如果没有匹配,表达式将提示此错误

如果您想捕获错误,请使用Application.Match代替

然后你可以用isError

包装它

答案 1 :(得分:1)

关于此错误的大量帖子,但就我阅读帖子而言没有解决方案。 似乎要使各种工作表功能起作用,工作表必须是活动/可见。 (至少我在Match()之后的最新发现是因为虚假的原因而随机工作。)

我希望这个谜团得到解决,虽然为这种查找操作激活工作表是一件痛苦的事情并且花费了几个CPU周期。

所以我玩弄了语法变化,结果发现代码在我删除下划线换行符后开始工作,无论工作表是否显示。 < - 好吧,由于某种原因,我仍然需要激活工作表: - (

'无效

'Set oCllHeader = ActiveWorkbook.Worksheets("Auswertung").Cells(oCllSpielID.Row, _
                    Application.Match( _
                        strValue, _
                        ActiveWorkbook.Worksheets("Auswertung").Range( _
                            oCllSpielID, _
                            ActiveWorkbook.Worksheets("Auswertung").Cells(oCllSpielID.Row, lastUsedCellInRow(oCllSpielID).Column)), _
                            0))

'确实有效(删除带有下划线的换行符以获取可读性)< - 此语法稍后停止工作,无法激活工作表: - (

Set oCllHeader = ActiveWorkbook.Worksheets("Auswertung").Cells(oCllSpielID.Row, Application.Match(strValue, ActiveWorkbook.Worksheets("Auswertung").Range(oCllSpielID, ActiveWorkbook.Worksheets("Auswertung").Cells(oCllSpielID.Row, lastUsedCellInRow(oCllSpielID).Column)), 0))

最后,我正在为这个谜团的更多实现而烦恼,并且花了很多时间。

欢呼声

答案 2 :(得分:1)

我间歇性地收到此错误。原来,这是在我有一个不同的工作表时发生的。

Range的文档说,

  

在不使用对象限定符(句点左侧的对象)的情况下使用时,Range属性将返回活动工作表上的范围。

因此,要纠正该错误,请添加一个限定符:

Sheet1.Range

答案 3 :(得分:0)

如果MATCH找不到值,那就是你得到的。

答案 4 :(得分:0)

请改为尝试:

If Not IsError(Application.Match(str_accrual, Range(Selection, Selection.End(xlToRight)), 0)) Then
    i = Application.Match(str_accrual, Range(Selection, Selection.End(xlToRight)), 0)
Else
    'do something if no match is found

End If

<强>更新

以下是不依赖于Selection的更好的代码,除非作为用户输入的方式来定义要搜索的范围。

Sub Test()

Dim str_accrual As String
Dim rngToSearch As Range

str_accrual = InputBox("Search for?")

Set rngToSearch = Range(Selection, Selection.End(xlToRight))

If Not IsError(Application.Match(str_accrual, rngToSearch, 0)) Then
    i = Application.Match(str_accrual, rngToSearch, 0)
    MsgBox i
Else
    MsgBox "no match is found in range(" & rngToSearch.Address & ")."
End If
End Sub

答案 5 :(得分:0)

我使用了“If Not IsError”并且错误一直显示。要防止出错,请添加以下行:

On Local Error Resume Next