【问题标题】:VBA Error Handling: Unable to get the match property of the worksheet function classVBA 错误处理:无法获取工作表函数类的匹配属性
【发布时间】:2017-05-24 06:17:28
【问题描述】:

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

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

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

【问题讨论】:

  • 你是如何声明searchRange的?
  • @BruceWayne searchRange 定义为`searchRange = "A" & startrow & ":A" & EndRow`。这两个变量也是在代码的前面定义的,但为了简单起见,我想我会把它们放在这里。
  • 你能把所有的代码都包含进去吗?正如@YowE3k 指出的那样,这可能有几个原因。如果你关闭错误处理会发生什么?

标签: vba excel error-handling match


【解决方案1】:

您需要确保在这里使用.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

【讨论】:

  • 我怀疑 OP 在 Sheet1 的 B 列中具有 startrow,在 C 列中具有 endrow (即他们正在尝试执行Indirect),否则两个变量都将设置为n
【解决方案2】:

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

【讨论】:

  • 你能解释一下exit subend sub之间的区别吗?
  • @eob 当然,End Sub 标志着子例程代码的结束。 Exit Sub 是一种从子程序中退出并在子程序内的任何位置返回给调用者的方法。
  • 如果一切正常,我们在上面的代码中所做的是退出ErrHandler之前的sub。
【解决方案3】:

按照上面的cmets:

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

无论如何,您的第一个 Do While Sheets("Sheet1").Range("A" &amp; n) &lt;&gt; "" 对下面的所有行都有相同的 n,这意味着您将获得相同的行号 startrowEndRow ,这就是您想要的?? (这也将导致searchRange 是 A 列中的单个单元格)

您需要做的是“抓住”好的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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2023-02-02
    • 1970-01-01
    相关资源
    最近更新 更多