Vba excel удалить ячейки со сдвигом вверх

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


 

kashtigo333

Пользователь

Сообщений: 16
Регистрация: 29.09.2018

#1

18.11.2018 17:11:38

Всем привет! В приведенном файле сравниваем столбец B со столбцом D, в итоге получаем столбец F. При запуске цикла удаляем из столбца F значения ячеек, в которых больше 8 символов. Не работает сортировка, вылетает «Object required». Кто может объяснить, что не так сделано?

Текст макроса:

Код
Sub подсчет_ячеек()
'
' Макрос1 Макрос
'
'
Dim a, b, s As Range, dlina, h As Integer, i As Integer, j As Integer
............
' после прогона h = 6
For i = h To 1 Step -1                       'удаляем ячейки, в которых больше 8 символов
 If Not IsEmpty(Len(s(i, 1))) And Len(s(i, 1)) > 8 Then
 s(i, 1).Delete shift:=xlUp
 End If
Next i 

If dlina > 1 Then
    Range(s(1, 1), s(dlina, 1)).Sort Key1:=s(1, 1), Order1:=xlAscending 
    With Range(s(1, 1), s(h, 1))
     .Font.Size = 14
     .Font.Name = "Times New Roman"
    End With
    Else
    s(1, 1).Font.Size = 14
    s(1, 1).Font.Name = "Times New Roman"
End If

End Sub

Прикрепленные файлы

  • Лист Microsoft Excel (3).xlsx (8.09 КБ)

Изменено: kashtigo33318.11.2018 17:47:25

 

БМВ

Модератор

Сообщений: 21378
Регистрация: 28.12.2016

Excel 2013, 2016

1 — s(i, 1)  вы что под этим подразумевали ?

2 — на будущее, если что-то удаляется, то перебор надо осуществлять от последнего к первому.

Изменено: БМВ18.11.2018 19:11:43

По вопросам из тем форума, личку не читаю.

 

kashtigo333

Пользователь

Сообщений: 16
Регистрация: 29.09.2018

#3

18.11.2018 19:10:02

Цитата
БМВ написал: s(i, 1)  вы что под этим подразумевали ?
Код
Set s = Application.InputBox("Диапазон ячеек:", Type:=8)
Цитата
БМВ написал: если что-то удаляется, то перебор надо осуществлять от последнего к первому.

вроде перебор идет от последнего к первому, там же стоит step -1

 

БМВ

Модератор

Сообщений: 21378
Регистрация: 28.12.2016

Excel 2013, 2016

а есть ли более полный файл, с полным кодом, а не с отрывком. Отрывок работает нормально.

По вопросам из тем форума, личку не читаю.

 

kashtigo333

Пользователь

Сообщений: 16
Регистрация: 29.09.2018

#5

18.11.2018 19:26:05

Код
Sub подсчет_ячеек()
'
'
'
Dim a, b, s As Range, dlina As Integer, h As Integer, i As Integer, j As Integer
a = Application.InputBox("Введите диапазон 1:", Type:=64)
b = Application.InputBox("Введите диапазон 2:", Type:=64)
Set s = Application.InputBox("Введите адрес расположения первой ячейки диапазона:", Type:=8)
h = 1
dlina = 0
For i = LBound(a) To UBound(a)      
    For j = LBound(b) To UBound(b)  
        If a(i, 1) = b(j, 1) Then   
            j = UBound(b)
            Else                    
            If j = UBound(b) Then   
               s(h, 1) = a(i, 1)
               h = h + 1
               End If
        End If
    Next j
Next i
Range(s(1, 1), s(h, 1)).RemoveDuplicates Columns:=Array(1) 

For i = h To 1 step -1                     
 If Not IsEmpty(Len(s(i, 1))) And Len(s(i, 1)) > 8 Then
 s(i, 1).Delete
 dlina = dlina + 1
 End If
Next i

If dlina > 1 Then
    Range(s(1, 1), s(dlina, 1)).Sort Key1:=s(1, 1), Order1:=xlAscending 
    With Range(s(1, 1), s(h, 1))         
     .Font.Size = 14
     .Font.Name = "Times New Roman"
    End With
    Else
    s(1, 1).Font.Size = 14
    s(1, 1).Font.Name = "Times New Roman"
End If

End Sub

Изменено: kashtigo33318.11.2018 19:30:16

 

JayBhagavan

Пользователь

Сообщений: 11833
Регистрация: 17.01.2014

ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64

#6

18.11.2018 19:29:10

Цитата
kashtigo333 написал: For i = 1 To h

Подсказка…

<#0>
Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori

 

извиняюсь, код после правки был. до этого стояло от i=h до 1 c шагом -1, но ничего не поменялось

 

БМВ

Модератор

Сообщений: 21378
Регистрация: 28.12.2016

Excel 2013, 2016

ну у меня снова ошибок нет.

По вопросам из тем форума, личку не читаю.

 

JayBhagavan

Пользователь

Сообщений: 11833
Регистрация: 17.01.2014

ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64

#9

18.11.2018 19:40:31

Замените в этом коде:

Код
a = Application.InputBox("Введите диапазон 1:", Type:=64)
b = Application.InputBox("Введите диапазон 2:", Type:=64)
Set s = Application.InputBox("Введите адрес расположения первой ячейки диапазона:", Type:=8)

Application.InputBox на конкретные диапазоны, т.к. мне не понятно, что именно надо выделять.

<#0>
Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori

 

kashtigo333

Пользователь

Сообщений: 16
Регистрация: 29.09.2018

#10

18.11.2018 19:40:43

Цитата
БМВ написал:
ну у меня снова ошибок нет.

у меня вот тут выскакивает ошибка 424 «Object required»

Код
Range(s(1, 1), s(dlina, 1)).Sort Key1:=s(1, 1), Order1:=xlAscending
 

kashtigo333

Пользователь

Сообщений: 16
Регистрация: 29.09.2018

#11

18.11.2018 19:43:21

Цитата
JayBhagavan написал:… мне не понятно, что именно надо выделять.

диапазон 1: B1:B6
диапазон 2: D1:D3
ячейка: H1

 

По итогу ответ должен быть такой:
2345
MMM
YYY

 

JayBhagavan

Пользователь

Сообщений: 11833
Регистрация: 17.01.2014

ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64

#13

18.11.2018 19:47:39

Код
Range(s(1, 1), s(dlina, 1)).Sort Key1:=s(1, 1), Order1:=xlAscending

Объясните, что за диапазон Вы хотите отсортировать?

<#0>
Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori

 

после удаления ячеек из диапазона s, где в значении больше 8 символов, получается новый диапазон. вот его хочу отсортировать

После прогона цикла For i = h To 1 step -1 , когда i=1 почему-то удаляется диапазон, насколько я понял. Получается диапазон s пустой, хотя в книге excel значения отображаются. До i=1 все работает и значения при удалении помещаются в следующую верхнюю ячейку

 

БМВ

Модератор

Сообщений: 21378
Регистрация: 28.12.2016

Excel 2013, 2016

что есть s? это , как вы просите первая ячейка диапазона, и если он удаляется, то всё, объекта нет.

По вопросам из тем форума, личку не читаю.

 

согласен, но ведь происходит перемещение в ячейку до того, как i станет равно 1

 

JayBhagavan

Пользователь

Сообщений: 11833
Регистрация: 17.01.2014

ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64

#17

18.11.2018 20:01:28

Проверяйте

<#0>
Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori

 

kashtigo333

Пользователь

Сообщений: 16
Регистрация: 29.09.2018

#18

18.11.2018 20:32:00

Спасибо, работает! гениально!

Помогаю со студенческими работами здесь

Как программно объединить ячейки в Excel ?
Подскажите, как программно объединить ячейки в Excel. Есть сетка (flex) с объедененными ячейками,…

Как программно определить фон определенной ячейки Excel?
Как программно определить фон определенной ячейки Excel. Заранее спасибо.

Как программно изменить цвет ячейки и ширину столбцов в Excel
Здравствуйте, как можно программно изменить цвет ячейки в Excel? Я использую следующий код:…

Как программно записать цифры даты в отдельные ячейки Excel
Всем доброго времени суток !

Для записи даты в таблицу Excel используется код:

Работа с Excel: удалить строку со сдвигом вверх
подскажите, как удалить line целиком со сдвигом вверх…перепробовал разные варианты, почему-то…

Как программно удалить строки из листа Excel?
В общем то в теме поместился весь вопрос нужно программно C# удалить несколько строк из листов по…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

Skip to content

Effortlessly Manage Your Projects and Resources
120+ Professional Project Management Templates!

A Powerful & Multi-purpose Templates for project management. Now seamlessly manage your projects, tasks, meetings, presentations, teams, customers, stakeholders and time. This page describes all the amazing new features and options that come with our premium templates.

Save Up to 85% LIMITED TIME OFFER
Excel VBA Project Management Templates
All-in-One Pack
120+ Project Management Templates
Essential Pack
50+ Project Management Templates

Excel Pack
50+ Excel PM Templates

PowerPoint Pack
50+ Excel PM Templates

MS Word Pack
25+ Word PM Templates

Ultimate Project Management Template

Ultimate Resource Management Template

Project Portfolio Management Templates
  • VBA to Delete Range in Excel – Syntax
  • VBA to Delete Range in Excel – Example:Shift:=xlToLeft
  • VBA to Delete Range in Excel – Example:Shift:=xlToUp
  • VBA to Delete Range in Excel – Example: EntireRow
  • VBA to Delete Range in Excel – Example: EntireColumn
    • VBA to Delete Range in Excel – Execution Instructions

Page load link

Go to Top

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

Удаление пустых ячеек

edise

Дата: Среда, 04.12.2013, 17:30 |
Сообщение № 1

Группа: Пользователи

Ранг: Прохожий

Сообщений: 9


Репутация:

0

±

Замечаний:
0% ±


Добрый день!
Требуется помощь, есть таблица с разбросанными по ячейкам значениями, нужно удалить пустые ячейки со сдвигом вверх так чтобы значения в столбцах вставали друг напротив друга.
Заранее спасибо

К сообщению приложен файл:

9400840.xls
(26.0 Kb)

 

Ответить

_Boroda_

Дата: Среда, 04.12.2013, 17:43 |
Сообщение № 2

Группа: Модераторы

Ранг: Местный житель

Сообщений: 16618


Репутация:

6465

±

Замечаний:
0% ±


2003; 2007; 2010; 2013 RUS

Если несвязанных диапазонов не очень-очень много, то встаете в левую верхнюю ячейку (в нашем случае — А2) и запускаете
[vba]

Код

Sub tt()
On Error Resume Next
     Range(Selection, Selection.SpecialCells(xlLastCell)).SpecialCells(xlCellTypeBlanks).Delete Shift:=xlUp
On Error GoTo 0
End Sub

[/vba]


Скажи мне, кудесник, любимец ба’гов…
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

 

Ответить

edise

Дата: Среда, 04.12.2013, 20:28 |
Сообщение № 3

Группа: Пользователи

Ранг: Прохожий

Сообщений: 9


Репутация:

0

±

Замечаний:
0% ±


_Boroda_, увы на нужных мне количествах не работает….
я сперва одним макросом собираю несколько отчетов в один лист, а потом из получившегося листа вытаскиваю нужную мне инфу и она получается разбегается по разным ячейкам, и в итоге мне эту разбежавшуюся информацию нужно собрать в человеческую таблицу…
проблема в том что мне нужно удалить пустые ячейки, а они не пустые в них есть формулы….
я сейчас скину образец того что мне нужно может тогда с формулами поможете.
в идеале нужно чтобы формула выполняля действие в своей ячейке, а когда его выполнила, то переходила ниже на 1 и продолжала тогда бы у меня изначально все было бы друг за дружкой…

 

Ответить

edise

Дата: Среда, 04.12.2013, 20:45 |
Сообщение № 4

Группа: Пользователи

Ранг: Прохожий

Сообщений: 9


Репутация:

0

±

Замечаний:
0% ±


Вот образец, я большую часть удалил (иначе по размеру не проходит), но надеюсь понятно

К сообщению приложен файл:

_2.xls
(88.0 Kb)

 

Ответить

Alex_ST

Дата: Среда, 04.12.2013, 21:27 |
Сообщение № 5

Группа: Друзья

Ранг: Участник клуба

Сообщений: 3176


Репутация:

604

±

Замечаний:
0% ±


2003

Выделяете нужный диапазон ячеек —> F5 —> Выделить… —> Пустые ячейки —> ОК
Удалить ячейки со сдвигом вверх



С уважением,
Алексей
MS Excel 2003 — the best!!!

 

Ответить

edise

Дата: Среда, 04.12.2013, 21:30 |
Сообщение № 6

Группа: Пользователи

Ранг: Прохожий

Сообщений: 9


Репутация:

0

±

Замечаний:
0% ±


вот в том и косяк… ячейки не пустые, в них формулы и этот способ не работает…
то есть мне нужно удалить ячейки без значений, а вот как это сделать я не знаю…

 

Ответить

RAN

Дата: Среда, 04.12.2013, 22:06 |
Сообщение № 7

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

Не пустые, а формулы — текст.
Правда часть чисел в D как текст воспринимаются, но это, думаю, поправимо.


Быть или не быть, вот в чем загвоздка!

Сообщение отредактировал RANСреда, 04.12.2013, 22:07

 

Ответить

Like this post? Please share to your friends:
  • Vba excel удалить фильтр
  • Vba excel удалить файл без подтверждения
  • Vba excel удалить условное форматирование
  • Vba excel удалить текст до символа
  • Vba excel удалить строку содержащую