Do-While 循环会中断 For Each-Next 循环吗?

Does a Do-While loop break a For Each-Next Loop?

在我对那些可见行进行操作(删除它们)之前,我试图确保一个范围具有可见行,因为如果我在没有任何可见行的情况下尝试对过滤范围进行操作,我会报错。

Dim lastrow As Integer
Dim ws as Worksheet

For Each ws In ActiveWorkbook.Worksheets
        ws.Activate

        ws.Range("$A").Select
        Selection.End(xlDown).Select
        lastrow = ActiveCell.Row

        'DELETE PART CLASSES ROWS
        ActiveSheet.Range("$O:$O$" & lastrow & "").AutoFilter Field:=1, Criteria1:= _
        Array("CONS", "MISC", "PFG", "PRT", "TOTE", "="), _
        Operator:=xlFilterValues

        Range("$A").Select
        Do
            If ActiveCell.SpecialCells(xlCellTypeVisible) Then
                ActiveSheet.Range("$O:$O$" & lastrow).SpecialCells(xlCellTypeVisible).EntireRow.DELETE
                Exit Do
            End If
        While ActiveCell.Row < lastrow

        Range("$O").AutoFilter Field:=1

Next

在我添加 Do-If-While 嵌套循环之前,代码块工作正常。我现在收到编译错误:Next without For

我做错了什么?

谢谢。

appears 你的 do/while 循环应该这样写:

Do
    If ActiveCell.SpecialCells(xlCellTypeVisible) Then
        ActiveSheet.Range("$O:$O$" & lastrow).SpecialCells(xlCellTypeVisible).EntireRow.DELETE
        Exit Do
    End If
Loop While ActiveCell.Row < lastrow

如果你希望有一个简单的 while 循环总是计算条件,而不是第一次不计算它,你需要这样写:

Do While ActiveCell.Row < lastrow
    If ActiveCell.SpecialCells(xlCellTypeVisible) Then
        ActiveSheet.Range("$O:$O$" & lastrow).SpecialCells(xlCellTypeVisible).EntireRow.DELETE
        Exit Do
    End If
Loop

不是逐行删除,而是全部删除。您正在以一种非常复杂的方式进行处理。您所要做的就是搜索第一个未过滤的行。我通过在最后一列中搜索 header 下方的第一个空单元格来执行此操作(除非您使用可用的每一列,否则这将起作用,这真的非常不可能。)

Sub deleteUnfiltered()
'
    Dim ws As Worksheet

    headerRow = 1

    For Each ws In ActiveWorkbook.Worksheets

        ws.Activate
        lastCol = Columns.Count
        firstRow = Columns(lastCol).Find(What:="", After:=Cells(headerRow, lastCol), LookIn:=xlFormulas, LookAt _
            :=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext).Row

        lastRow = Cells(Rows.Count, headerRow).End(xlUp).Row
        If lastRow <= headerRow Then lastRow = firstRow

        Rows(firstRow & ":" & lastRow).Delete Shift:=xlUp

    Next

End Sub

我认为逐行循环比一次完成所有操作要慢得多。