![](/img/trans.png)
[英]VBA: Unable to get the Match property of the WorkSheet function class
[英]VBA Error Handling: Unable to get the match property of the worksheet function class
在我的代碼中努力處理此錯誤:“無法獲取工作表函數類的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
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
遵循以上評論:
startrow = Sheets("Sheet1").Range("B" & n)
<-這是設置范圍而不是獲取最后一行的方法EndRow = Sheets("Sheet1").Range("C" & n)
<-這是設置范圍而不是獲取最后一行的方法
無論如何,您的第一個Do While Sheets("Sheet1").Range("A" & n) <> ""
在下面的所有行中都具有相同的n
,這意味着您將獲得相同的startrow
和EndRow
行號,這就是你想要的? (這還將導致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
。
您需要確保在此處使用.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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.