首页 > 解决方案 > 循环通过工作表时匹配不会改变 lRow

问题描述

使用下面的匹配函数并循环工作表时,在匹配值的工作表之后匹配工作表时,计算是错误的。因此,例如在第二张纸lRow = 209和第三张纸中不应该匹配的地方lRow仍然是 209 而不是错误/零。

Sub lvl()

    Dim lRow As Long
    Dim ws As Worksheet
    Dim starting_ws As Worksheet

    Set starting_ws = ActiveSheet

        For Each ws In ThisWorkbook.Worksheets

         ws.Activate
         On Error Resume Next

         lRow = Application.WorksheetFunction.Match("LVL", ws.Range("A1:A1000"), 0)


            If lRow > 0 Then
                If Cells(lRow, 2).Value > 1 Then

                    Cells(lRow, 2).Select
                    Selection.End(xlDown).Select
                    TheActiveRow1 = ActiveCell.Row
                    TheActiveColumn1 = ActiveCell.Column

                    Selection.End(xlDown).Select
                    TheActiveRow2 = ActiveCell.Row
                    TheActiveColumn2 = ActiveCell.Column

                End If
            End If

        Next

    starting_ws.Activate

End Sub

标签: excelvba

解决方案


你的问题在这里:

On Error Resume Next
lRow = Application.WorksheetFunction.Match("LVL", ws.Range("A1:A1000"), 0)

lRow如果"LVL"未找到,则实际上不会更改,就好像 Match 失败一样,执行会在该行引发错误(您接下来从该行继续)。如果您想lRow在没有找到任何内容时为零,请在使用 Match 函数之前将其设置为零:

On Error Resume Next
lRow = 0
lRow = Application.WorksheetFunction.Match("LVL", ws.Range("A1:A1000"), 0)

或者,考虑使用Application.Match代替并将其捕获IsError

'On Error Resume Next <-no need for this
lRow = Application.Match("LVL", ws.Range("A1:A1000"), 0)
If IsError(lRow) then lRow = 0

推荐阅读