簡體   English   中英

VBA錯誤處理:無法獲取工作表函數類的match屬性

[英]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 ,這意味着您將獲得相同的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

您需要確保在此處使用.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM