在我的代码中处理此错误时苦苦挣扎:“无法获取工作表函数类的匹配属性”
我知道错误意味着找不到该功能的匹配项。问题是,如果没有找到符合此条件的匹配,我试图告诉程序只是跳过给定的循环迭代。我将错误处理程序放在可能失败的代码上方,但它几乎忽略了错误处理程序并且无论如何都给了我一个错误窗口。有什么想法吗?
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
答案 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
,这意味着您将获得startrow
和EndRow
的相同行号,你想要的是什么? (这也会导致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