Программное удаление ячеек в 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 |
Содержание
- VBA Excel. Range.Clear и другие методы очистки ячеек
- Методы очистки ячеек
- Примеры использования
- 6 комментариев для “VBA Excel. Range.Clear и другие методы очистки ячеек”
- Удаление пустых ячеек из диапазона
- Постановка задачи
- Способ 1. Грубо и быстро
- Способ 2. Формула массива
- Способ 3. Пользовательская функция на VBA
- Удалите ячейки с помощью параметра «For Each. Цикл «Далее» в Excel
- Аннотация
- Дополнительная информация
- Образец данных
- Пример макроса
- Поведение примера макроса в Excel 2002 и более поздних версиях Excel
- Поведение примера макроса в Microsoft Excel 5.0 и Microsoft Excel 7.0
- Рекомендуемый метод для удаления ячеек с помощью цикла
- Дополнительный метод для удаления ячеек с помощью цикла
- Как удалить ячейки в Excel по условию?
- Удаление стандартными средствами Excel
- Удаление с помощью макроса (надстройки)
- Как удалить строки по условию?
VBA Excel. Range.Clear и другие методы очистки ячеек
Метод Range.Clear для полной очистки диапазона ячеек из кода VBA Excel. Методы очистки отдельных свойств и их групп в ячейках. Примеры использования.
Методы очистки ячеек
Метод | Очищаемые свойства | Примечание |
---|---|---|
Range.Clear | Почти все свойства | Ширина и высота ячеек не изменяются |
Range.ClearComments | Комментарии | Для Excel в составе Office 365 |
Range.ClearContents | Формулы и значения | Исходное форматирование сохраняется |
Range.ClearFormats | Свойства, задающие форматы | В том числе отмена объединения ячеек |
Range.ClearHyperlinks | Гиперссылки | Текст и форматирование сохраняются |
Range.ClearNotes | Примечания и заметки | Примечания – для локальных программ Excel, заметки – для Excel в составе Office 365 |
Range.ClearOutline | Структура данных | Смотрите, что такое структурирование данных |
Range – выражение, возвращающее диапазон ячеек.
Примеры использования
1. Удаление гиперссылки из ячейки A1
Cells(1, 1).ClearHyperlinks
2. Очистка диапазона A1:L50 от формул и значений
Range(«A1:L50»).ClearContents
3. Очистка всех свойств ячеек в столбцах A:K
Columns(«A:K»).Clear
4. Очистка форматирования ячеек в строках 1:20
Rows(«1:20»).ClearFormats
Методы очистки диапазонов ячеек в VBA Excel возвращают очищаемые свойства ячеек к значениям по умолчанию. К таким, как на вновь созданном стандартном рабочем листе. При любых методах очистки высота строк и ширина столбцов не изменяются.
Фразы для контекстного поиска: очистка ячеек, очистка ячейки, очистка формул, очистка от формул, удаление формул, очистка значений, удаление значений, очистка форматов, удаление форматирования, удаление форматов.
6 комментариев для “VBA Excel. Range.Clear и другие методы очистки ячеек”
Здравствуйте!
Есть такая проблема:
1. В отдельном модуле написана процедура, которая при запуске и вводе в inputbox данных генерирует таблицу с данными. Вот перед каждой генерацией сделал так, чтобы содержимое листа , кроме первой строки (шапки), очищалось: Thisbooks.Worksheets(«Лист3»).Range(«A2»,Cells(lastRow, lastColumn).clear
2. На первом листе у меня как бы меню управления. Там кнопка, к которой привязана эта процедура. При запуске выполнение процедуры доходит до строки с очисткой и уходит в ошибку 1004 run time error: Application-defined or object-defined error.
При этом, если эту же процедуру запускать с кнопки, или через F5, но с открытого Лист3 — все отлично выполняется!
Никак не могу додуматься в чем же проблема. Подскажите пожалуйста!
Источник
Удаление пустых ячеек из диапазона
Постановка задачи
Имеем диапазон ячеек с данными, в котором есть пустые ячейки:
Задача — удалить пустые ячейки, оставив только ячейки с информацией.
Способ 1. Грубо и быстро
- Выделяем исходный диапазон
- Жмем клавишу F5, далее кнопка Выделить(Special) . В открывшмся окне выбираем Пустые ячейки(Blanks) и жмем ОК.
Выделяются все пустые ячейки в диапазоне.
Способ 2. Формула массива
Для упрощения дадим нашим рабочим диапазонам имена, используя Диспетчер Имен (Name Manager) на вкладке Формулы (Formulas) или — в Excel 2003 и старше — меню Вставка — Имя — Присвоить (Insert — Name — Define)
Диапазону B3:B10 даем имя ЕстьПустые, диапазону D3:D10 — НетПустых. Диапазоны должны быть строго одного размера, а расположены могут быть где угодно относительно друг друга.
Теперь выделим первую ячейку второго диапазона (D3) и введем в нее такую страшноватую формулу:
В английской версии это будет:
=IF(ROW()-ROW(НетПустых)+1>ROWS(ЕстьПустые)-COUNTBLANK(ЕстьПустые),»»,INDIRECT(ADDRESS(SMALL((IF(ЕстьПустые<>«»,ROW(ЕстьПустые),ROW()+ROWS(ЕстьПустые))),ROW()-ROW(НетПустых)+1),COLUMN(ЕстьПустые),4)))
Причем ввести ее надо как формулу массива, т.е. после вставки нажать не Enter (как обычно), а Ctrl+Shift+Enter. Теперь формулу можно скопировать вниз, используя автозаполнение (потянуть за черный крестик в правом нижнем углу ячейки) — и мы получим исходный диапазон, но без пустых ячеек:
Способ 3. Пользовательская функция на VBA
Если есть подозрение, что вам часто придется повторять процедуру удаления пустых ячеек из диапазонов, то лучше один раз добавить в стандартный набор свою функцию для удаления пустых ячеек, и пользоваться ей во всех последующих случаях.
Для этого откройте редактор Visual Basic (ALT+F11), вставьте новый пустой модуль (меню Insert — Module) и скопируйте туда текст этой функции:
Не забудьте сохранить файл и вернитесь из редактора Visual Basic в Excel. Чтобы использовать эту функцию в нашем примере:
- Выделите достаточный диапазон пустых ячеек, например F3:F10.
- Идем в меню Вставка — Функция (Insert — Function) или жмем на кнопку Вставить функцию(Insert Function) на вкладке Формулы (Formulas) в новых версиях Excel. В категории Определенные пользователем (User Defined) выберите нашу функцию NoBlanks.
- В качестве аргумента функции укажите исходный диапазон с пустотами (B3:B10) и нажмите Ctrl+Shift+Enter, чтобы ввести функцию как формулу массива.
Источник
Удалите ячейки с помощью параметра «For Each. Цикл «Далее» в Excel
Аннотация
Microsoft Excel 2002 и более поздних версий Excel удаляет ячейки в поле «Для каждого. Далее» цикл отличается от Microsoft Excel 97 и более ранних версий Excel.
В этой статье описываются различия, а также Visual Basic для приложений пример макроса, иллюстрирующий удаление ячеек в цикле.
Дополнительная информация
Корпорация Майкрософт предоставляет примеры программирования только в целях демонстрации без явной или подразумеваемой гарантии. Данное положение включает, но не ограничивается этим, подразумеваемые гарантии товарной пригодности или соответствия отдельной задаче. Эта статья предполагает, что пользователь знаком с представленным языком программирования и средствами, используемыми для создания и отладки процедур. Инженеры службы поддержки Майкрософт могут объяснить функциональность отдельной процедуры. обязаны изменять примеры для реализации дополнительных возможностей или удовлетворения требований конкретных пользователей.
Образец данных
Чтобы использовать макрос в этой статье, введите следующие примеры данных на листе:
Пример макроса
В новом модуле макросов введите следующий макрос.
Поведение примера макроса в Excel 2002 и более поздних версиях Excel
При запуске макроса DeleteCells в Excel 2002 и более поздних версиях Excel удаляются только строки 3, 6 и 8. Хотя строки 4 и 9 содержат «x» в столбце A, макрос не удаляет строки. Результат макроса выглядит следующим образом:
Когда Microsoft Excel удаляет строку 3, все ячейки перемещаются вверх на одну строку. Например, ячейка A3 предполагает содержимое ячейки A4, ячейка A4 предполагает содержимое ячейки A5 и т. д. После параметра For Each. Следующий цикл вычисляет ячейку, он вычисляет следующую ячейку; Таким образом, при сдвиге ячеек они могут быть пропущены циклом.
Поведение примера макроса в Microsoft Excel 5.0 и Microsoft Excel 7.0
При запуске макроса DeleteCells в Excel 5.0 и Excel 7.0 макрос удаляет все строки, содержащие символ «x». Результат макроса выглядит следующим образом:
При удалении строки 3 все ячейки перемещаются вверх на одну строку. Затем ячейка A3 предполагает содержимое ячейки A4, ячейка A4 предполагает содержимое ячейки A5 и т. д.
Однако в отличие от поведения цикла в Excel 2002 и более поздних версиях Excel, когда «For Each. Цикл «Далее» вычисляет ячейку в Excel 5.0, а в Excel 7.0 — повторно вычисляет ячейку, если она удаляется в цикле. Таким образом, ячейки не пропускаются.
Рекомендуемый метод для удаления ячеек с помощью цикла
Используйте следующий макрос, если вы хотите использовать цикл для удаления ячеек:
Результаты этого макроса во всех версиях Excel:
Дополнительный метод для удаления ячеек с помощью цикла
Это альтернативный метод для метода, показанного выше. Этот метод дает те же результаты.
Источник
Как удалить ячейки в Excel по условию?
Часто при работе с табличными данными в Excel возникает необходимость удалить пустые или повторяющиеся ячейки. Встречаются также ситуации, когда необходимо скрыть либо удалить ячейки, с определенными значениями или удовлетворяющие заданным условиям. Ячейки можно удалить разными способами, например вместе со строкой, вместе со столбцом, со сдвигом влево или со сдвигом вниз. Сделать это можно как стандартными средствами Excel, так и программно, при помощи макросов, что гораздо более удобно и эффективно. Рассмотрим различные способы удаления ячеек.
Удаление стандартными средствами Excel
Перед удалением необходимо выделить удаляемую ячейку или группу ячеек, после чего щелкнуть правой кнопкой мыши на выделенной области, что приведет к появлению контекстного меню. В появившемся меню выбираем пункт «Удалить».
Выбор этого пункта меню предусматривает 4 варианта удаления, удаление строк и удаление столбцов, в которых содержатся ячейки, а также удаление непосредственно самих ячеек с выбором направления сдвига. В Excel предусмотрено два направления сдвига – либо вверх либо влево.
После выбора одного из четырех пунктов меню в диалоговом окне остается нажать кнопку «ОК». Окно «Удаление ячеек» можно вызвать также и через вкладку «Главная», в группе «Ячейки», если вызвать меню кнопки «Удалить» и в списке команд выбрать пункт «Удалить ячейки».
Удаление с помощью макроса (надстройки)
При преобразовании таблиц большого размера путем удаления в них, к примеру пустых строк, столбцов или ячеек, либо при удалении строк, столбцов или ячеек, содержащих определенные числовые значения или заданный текст, эффективнее, быстрее и безошибочнее применять программное преобразование, то есть использовать для этой работы макрос (надстройку). Вот наглядный пример того, как таблица, содержащая более четырехсот строк буквально за 2-3 секунды превращается в упорядоченную таблицу, в которой уже не более 100 строк.
С помощью макроса, в используемом диапазоне листа удалены все пустые ячейки со сдвигом вверх. Используемый диапазон — это диапазон между первой и последней заполненными ячейками. Надстройка, при помощи которой производится подобное преобразование таблицы, дает возможность удалять и скрывать не только пустые ячейки, но и ячейки, отвечающие заданным условиям и значениям, например, содержащим определенный текст либо числовые значения, а также эта надстройка позволяет пользователю выбирать диапазон, который необходимо обрабатывать макросу. Так выглядит диалоговое окно представленной надстройки, возможности которой Вы можете оценить сами.
Данная надстройка производит перебор всех ячеек выбранного диапазона слева направо и сверху вниз, при этом каждое значение сравнивается с искомым, выбранным пользователем и при соблюдении одного из двенадцати условий на выбор пользователя производит одно из шести действий. В надстройке предусмотрено удаление и скрытие строк с ячейками, содержащими определенные пользователем значения, удаление и скрытие столбцов с ячейками в зависимости от условий и заданных значений, а также надстройка позволит удалить сами ячейки как со сдвигом влево, так и со сдвигом вверх. Удаляя либо скрывая определенные ячейки, столбцы и строки можно практически любую таблицу привести к более удобному и читаемому виду.
Источник
Как удалить строки по условию?
Предположу, что почти каждый сталкивался с ситуацией, когда необходимо удалить только определенные строки: имеется большая таблица и необходимо удалить из неё только те строки, которые содержат какое-то слово (цифру, фразу). Для выполнения подобной задачи можно воспользоваться несколькими способами.
Способ первый:
Использовать встроенное средство Excel — фильтр. Сначала его необходимо «установить» на листе:
- Выделяем таблицу с данными, включая заголовки. Если их нет — то выделяем с самой первой строки таблицы, в которой необходимо удалить данные
- устанавливаем фильтр:
- для Excel 2003 : Данные—Фильтр—Автофильтр
- для Excel 2007-2010 : вкладка Данные (Data) —Фильтр (Filter)(или вкладка Главная (Home) —Сортировка и фильтр (Sort&Filter) —Фильтр (Filter) )
Теперь выбираем условие для фильтра:
- в Excel 2003 надо выбрать Условие и в появившейся форме выбрать непосредственно условие(«равно», «содержит», «начинается с» и т.д.), а напротив значение в соответствии с условием.
- Для 2007-2010 Excel нужно выбрать Текстовые фильтры (Text Filters) и либо сразу выбрать одно из предлагаемых условий, либо нажать Настраиваемый фильтр (Custom Filter) и ввести значения для отбора в форме
После этого удалить отфильтрованные строки. В 2007 Excel могут возникнуть проблемы с удалением отфильтрованных строк, поэтому рекомендую сначала так же прочитать статью: Excel удаляет вместо отфильтрованных строк — все?! Как избежать.
Способ второй:
применить код VBA, который потребует только указания значения, которое необходимо найти в строке и номер столбца, в котором искать значение.
Sub Del_SubStr() Dim sSubStr As String ‘искомое слово или фраза(может быть указанием на ячейку) Dim lCol As Long ‘номер столбца с просматриваемыми значениями Dim lLastRow As Long, li As Long Dim lMet As Long Dim arr sSubStr = InputBox(«Укажите значение, которое необходимо найти в строке», «www.excel-vba.ru», «») If sSubStr = «» Then lMet = 0 Else lMet = 1 lCol = Val(InputBox(«Укажите номер столбца, в котором искать указанное значение», «www.excel-vba.ru», 1)) If lCol = 0 Then Exit Sub lLastRow = ActiveSheet.UsedRange.Row — 1 + ActiveSheet.UsedRange.Rows.Count arr = Cells(1, lCol).Resize(lLastRow).Value Application.ScreenUpdating = 0 Dim rr As Range For li = 1 To lLastRow ‘цикл с первой строки до конца If -(InStr(arr(li, 1), sSubStr) > 0) = lMet Then If rr Is Nothing Then Set rr = Cells(li, 1) Else Set rr = Union(rr, Cells(li, 1)) End If End If Next li If Not rr Is Nothing Then rr.EntireRow.Delete Application.ScreenUpdating = 1 End Sub
Если значение sSubStr не будет указано, то будут удалены строки, ячейки указанного столбца которых, пустые.
Данный код необходимо поместить в стандартный модуль. Вызвать с листа его можно нажатием клавиш Alt + F8 , после чего выбрать Del_SubStr и нажать Выполнить. Если в данном коде в строке
If -(InStr(Cells(li, 1), sSubStr) > 0) = lMet Then
вместо = lMet указать <> lMet , то удаляться будут строки, не содержащие указанное для поиска значение. Иногда тоже удобно.
Но. Данный код просматривает строки на предмет частичного совпадения указанного значения. Например, если Вы укажете текст для поиска «отчет», то будут удалены все строки, в которых встречается это слово(«квартальный отчет», «отчет за месяц» и т.д.). Это не всегда нужно. Поэтому ниже приведен код, который будет удалять только строки, указанные ячейки которых равны конкретно указанному значению:
Sub Del_SubStr() Dim sSubStr As String ‘искомое слово или фраза(может быть указанием на ячейку) Dim lCol As Long ‘номер столбца с просматриваемыми значениями Dim lLastRow As Long, li As Long Dim arr sSubStr = InputBox(«Укажите значение, которое необходимо найти в строке», «www.excel-vba.ru», «») lCol = Val(InputBox(«Укажите номер столбца, в котором искать указанное значение», «www.excel-vba.ru», 1)) If lCol = 0 Then Exit Sub lLastRow = ActiveSheet.UsedRange.Row — 1 + ActiveSheet.UsedRange.Rows.Count arr = Cells(1, lCol).Resize(lLastRow).Value Application.ScreenUpdating = 0 Dim rr As Range For li = 1 To lLastRow ‘цикл с первой строки до конца If CStr(arr(li, 1)) = sSubStr Then If rr Is Nothing Then Set rr = Cells(li, 1) Else Set rr = Union(rr, Cells(li, 1)) End If End If Next li If Not rr Is Nothing Then rr.EntireRow.Delete Application.ScreenUpdating = 1 End Sub
Здесь так же, как и в случае с предыдущим кодом можно заменить оператор сравнения( Cells(li, lCol) = sSubStr ) с равно на неравенство( Cells(li, lCol) <> sSubStr ) и тогда удаляться будут строки, значения ячеек которых не равно указанному.
УДАЛЕНИЕ СТРОК НА ОСНОВАНИИ СПИСКА ЗНАЧЕНИЙ(МНОЖЕСТВЕННЫЕ КРИТЕРИИ)
Иногда бывают ситуации, когда необходимо удалить строки не по одному значению, а по нескольким. Например, если строка содержит или Итог или Отчет. Ниже приведен код, при помощи которого можно удалить строки, указав в качестве критерия диапазон значений.
Значения, которые необходимо найти и удалить перечисляются на листе с именем «Лист2». Т.е. указав на «Лист2» в столбце А(начиная с первой строки) несколько значений — они все будут удалены. Если лист называется иначе(скажем «Соответствия») в коде необходимо будет «Лист2» заменить на «Соответствия». Удаление строк происходит на активном в момент запуска кода листе. Это значит, что перед запуском кода надо перейти на тот лист, строки в котором необходимо удалить.
Sub Del_Array_SubStr() Dim sSubStr As String ‘искомое слово или фраза Dim lCol As Long ‘номер столбца с просматриваемыми значениями Dim lLastRow As Long, li As Long Dim avArr, lr As Long Dim arr lCol = Val(InputBox(«Укажите номер столбца, в котором искать указанное значение», «www.excel-vba.ru», 1)) If lCol = 0 Then Exit Sub Application.ScreenUpdating = 0 lLastRow = ActiveSheet.UsedRange.Row — 1 + ActiveSheet.UsedRange.Rows.Count ‘заносим в массив значения листа, в котором необходимо удалить строки arr = Cells(1, lCol).Resize(lLastRow).Value ‘Получаем с Лист2 значения, которые надо удалить в активном листе With Sheets(«Лист2») ‘Имя листа с диапазоном значений на удаление avArr = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp)) End With ‘удаляем Dim rr As Range For lr = 1 To UBound(avArr, 1) sSubStr = avArr(lr, 1) For li = 1 To lLastRow ‘цикл с первой строки до конца If CStr(arr(li, 1)) = sSubStr Then If rr Is Nothing Then Set rr = Cells(li, 1) Else Set rr = Union(rr, Cells(li, 1)) End If End If DoEvents Next li DoEvents Next lr If Not rr Is Nothing Then rr.EntireRow.Delete Application.ScreenUpdating = 1 End Sub
Чтобы код выше удалял строки не по точному совпадению слов, а по частичному(например, в ячейке записано «Привет, как дела?», а в списке есть слово «привет» — надо удалить, т.к. есть слово «привет»), то надо строку:
If CStr(arr(li, 1)) = sSubStr Then
заменить на такую:
If InStr(1, arr(li, 1), sSubStr, 1) > 0 Then
‘процедура оставляет в листе только те значения, которые перечислены в списке Sub LeaveOnlyFoundInArray() Dim sSubStr As String ‘искомое слово или фраза Dim lCol As Long ‘номер столбца с просматриваемыми значениями Dim lLastRow As Long, li As Long Dim avArr, lr As Long Dim arr Dim IsFind As Boolean lCol = Val(InputBox(«Укажите номер столбца, в котором искать указанное значение», «www.excel-vba.ru», 1)) If lCol = 0 Then Exit Sub Application.ScreenUpdating = 0 lLastRow = ActiveSheet.UsedRange.Row — 1 + ActiveSheet.UsedRange.Rows.Count ‘заносим в массив значения листа, в котором необходимо удалить строки arr = Cells(1, lCol).Resize(lLastRow).Value ‘Получаем с Лист2 значения, которые надо удалить в активном листе With Sheets(«Лист2») ‘Имя листа с диапазоном значений на удаление avArr = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp)) End With ‘удаляем Dim rr As Range For li = 1 To lLastRow ‘цикл с первой строки таблицы до конца IsFind = False For lr = 1 To UBound(avArr, 1) ‘цикл по списку значений на удаление sSubStr = avArr(lr, 1) If InStr(1, arr(li, 1), sSubStr, 1) > 0 Then IsFind = True End If DoEvents Next lr ‘если значение таблицы не найдено в списке — удаляем строку If Not IsFind Then If rr Is Nothing Then Set rr = Cells(li, 1) Else Set rr = Union(rr, Cells(li, 1)) End If End If DoEvents Next li If Not rr Is Nothing Then rr.EntireRow.Delete Application.ScreenUpdating = 1 End Sub
Чтобы код выше сравнивал значения таблицы со значениями списка по точному совпадению слов, а не по частичному, то надо строку:
If InStr(1, arr(li, 1), sSubStr, 1) > 0 Then
заменить на такую:
If CStr(arr(li, 1)) = sSubStr Then
Для всех приведенных кодов можно строки не удалять, а скрывать. Для этого надо строку:
If Not rr Is Nothing Then rr.EntireRow.Delete
заменить на такую:
If Not rr Is Nothing Then rr.EntireRow.Hidden = True
По умолчанию все коды начинают просмотр строк с первой по последнюю заполненную на листе. И если необходимо удалять строки не с первой или не по последнюю, то надо внести корректировки в эту строку:
For li = 1 To lLastRow ‘цикл с первой строки до конца
1 — это первая строка; lLastRow — определяется автоматически кодом и равна номеру последней заполненной строки на листе. Если надо начать удалять строки только с 7-ой строки(например, в первых 6-ти шапка), то код будет выглядеть так:
For li = 7 To lLastRow ‘цикл с седьмой строки до конца
А если надо удалять только с 3-ей по 300-ю, то код будет выглядеть так:
For li = 3 To 300 ‘цикл с третьей строки до трехсотой
Статья помогла? Поделись ссылкой с друзьями!
Источник
Удаление пустых ячеек из диапазона
Постановка задачи
Имеем диапазон ячеек с данными, в котором есть пустые ячейки:
Задача — удалить пустые ячейки, оставив только ячейки с информацией.
Способ 1. Грубо и быстро
- Выделяем исходный диапазон
- Жмем клавишу F5, далее кнопка Выделить (Special). В открывшмся окне выбираем Пустые ячейки (Blanks) и жмем ОК.
Выделяются все пустые ячейки в диапазоне.
- Даем в меню команду на удаление выделенных ячеек: правой кнопкой мыши — Удалить ячейки (Delete Cells) со сдвигом вверх.
Способ 2. Формула массива
Для упрощения дадим нашим рабочим диапазонам имена, используя Диспетчер Имен (Name Manager) на вкладке Формулы (Formulas) или — в Excel 2003 и старше — меню Вставка — Имя — Присвоить (Insert — Name — Define)
Диапазону B3:B10 даем имя ЕстьПустые, диапазону D3:D10 — НетПустых. Диапазоны должны быть строго одного размера, а расположены могут быть где угодно относительно друг друга.
Теперь выделим первую ячейку второго диапазона (D3) и введем в нее такую страшноватую формулу:
=ЕСЛИ(СТРОКА()-СТРОКА(НетПустых)+1>ЧСТРОК(ЕстьПустые)-СЧИТАТЬПУСТОТЫ(ЕстьПустые);»»;ДВССЫЛ(АДРЕС(НАИМЕНЬШИЙ((ЕСЛИ(ЕстьПустые<>»»;СТРОКА(ЕстьПустые);СТРОКА()+ЧСТРОК(ЕстьПустые)));СТРОКА()-СТРОКА(НетПустых)+1);СТОЛБЕЦ(ЕстьПустые);4)))
В английской версии это будет:
=IF(ROW()-ROW(НетПустых)+1>ROWS(ЕстьПустые)-COUNTBLANK(ЕстьПустые),»»,INDIRECT(ADDRESS(SMALL((IF(ЕстьПустые<>»»,ROW(ЕстьПустые),ROW()+ROWS(ЕстьПустые))),ROW()-ROW(НетПустых)+1),COLUMN(ЕстьПустые),4)))
Причем ввести ее надо как формулу массива, т.е. после вставки нажать не Enter (как обычно), а Ctrl+Shift+Enter. Теперь формулу можно скопировать вниз, используя автозаполнение (потянуть за черный крестик в правом нижнем углу ячейки) — и мы получим исходный диапазон, но без пустых ячеек:
Способ 3. Пользовательская функция на VBA
Если есть подозрение, что вам часто придется повторять процедуру удаления пустых ячеек из диапазонов, то лучше один раз добавить в стандартный набор свою функцию для удаления пустых ячеек, и пользоваться ей во всех последующих случаях.
Для этого откройте редактор Visual Basic (ALT+F11), вставьте новый пустой модуль (меню Insert — Module) и скопируйте туда текст этой функции:
Function NoBlanks(DataRange As Range) As Variant() Dim N As Long Dim N2 As Long Dim Rng As Range Dim MaxCells As Long Dim Result() As Variant Dim R As Long Dim C As Long MaxCells = Application.WorksheetFunction.Max( _ Application.Caller.Cells.Count, DataRange.Cells.Count) ReDim Result(1 To MaxCells, 1 To 1) For Each Rng In DataRange.Cells If Rng.Value <> vbNullString Then N = N + 1 Result(N, 1) = Rng.Value End If Next Rng For N2 = N + 1 To MaxCells Result(N2, 1) = vbNullString Next N2 If Application.Caller.Rows.Count = 1 Then NoBlanks = Application.Transpose(Result) Else NoBlanks = Result End If End Function
Не забудьте сохранить файл и вернитесь из редактора Visual Basic в Excel. Чтобы использовать эту функцию в нашем примере:
- Выделите достаточный диапазон пустых ячеек, например F3:F10.
- Идем в меню Вставка — Функция (Insert — Function) или жмем на кнопку Вставить функцию (Insert Function) на вкладке Формулы (Formulas) в новых версиях Excel. В категории Определенные пользователем (User Defined) выберите нашу функцию NoBlanks.
- В качестве аргумента функции укажите исходный диапазон с пустотами (B3:B10) и нажмите Ctrl+Shift+Enter, чтобы ввести функцию как формулу массива.
Ссылки по теме:
- Удаление сразу всех пустых строк в таблице простым макросом
- Удаление сразу всех пустых строк на листе с помощью надстройки PLEX
- Быстрое заполнение всех пустых ячеек
- Что такое макросы, куда вставлять код макросов на VBA
Часто при работе с табличными данными в Excel возникает необходимость удалить пустые или повторяющиеся ячейки. Встречаются также ситуации, когда необходимо скрыть либо удалить ячейки, с определенными значениями или удовлетворяющие заданным условиям. Ячейки можно удалить разными способами, например вместе со строкой, вместе со столбцом, со сдвигом влево или со сдвигом вниз. Сделать это можно как стандартными средствами Excel, так и программно, при помощи макросов, что гораздо более удобно и эффективно. Рассмотрим различные способы удаления ячеек.
Перед удалением необходимо выделить удаляемую ячейку или группу ячеек, после чего щелкнуть правой кнопкой мыши на выделенной области, что приведет к появлению контекстного меню. В появившемся меню выбираем пункт «Удалить».
Выбор этого пункта меню предусматривает 4 варианта удаления, удаление строк и удаление столбцов, в которых содержатся ячейки, а также удаление непосредственно самих ячеек с выбором направления сдвига. В Excel предусмотрено два направления сдвига – либо вверх либо влево.
После выбора одного из четырех пунктов меню в диалоговом окне остается нажать кнопку «ОК». Окно «Удаление ячеек» можно вызвать также и через вкладку «Главная», в группе «Ячейки», если вызвать меню кнопки «Удалить» и в списке команд выбрать пункт «Удалить ячейки».
Удаление с помощью макроса (надстройки)
При преобразовании таблиц большого размера путем удаления в них, к примеру пустых строк, столбцов или ячеек, либо при удалении строк, столбцов или ячеек, содержащих определенные числовые значения или заданный текст, эффективнее, быстрее и безошибочнее применять программное преобразование, то есть использовать для этой работы макрос (надстройку). Вот наглядный пример того, как таблица, содержащая более четырехсот строк буквально за 2-3 секунды превращается в упорядоченную таблицу, в которой уже не более 100 строк.
С помощью макроса, в используемом диапазоне листа удалены все пустые ячейки со сдвигом вверх. Используемый диапазон — это диапазон между первой и последней заполненными ячейками. Надстройка, при помощи которой производится подобное преобразование таблицы, дает возможность удалять и скрывать не только пустые ячейки, но и ячейки, отвечающие заданным условиям и значениям, например, содержащим определенный текст либо числовые значения, а также эта надстройка позволяет пользователю выбирать диапазон, который необходимо обрабатывать макросу. Так выглядит диалоговое окно представленной надстройки, возможности которой Вы можете оценить сами.
макрос (надстройка) для выборочного удаления ячеек в зависимости от условий и значений
Данная надстройка производит перебор всех ячеек выбранного диапазона слева направо и сверху вниз, при этом каждое значение сравнивается с искомым, выбранным пользователем и при соблюдении одного из двенадцати условий на выбор пользователя производит одно из шести действий. В надстройке предусмотрено удаление и скрытие строк с ячейками, содержащими определенные пользователем значения, удаление и скрытие столбцов с ячейками в зависимости от условий и заданных значений, а также надстройка позволит удалить сами ячейки как со сдвигом влево, так и со сдвигом вверх. Удаляя либо скрывая определенные ячейки, столбцы и строки можно практически любую таблицу привести к более удобному и читаемому виду.
Видео по выборочному удалению ячеек
Другие материалы по теме:
Дениск |
||||
1 |
||||
06.02.2010, 02:04. Показов 13659. Ответов 12 Метки нет (Все метки)
Подскажите пожалуйста, как в Excel с помощью VBA можно удалить область ячеек,
Зарание благодарен. |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
06.02.2010, 02:04 |
12 |
0 / 0 / 0 Регистрация: 31.01.2008 Сообщений: 72 |
|
07.02.2010, 13:29 |
2 |
Удалять можно только строки или столбцы — метод delete Ячейки можно только очистить содержимое, унивесальная конструкция:
0 |
Дениск |
|
07.02.2010, 22:25 |
3 |
Спасибо, Range(Cells(1, 1), Cells(8, 100)).Clear то что было нужно, |
Savelev |
|
08.02.2010, 08:51 |
4 |
Удалять — метод для обьекта Range. Cells, Columns, Rows также являются обьектом Range. Поэтому их тоже можно удалять (Delete), как впрочем и чистить (Clear). Dim L As Long l=10 |
2 / 2 / 1 Регистрация: 01.01.2008 Сообщений: 410 |
|
08.02.2010, 11:46 |
5 |
2 Serg61
0 |
Дениск |
||||
15.02.2010, 22:34 |
6 |
|||
А как сделать, чтобы при открытии Книги очищалась одна и таже область ячеек на нескольких Листах Книги при этом координаты не известны а вычисляются программой К примеру:
Выдаёт ошибку в строках с указанием имён Листов |
0 / 0 / 0 Регистрация: 31.01.2008 Сообщений: 72 |
|
16.02.2010, 13:42 |
7 |
А есть ли эти листы в книге?
0 |
Дениск |
|
16.02.2010, 22:46 |
8 |
Имена листов само собой пишу те которые у меня |
0 / 0 / 0 Регистрация: 31.01.2008 Сообщений: 72 |
|
17.02.2010, 08:47 |
9 |
Посмотри чему равно b, msgbox(b%), случайно не больше 51.
0 |
Дениск |
|
17.02.2010, 23:20 |
10 |
Пробовал запускать с константами выдаёт ту же ошибку |
VMRange 0 / 0 / 0 Регистрация: 24.06.2008 Сообщений: 41 |
||||
18.02.2010, 10:05 |
11 |
|||
IgorT
0 |
2 / 2 / 1 Регистрация: 01.01.2008 Сообщений: 410 |
|
21.02.2010, 09:42 |
12 |
2VMRange
0 |
2 / 2 / 1 Регистрация: 01.01.2008 Сообщений: 410 |
|
21.02.2010, 09:52 |
13 |
2Дениск для неактивного листа должно быть
0 |