Excel vba удалить строку со сдвигом вверх

Программное удаление ячеек в 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:
Screenshot

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's user avatar

Jim Simson

2,7663 gold badges21 silver badges30 bronze badges

asked Jun 30, 2016 at 3:51

Jeevan's user avatar

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

m.swiss's user avatar

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

nero6014's user avatar

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árk's user avatar

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» они присутствуют, а на соответствующем блоке нет, то на блоковый лист запись добавляется. И наоборот, если в блоковых списках запись присутствует, а на главном листе таковой нет, то с листа блокового запись удаляется

Понравилась статья? Поделить с друзьями:
  • Excel vba удалить строку если в ячейке
  • Excel vba удалить строки умной таблицы
  • Excel vba удалить строки диапазона
  • Excel vba удалить символы слева
  • Excel vba удалить символы в строке