Do-While循环是否会破坏For Each-Next循环?

时间:2015-06-11 16:35:55

标签: vba excel-vba loops nested excel

我尝试确保某个范围在我对这些可见行进行操作(删除它们)之前有可见的行,因为如果我在那里没有任何可见的行时尝试对过滤范围进行操作,我会收到错误。

Dim lastrow As Integer
Dim ws as Worksheet

For Each ws In ActiveWorkbook.Worksheets
        ws.Activate

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

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

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

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

Next

代码块工作正常,直到我添加了Do-If-While嵌套循环。我现在得到编译错误:下一个没有For

我做错了什么?

谢谢。

2 个答案:

答案 0 :(得分:2)

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

Do
    If ActiveCell.SpecialCells(xlCellTypeVisible) Then
        ActiveSheet.Range("$O$8:$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$8:$O$" & lastrow).SpecialCells(xlCellTypeVisible).EntireRow.DELETE
        Exit Do
    End If
Loop

答案 1 :(得分:0)

不是逐行删除,而是全部删除。你是以一种非常复杂的方式进行的。您所要做的就是搜索第一个未过滤的行。我这样做是通过搜索最后一列中标题下方的第一个空单元格(除非你使用每一个可用的列,否则这是有效的,这实际上是非常不可能的。)

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

我认为逐行循环比一次性完成循环慢得多。