Программное удаление ячеек в VBA Excel со сдвигом влево или со сдвигом вверх методом Delete объекта Range. Константы XlDeleteShiftDirection.
Range.Delete – это метод, удаляющий объект Range (диапазон ячеек, одну ячейку) со сдвигом замещающих ячеек справа-налево или снизу-вверх для замены удаленных ячеек.
Синтаксис
Expression.Delete (Shift) |
Expression – выражение (переменная), возвращающее объект Range.
Параметры
Параметр | Описание |
---|---|
Shift | Константа из коллекции XlDeleteShiftDirection, определяющая способ сдвига замещающих ячеек для замены удаленных ячеек. |
Если параметр Shift опущен, Microsoft Excel самостоятельно выберет способ сдвига замещающих ячеек в зависимости от формы диапазона.
Константы XlDeleteShiftDirection:
Константа | Значение | Описание |
---|---|---|
xlShiftToLeft | -4159 | Замещающие ячейки сдвигаются справа-налево. |
xlShiftUp | -4162 | Замещающие ячейки сдвигаются снизу-вверх. |
Примеры
Удаление ячейки со сдвигом влево:
ActiveCell.Delete xlShiftToLeft Range(«D4»).Delete xlShiftToLeft Cells(6, 8).Delete xlShiftToLeft |
Удаление диапазона со сдвигом вверх:
Selection.Delete xlShiftUp Range(«E3:H9»).Delete xlShiftUp |
Добрый день.
Подскажите пожалуйста, задача следующая:
Необходимо пройтись по всем рядам таблицы.
Если в колонке А стоит «-» и в колонке В стоит «-«, то данную строку необходимо удалить.
Можно ли реализовать данную задачу через макросы?
Спасибо.
7 ответов
37K
06 марта 2013 года
freets
97 / / 15.10.2010
Конечно можно. Ставишь на запись макрос, выполняешь какие нужно действия(удаление строки), останавливаешь запись. Открываешь Макросы->Изменить и смотришь какой код получился.
Будет примерно так:
Код:
Rows(«1:1»).Select //выделяем первую строку
Selection.Delete Shift:=xlUp //удаляем со сдвигом вверх
только добавь нужное условие и всё.
88K
06 марта 2013 года
Vanderlog
4 / / 06.03.2013
А как правильно организовать перебор всех элементов, и, собственно, если не трудно то условие скажите как задать?
37K
06 марта 2013 года
freets
97 / / 15.10.2010
Код:
Sub Macros()
Dim rw As Long
For rw = 1 To 100
If Cells(rw, «A»).Value = «-« And Cells(rw, «B»).Value = «-« Then
Rows(rw & «:» & rw).Delete Shift:=xlUp
End If
Next rw
End Sub
88K
06 марта 2013 года
Vanderlog
4 / / 06.03.2013
Работает, но почему-то за один проход не справляется. Причем строк меньше 100. 10 строк удаляет за 4 прохода. Что может останавливать скрипт?
275
06 марта 2013 года
pashulka
985 / / 19.09.2004
Вообще-то, при удалении строки необходимо уменьшать счётчик, ибо в противном случае могут остаться строки, содержащие «-» (разумеется, если «-» содержатся в смежных ячейках) или начать удаление снизу вверх, т.е.
Код:
Private Sub Test()
Application.ScreenUpdating = False
Dim rw&
For rw = 100 To 1 Step -1
If Cells(rw, 1) = «-» And Cells(rw, 2) = «-» Then Rows(rw).Delete
Next
Application.ScreenUpdating = True
End Sub
88K
06 марта 2013 года
Vanderlog
4 / / 06.03.2013
Все верно, при переборе снизу вверх работает корректно. Спасибо всем!
275
22 марта 2013 года
pashulka
985 / / 19.09.2004
Чуть не забыл если в дальнейшем потребуется проверять наличие «-» в большем количестве столбцов, чем сейчас, то вместо увеличения And или дополнительного цикла по столбцам, можно программно воспользоваться стандартной функцией рабочего листа =СЧЁТЕСЛИ() (см. листинг)
Код:
Private Sub Test2()
Dim rw&, ws As Worksheet
Set ws = ActiveSheet
With Application
.ScreenUpdating = False
For rw = 100 To 1 Step -1
If .CountIf(ws.Cells(rw, «A»).Resize(, 2), «-«) = 2 Then ws.Rows(rw).Delete
Next
.ScreenUpdating = True
End With
End Sub
P.S. Разумеется номер последней заполненной строки мы можем определять программно.
I have a situation just like this image here:
How do I delete only the cells denoted as red and shift the below cells up?
There is a table below and that should not get affected. Can some one help?
Thanks
Jeevan
Jim Simson
2,7663 gold badges21 silver badges30 bronze badges
asked Jun 30, 2016 at 3:51
3
Delete the cells in the sheet and the table will be adjusted:
Range("B12:C12").Delete Shift:=xlUp
answered Jul 1, 2016 at 13:39
1
The answer can be found by recording a macro to delete a table row.
This example is from a for loop but can be modified to work however.
Select a cell in the table row you want to delete
Remember the table row is not the same as the worksheet row. in this case i have a blank row above my table and the header row so -2
Cells(i, 4).Select
Selection.ListObject.ListRows(i - 2).Delete
answered Feb 24, 2019 at 17:52
You could use
ListObject("TableName").ListRows(RowIndex).Delete
And add an empty row to the bottom.
ListObject("TableName").ListRows.Add
answered Jun 30, 2016 at 4:09
Mátray MárkMátray Márk
4555 silver badges17 bronze badges
2
- Maitris
- Постоялец
- Сообщения: 656
- Зарегистрирован: 02.03.2005 (Ср) 21:00
- Откуда: Из другой цивилизации.
-
- ICQ
Excel: Удаление строчки целиком со смещением номеров
Мне нужно удалить строку, например 152, и чтобы 152 строкой стала следующая строка.
Как это осуществить?
—-
- alibek
- Большой Человек
- Сообщения: 14205
- Зарегистрирован: 19.04.2002 (Пт) 11:40
- Откуда: Russia
alibek » 06.12.2006 (Ср) 8:11
Строки всегда удаляются со смещением номеров.
Lasciate ogni speranza, voi ch’entrate.
- bi-lya
- Обычный пользователь
- Сообщения: 87
- Зарегистрирован: 07.08.2006 (Пн) 15:36
bi-lya » 06.12.2006 (Ср) 8:25
- Код: Выделить всё
Rows("152:152").Select
Selection.Delete Shift:=xlUp
Это что, прикол? Простейший макрос отвечает…
- Pavel55
- Обычный пользователь
- Сообщения: 90
- Зарегистрирован: 27.10.2006 (Пт) 20:11
Pavel55 » 06.12.2006 (Ср) 10:43
позволю себе немного изменить вышеуказанный код на
- Код: Выделить всё
Rows(152).EntireRow.Delete shift:=xlUp
но этого ли хотел автор темы, вроде в Excel автоматически перестраиваются все ссылки и номера столбцов и рядов
- Nicky
- Постоялец
- Сообщения: 519
- Зарегистрирован: 12.08.2004 (Чт) 12:14
Nicky » 06.12.2006 (Ср) 19:15
позволю себе немного изменить вышеуказанный код на
- Код: Выделить всё
Rows(152).Delete
- Pavel55
- Обычный пользователь
- Сообщения: 90
- Зарегистрирован: 27.10.2006 (Пт) 20:11
Pavel55 » 07.12.2006 (Чт) 14:20
Nicky рулит ))
P.S. Cells.Delete — ещё лучше)
- Nicky
- Постоялец
- Сообщения: 519
- Зарегистрирован: 12.08.2004 (Чт) 12:14
Nicky » 07.12.2006 (Чт) 15:15
Справка Microsoft Visual Basic писал(а):expression.Delete(Shift)
expression Required. An expression that returns an object in the Applies To list.
Shift Optional Variant. Used only with Range objects. Specifies how to shift cells to replace deleted cells. Can be one of the following XlDeleteShiftDirection constants: xlShiftToLeft or xlShiftUp. If this argument is omitted, Microsoft Excel decides based on the shape of the range.
Вернуться в VBA
Кто сейчас на конференции
Сейчас этот форум просматривают: PetalBot и гости: 3
Добрый день!
Никак не могу обойти ошибку 1004. Возникает при выполнении
If priznak = 0 Then Sheets(lis).Range(Cells(j, 1), Cells(j, 9)).Delete Shift:=xlShiftUp — почему то не нравится указанный Range!…
где lis строковая переменная, которая определена и равна имени существующего листа, j — вполне конкретный счётчик, priznak таки равен 0… Хоть плачь!
М.б. у кого-то хватит духу запустить макрос sinxron из прилагаемого файла? Ежели, к примеру, указанную инструкцию заменить на
If priznak = 0 Then Sheets(lis).Rows(j).Delete, то всё работает! Но мне не строку надо удалить, а указанный диапазон со смещением вверх
P.S. Макрос сравнивает записи с листа «isx» с записями по соответствующим 10 блокам (листы bl1….bl10). Если на листе «isx» они присутствуют, а на соответствующем блоке нет, то на блоковый лист запись добавляется. И наоборот, если в блоковых списках запись присутствует, а на главном листе таковой нет, то с листа блокового запись удаляется