VBAerror handling:无法获取工作表函数类的匹配属性

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

我知道错误意味着没有find匹配的function。 问题是,我试图告诉程序只是跳过一个给定的循环迭代,如果找不到匹配这个标准。 我把error handling程序放在可能失败的代码的上面,但它几乎忽略了error handling程序,并且给了我一个错误窗口。 有任何想法吗?

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 

在VBA中处理错误有点棘手。 基本上,你正在处理循环内的错误,但是你没有退出程序。 你碰到错误一次,你处理它,你继续循环 – 但你仍然在同一个子 – 所以无论你的error handling机制,下一个错误会提高。

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

  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 

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

遵循以上评论:

startrow = Sheets("Sheet1").Range("B" & n) < – 这是如何设置一个范围,而不是最后一行EndRow = Sheets("Sheet1").Range("C" & n) < – 这是如何设置范围,而不是最后一行

无论如何,你的第一个Do While Sheets("Sheet1").Range("A" & n) <> ""对于下面的所有行都具有相同的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