VBA错误处理:无法获取工作表函数类的match属性

时间:2017-01-09 21:30:35

标签: excel vba excel-vba error-handling match

在我的代码中处理此错误时苦苦挣扎:“无法获取工作表函数类的匹配属性”

我知道错误意味着找不到该功能的匹配项。问题是,如果没有找到符合此条件的匹配,我试图告诉程序只是跳过给定的循环迭代。我将错误处理程序放在可能失败的代码上方,但它几乎忽略了错误处理程序并且无论如何都给了我一个错误窗口。有什么想法吗?

n = 2               
    On Error GoTo SkipRun
    Do While Sheets("Sheet1").Range("A" & n) <> ""
        l = Empty
        layercount = Sheets("Sheet1").Cells(n, 11)

        startrow = Sheets("Sheet1").Range("B" & n)
        EndRow = Sheets("Sheet1").Range("C" & n)
        searchRange = "A" & startrow & ":A" & EndRow


        l = Application.WorksheetFunction.Match("DLA", Worksheets("Sheet2").Range(searchRange), 0) + startrow - 1

这里发生错误^

        Dim steps() As Variant
        ReDim steps(1, layercount)

                    a = 1
        Do While a <= layercount
            steps(1, a) = Sheets("Sheet2").Range("B" & l + a - 1)

            If a = 1 Then
                GoTo skiploop
            ElseIf a > 1 Then
                If steps(1, a) = steps(1, a - 1) Then steps(1, a) = 0
            End If
 skiploop:
                 a = a + 1
              Loop

SkipRun:
        n = n + 1
        Loop                'END OF MAIN LOOP
End Sub

3 个答案:

答案 0 :(得分:1)

VBA中的错误处理有点棘手。基本上,您正在循环中处理错误,但您没有退出该过程。你遇到错误一次,你处理它并继续循环 - 但你仍然在同一个子 - 所以无论你放置的错误处理机制如何,下一个错误都会提高..

要在捕获并处理错误后继续执行相同的过程/循环,需要以任何方式调用Resume语句。调用Resume后,您的错误处理机制再次有效。在您的情况下,您应该执行以下操作:

    On Error Goto ErrHandler
    Do While Sheets("Sheet1").Range("A" & n) <> ""
        .... ' your loop
NextN:
        n = n + 1
    Loop

    ...

    Exit Sub

ErrHandler:
    Resume NextN 'you need to call Resume, to continue your loop with valid error handling.

End Sub

答案 1 :(得分:1)

根据上述评论:

startrow = Sheets("Sheet1").Range("B" & n)&lt; - 这是设置范围的方法,而不是最后一行 EndRow = Sheets("Sheet1").Range("C" & n)&lt; - 这是设置范围的方法,而不是最后一行

无论如何,您的第一个Do While Sheets("Sheet1").Range("A" & n) <> ""对于以下所有行都有相同的n,这意味着您将获得startrowEndRow的相同行号,你想要的是什么? (这也会导致searchRange是A列中的单个单元格)

你需要做的是&#34; Catch&#34;良好的Match结果,并忽略没有的情况。您可以使用Application.Match函数使用以下代码执行此操作:

' Match was unable to find a matching in range
If IsError(Application.Match("DLA", Worksheets("Sheet2").Range(searchRange), 0)) Then
    ' do nothing
Else ' <-- successful match
    l = Application.Match("DLA", Worksheets("Sheet2").Range(searchRange), 0) + startrow - 1
    ' rest of your Do While loop code here
End If

或者,您也可以使用1 If条件执行此操作:

If Not IsError(Application.Match("DLA", Worksheets("Sheet2").Range(searchRange), 0)) Then
    l = Application.Match("DLA", Worksheets("Sheet2").Range(searchRange), 0) + startrow - 1
End If

注意:无需在上面的行中使用l = Empty

答案 2 :(得分:0)

您需要确保在此处使用.row

startrow = Sheets("Sheet1").Range("B" & n).row
EndRow = Sheets("Sheet1").Range("C" & n).row

但将它定义为范围可能更好:

Dim n As Long, startRow As Long, endRow As Long
Dim searchRange As Range
' n = whatever number
startRow = Sheets("Sheet1").Range("B" & n).Row
endRow = Sheets("Sheet1").Range("C" & n).Row
Set searchRange = Worksheets("Sheet2").Range("A" & startRow & ":A" & endRow)

l = Application.WorksheetFunction.Match("DLA", searchRange, 0) + startRow - 1