Удаление ячеек с помощью элемента "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
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по