2015-06-11 6 views
-1

Я пытаюсь убедиться, что диапазон имеет видимые строки, прежде чем я буду воздействовать на эти видимые строки (удалите их), потому что если я попытаюсь действовать в отфильтрованном диапазоне, когда там нет видимых строк, я получу ошибка.Выполняет ли цикл Do-While for для каждого следующего цикла?

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. Теперь я получаю ошибку компиляции: Следующая без

Что я делаю неправильно?

спасибо.

+3

Разве ваш 'Do While' не нужен' Loop'? 'Do .. IF .. End if .. Loop While ...' – Raystafarian

+0

^this. 'Do Loop While ' – FreeMan

+0

Простая типографская/синтаксическая ошибка. VTC – Chrismas007

ответ

2

Это appears ваш цикл do/while должно быть написано так:

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 
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 

Я думаю, что зацикливание ряд за строкой будет намного медленнее, чем делать все за один выстрел.

Смежные вопросы