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
我认为逐行循环比一次完成所有操作要慢得多。
在我对那些可见行进行操作(删除它们)之前,我试图确保一个范围具有可见行,因为如果我在没有任何可见行的情况下尝试对过滤范围进行操作,我会报错。
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
我认为逐行循环比一次完成所有操作要慢得多。