Удаление ячеек с помощью элемента "For Each... Цикл Next" в Excel

Сводка

Microsoft Excel 2002 и более поздних версий Excel удаляет ячейки в элементе "For Each... Далее" цикл отличается от microsoft Excel 97 и более ранних версий Excel.

В этой статье описаны различия и приведен пример макроса Visual Basic для приложений, иллюстрирующий удаление ячеек в цикле.

Дополнительная информация

Корпорация Майкрософт предоставляет примеры программирования только в целях демонстрации без явной или подразумеваемой гарантии. Данное положение включает, но не ограничивается этим, подразумеваемые гарантии товарной пригодности или соответствия отдельной задаче. Эта статья предполагает, что пользователь знаком с представленным языком программирования и средствами, используемыми для создания и отладки процедур. Инженеры службы поддержки Майкрософт могут объяснить функциональность отдельной процедуры. обязаны изменять примеры для реализации дополнительных возможностей или удовлетворения требований конкретных пользователей.

Образец данных

Чтобы использовать макрос в этой статье, введите следующие примеры данных на листе:

A1: a B1: 1
A2: b B2: 2
A3: x B3: 3
A4: x B4: 4
A5: c B5: 5
A6: x B6: 6
A7: d B7: 7
A8: x B8: 8
A9: x B9: 9
A10: e B10: 10

Пример макроса

В новом модуле макроса введите следующий макрос.

Sub DeleteCells()

     'Loop through cells A1:A10 and delete cells that contain an "x."
     For Each c in Range("A1:A10")
        If c = "x" Then c.EntireRow.Delete
    Next

End Sub

Поведение примера макроса в Excel 2002 и более поздних версиях Excel

При запуске макроса DeleteCells в Excel 2002 и более поздних версиях Excel удаляются только строки 3, 6 и 8. Хотя строки 4 и 9 содержат "x" в столбце A, макрос не удаляет строки. Результаты макроса следующие:

A1: a B1: 1
A2: b B2: 2
A3: x B3: 4
A4: c B4: 5
A5: d B5: 7
A6: x B6: 9
A7: e B7: 10

Когда Microsoft Excel удаляет строку 3, все ячейки перемещаются вверх по одной строке. Например, ячейка A3 предполагает содержимое ячейки A4, ячейка A4 — содержимое ячейки A5 и т. д. После для каждого... Следующий цикл вычисляет ячейку, он вычисляет следующую ячейку; Поэтому при смещении ячеек цикл может пропустить их.

Поведение примера макроса в Microsoft Excel 5.0 и Microsoft Excel 7.0

При запуске макроса DeleteCells в Excel 5.0 и Excel 7.0 макрос удаляет все строки, содержащие "x". Результаты макроса следующие:

A1: a B1: 1
A2: b B2: 2
A3: c B3: 5
A4: d B4: 7
A5: e B5: 10

При удалении строки 3 все ячейки перемещаются вверх по одной строке. Затем ячейка A3 предполагает содержимое ячейки A4, ячейка A4 — содержимое ячейки A5 и т. д.

Однако, в отличие от поведения цикла в Excel 2002 и более поздних версиях Excel, при "Для каждого... Цикл Next" вычисляет ячейку в Excel 5.0, а в Excel 7.0 цикл повторно вычисляет ячейку, если она удалена в цикле. Поэтому ячейки не пропускаются.

Используйте следующий макрос, если вы хотите использовать цикл для удаления ячеек:

Sub DeleteCells2()

     Dim rng As Range
     Dim i As Integer, counter As Integer
    
     'Set the range to evaluate to rng.
     Set rng = Range("A1:A10")
    
     'initialize i to 1
     i = 1
    
     'Loop for a count of 1 to the number of rows
     'in the range that you want to evaluate.
     For counter = 1 To rng.Rows.Count
    
          'If cell i in the range contains an "x",
           'delete the row.
           'Else increment i
            If rng.Cells(i) = "x" Then
                rng.Cells(i).EntireRow.Delete
            Else
                i = i + 1
            End If
    
     Next

End Sub

Результаты этого макроса во всех версиях Excel следующие:

A1: a B1: 1
A2: b B2: 2
A3: c B3: 5
A4: d B4: 7
A5: e B5: 10

Дополнительный метод для удаления ячеек с помощью цикла

Это альтернативный метод метода, показанного выше. Этот метод дает те же результаты.

 Sub DeleteCells3()

     Dim rng As Range, i As Integer

     'Set the range to evaluate to rng.
     Set rng = Range("A1:A10")

     'Loop backwards through the rows
     'in the range that you want to evaluate.
     For i = rng.Rows.Count To 1 Step -1
    
             'If cell i in the range contains an "x", delete the entire row.
             If rng.Cells(i).Value = "x" Then rng.Cells(i).EntireRow.Delete
     Next

End Sub