2013-08-01 2 views
0

Я пытаюсь выполнить цикл над листами Excel, чтобы удалить строки, не содержащие «ALTW.ARNOLD_1» или «DECO.FERMI2». Я собрал следующий код, который работает на одном листе, но когда я петлю, цикл проходит через все листы, только выполняя удаление строки на первом листе. Листы пронумерованы от 1 до 365. Вот код:VBA Looping Over Sheets: удалять строки, если ячейка не содержит

Sub Delete_Rows() 

For x = 1 To 365 
    Sheets(x).Select 
    Dim rng As Range, cell As Range, del As Range 
    Set rng = Intersect(Range("A1:A5000"), ActiveSheet.UsedRange) 
    For Each cell In rng 
    If (cell.Value) <> "ALTW.ARNOLD_1" And (cell.Value) <> "DECO.FERMI2" _ 
    Then 
    If del Is Nothing Then 
    Set del = cell 
    Else: Set del = Union(del, cell) 
    End If 
    End If 
    Next cell 
    On Error Resume Next 
    del.EntireRow.Delete 
Next x 

End Sub 

ответ

1

Гораздо безопаснее избегать выбора/активации в целом. Вы также не сбрасывали del после каждого цикла ...

Sub Delete_Rows() 

Dim rng As Range, cell As Range, del As Range 
dim sht as Worksheet 

For x = 1 To 365 
    set sht=Sheets(x) 
    set del=Nothing 'you missed this 

    Set rng = Intersect(sht.Range("A1:A5000"), sht.UsedRange) 
    For Each cell In rng.Cells 
    If (cell.Value) <> "ALTW.ARNOLD_1" And (cell.Value) <> "DECO.FERMI2" _ 
    Then 
     If del Is Nothing Then 
      Set del = cell 
     Else 
      Set del = Union(del, cell) 
     End If 
    End If 
    Next cell 
    If not del is nothing then del.EntireRow.Delete 
Next x 

End Sub 
+0

Спасибо! Проблема в том, что сброс дель после каждой петли был проблемой. Можете ли вы пояснить, что вы подразумеваете под этим: «безопаснее», чтобы избежать выбора/активации? в любом случае кажется более чистым сделать это так, как вы указали. –

+0

Я имею в виду, что лучше обращаться непосредственно к объекту, такому как рабочий лист или рабочая книга, а не выбирать/активировать его, а затем полагаться на то, что он остается активным при работе с «Activesheet/Activeworkbook». Иногда это неожиданно ломается, так как другие листы/книги могут как-то стать активными до того, как ваш код будет выполнен. Например. пользователь нажимает на что-то, некоторые надстройки реагируют на событие и меняют активный объект и т. д. –

0

del представляет собой диапазон ячеек, когда вы дойдете до EntireRow.Delete линии, вам необходимо перебрать каждую ячейку в del диапазоне.

For x = 1 To 365 
    Sheets(x).Select 
    Dim rng As Range, cell As Range, del As Range 
    Set rng = Intersect(Range("A1:A5000"), ActiveSheet.UsedRange) 
    For Each cell In rng 
    If (cell.Value) <> "ALTW.ARNOLD_1" And (cell.Value) <> "DECO.FERMI2" _ 
    Then 
    If del Is Nothing Then 
    Set del = cell 
    Else: Set del = Union(del, cell) 
    End If 
    End If 
    Next cell 
    On Error Resume Next 
    For each cell in dell.cells 
     cell.EntireRow.Delete 
    Next cell 
Next x 
Смежные вопросы