Объединение диапазона ячеек в одну или построчно с помощью кода VBA Excel. Метод Range.Merge и свойство MergeCells. Отмена объединения ячеек. Примеры.
Метод Range.Merge
Метод Merge объекта Range объединяет ячейки заданного диапазона в одну или построчно из кода VBA Excel.
Синтаксис метода:
- Expression — выражение, возвращающее объект Range.
- Across — логическое значение, определяющее характер объединения ячеек:
- True — ячейки объединяются построчно: каждая строка заданного диапазона преобразуется в одну ячейку.
- False — весь диапазон преобразуется в одну ячейку. False является значением по умолчанию.
Преимущество метода Range.Merge перед свойством MergeCells заключается в возможности построчного объединения ячеек заданного диапазона без использования цикла.
Свойство MergeCells
Свойство MergeCells объекта Range применяется как для объединения ячеек, так и для его отмены.
Синтаксис свойства с присвоением значения:
Expression.MergeCells = Boolean |
- Expression — выражение, представляющее объект Range.
- Boolean — логическое значение, определяющее необходимость объединения ячеек или его отмены:
- True — объединение ячеек заданного диапазона.
- False — отмена объединения ячеек.
С помощью свойства MergeCells можно из кода VBA Excel проверять диапазон (отдельную ячейку), входит ли он (она) в объединенную ячейку (True) или нет (False). Если проверяемый диапазон окажется комбинированным, то есть содержащим объединенные и необъединенные ячейки, компилятор сгенерирует ошибку.
Переменная Expression для отмены объединения ячеек с помощью свойства Range.MergeCells может представлять одну любую ячейку, входящую в объединенный диапазон.
Метод Range.UnMerge
Метод UnMerge объекта Range разделяет объединенную область на отдельные ячейки из кода VBA Excel.
Синтаксис метода:
Expression — выражение, возвращающее объект Range.
Переменная Expression для отмены объединения ячеек методом UnMerge может представлять одну любую ячейку, входящую в объединенный диапазон.
Примеры объединения ячеек и его отмены
Пример 1
Наблюдаем, как происходит объединение ячеек при разных значениях параметра Across:
Sub Primer1() ‘Объединяем ячейки диапазона «A1:D4» построчно Range(«A1:D4»).Merge (True) ‘Объединяем диапазон «A5:D8» в одну ячейку ‘Across принимает значение False по умолчанию Range(«A5:D8»).Merge End Sub |
Не забываем, что логическое выражение True можно заменить единичкой, а False — нулем.
Пример 2
Отменяем объединение ячеек в диапазонах из первого примера:
Sub Primer2() Range(«A1:D8»).MergeCells = False End Sub |
Пример 3
Предполагается, что перед этим примером отменено объединение ячеек кодом из предыдущего примера.
Sub Primer3() ‘Объединяем ячейки диапазона «A1:D4» Range(«A1:D4»).MergeCells = 1 ‘Проверяем принадлежность диапазона ‘объединенной ячейке* MsgBox Range(«A1:C2»).MergeCells MsgBox Range(«A6:C7»).MergeCells ‘Ячейки диапазона «A5:D8» ‘можно объединить и так Cells(5, 1).Resize(4, 4).Merge End Sub |
*Если проверяемый диапазон окажется комбинированным, VBA Excel сгенерирует ошибку.
Пример 4
Отмена объединения ячеек с помощью метода Range.UnMerge:
Sub Primer4() ‘Объединяем ячейки диапазона «A1:C4» Range(«A1:C4»).Merge MsgBox «Ячейки диапазона ««A1:C4»» объединены» ‘Смотрим адрес диапазона, входящего в объединенную ячейку MsgBox Range(«A2»).MergeArea.Address ‘Отменяем объединение ячеек диапазона «A1:C4» Range(«B3»).UnMerge ‘или: Range(«B3»).MergeArea.UnMerge MsgBox «Объединение ячеек диапазона ««A1:C4»» отменено» End Sub |
Предупреждение перед объединением
Если объединяемые ячейки не являются пустыми, пред их объединением появится предупреждающее диалоговое окно с сообщением: «В объединенной ячейке сохраняется только значение из верхней левой ячейки диапазона. Остальные значения будут потеряны.»
Пример 5
Наблюдаем появление предупреждающего окна:
Sub Primer5() ‘Отменяем объединение ячеек в диапазоне «A1:D4» Range(«A1:D4»).MergeCells = 0 ‘Заполняем ячейки диапазона текстом Range(«A1:D4») = «Ячейка не пустая» ‘Объединяем ячейки диапазона «A1:D4» Range(«A1:D4»).MergeCells = 1 ‘Наблюдаем предупреждающее диалоговое окно End Sub |
Чтобы избежать появление предупреждающего окна, следует использовать свойство Application.DisplayAlerts, с помощью которого можно отказаться от показа диалоговых окон при работе кода VBA Excel.
Пример 6
Sub Primer6() ‘Отменяем объединение ячеек в диапазоне «A5:D8» Range(«A5:D8»).MergeCells = 0 ‘Заполняем ячейки диапазона «A5:D8» текстом Range(«A5:D8») = «Ячейка не пустая» Application.DisplayAlerts = False Range(«A5:D8»).MergeCells = 1 Application.DisplayAlerts = True End Sub |
Теперь все прошло без появления диалогового окна. Главное, не забывать после объединения ячеек возвращать свойству Application.DisplayAlerts значение True.
Кстати, если во время работы VBA Excel предупреждающее окно не показывается, это не означает, что оно игнорируется. Просто программа самостоятельно принимает к действию ответное значение диалогового окна по умолчанию.
0 / 0 / 0 Регистрация: 03.05.2010 Сообщений: 141 |
|
1 |
|
Как программно снять объединение ячеек?19.10.2010, 09:26. Показов 15419. Ответов 7
надо на выделенном диапазоне ячеек,если стоит галка на фОРМАТ ЯЧЕЕК -> ОБЪЕДИНЕНИЕ ЯЧЕЕК … убрать ее
0 |
natalie |
||||
19.10.2010, 09:55 |
2 |
|||
Все просто:
|
0 / 0 / 0 Регистрация: 11.10.2010 Сообщений: 21 |
|
19.10.2010, 11:07 |
3 |
а еще один способ снять объединение ячеек — использовать метод unmerge:
0 |
0 / 0 / 0 Регистрация: 03.05.2010 Сообщений: 141 |
|
27.10.2010, 11:24 [ТС] |
4 |
Да,
0 |
natalie |
||||
27.10.2010, 11:46 |
5 |
|||
могу предложить некрасивый вариант.
я думаю, есть более короткий вариант, но чем богаты… |
0 / 0 / 0 Регистрация: 03.05.2010 Сообщений: 141 |
|
27.10.2010, 12:48 [ТС] |
6 |
вопрос остается в силе: ‘Как снять объединение ячеек, если неизвестно, какие именно ячейки объединены ?’ последний предложенный вариант не только долго работает, но ,как мне показалось, вообще виснет
0 |
14 / 14 / 2 Регистрация: 23.03.2010 Сообщений: 635 |
|
27.10.2010, 15:06 |
7 |
Зачем проверять наличие объединённых ячеек — не пойму: по-моему, нужно в любом случае выполнить Cells.MergeCells = False —
0 |
0 / 0 / 0 Регистрация: 03.05.2010 Сообщений: 141 |
|
27.10.2010, 16:23 [ТС] |
8 |
конечно-конечно, именно Cells.MergeCells = False дает правильный результат Уважаемый Vlth, в очередной раз огромное спасибо за поддержку и реальную помощь
0 |
В программе Excel присутствует кнопка для разъединения объединенных ячеек таблицы на закладке: «ГЛАВНАЯ»-«Выравнивание»-«Отменить объединение ячеек». Но что, если эту операцию нужно выполнять многократно, да еще и после нее заполнять данными ново созданные ячейки. Реализовать данную задачу вручную – это весьма затратное занятие по времени и силам. Здесь рационально воспользоваться макросом.
Макрос для разъединения объединенных ячеек в Excel
Допустим у нас уже имеется вполне читабельная таблица списка заказов, в которой имеются объединенные ячейки в столбце «Год». Пример, такой таблицы изображен ниже на рисунке:
Но нам необходимо преобразовать данную таблицу в стандартный формат, например, для создания отчета на основе сводной таблицы. Для этого откроем редактор Visual Basic (ALT+F11):
И вставим новый стандартный модуль используя инструмент в редакторе: «Insert»-«Module». А после чего запишем в модуль VBA код макроса для разъединения объединенных ячеек:
Sub RazdelitVstavit()
Dim adres As String
adres = ActiveCell.MergeArea.Address
If adres <> ActiveCell.Address Then
ActiveCell.UnMerge
ActiveCell.Copy
ActiveSheet.Paste ActiveSheet.Range(adres)
Application.CutCopyMode = False
End If
End Sub
Если мы хотим отменить объединение ячеек в столбце «Год» и заполнить созданные ячейки соответствующими значениями (годами), тогда перейдите на одну большую объединенную ячейку B2 и запустите макрос: «РАЗРАБОТЧИК»-«Код»-«Макросы»-«RazdelitVstavit»-«Выполнить».
В данном VBA коде макроса используется только одна переменная. Она хранит в себе адрес диапазона ячеек B2:B15 которые охватывает одна активная объединенная ячейка.
adres = ActiveCell.MergeArea.Address
Адрес активной ячейки отображается в поле «Имя» (напротив строки формул Excel). Но там не отображается полный адрес объединенной ячейки.
Для пользователя в поле «Имя» будет адрес отображаться одинаково, но в макросе их можно различить с помощью методов объекта ActiveCell.MergeArea.Addres. В зависимости какой тип активных ячеек будет возвращен тип адреса – одна ячейка или диапазон. Если активная ячейка не является объединенной, тогда в переменной будет храниться только адрес одной активной ячейки, а не целого диапазона. Далее макрос проверяет является ли текущая активная ячейка – объединенной, с помощью сравнения двух способов получения адреса для одной и той же активной ячейки. Тот способ, который передал адрес в переменную из метода объекта ActiveCell.MergeArea.Addres и обычный – ActiveCell.Addres. Если адрес в переменной и адрес получен обычным способом не совпадает, значит она является объединенной и код выполняется дальше.
С помощью метода объекта ActiveCell.UnMerge выполняется разъединение объединенной активной ячейки. Далее копируется ее содержимое и заполняется диапазон на листе, адрес которого получен из переменной, его же ранее содержала в себе объединенная активная ячейка. После копирования значения для объекта CutCopyMode устанавливается свойство False, чтобы прекратить процесс копирования. В результате таблица листа заказов будет иметь такой же вид как показано ниже на рисунке:
Данный макрос позволяет разъединить объединенные ячейки, которые используют любое направление объединения: как по вертикали, так и полгоризонтали. Ее значение будет одинаково вставлено во все ячейки, созданные после разъединения.
Внимание! Объединенная ячейка может содержать в качестве значения формулы. В такие случаи после запуска макроса эта формула будет вставлена во все ячейки созданных в результате отмены объединения только из относительных ссылок в адресах, поскольку в переменной не будет символа $ необходимого для абсолютного или смешанного адреса.
Как разъединить объединенные ячейки сразу в нескольких диапазонах
Если мы хотим, чтобы данный макрос можно было применить одновременно для нескольких объединенных ячеек в выделенном диапазоне, тогда добавим еще одну переменную, которая дополнит код счетчиком цикла:
Dim i As Long
Создадим цикл, который будет перемещаться по всем выделенным объединенным ячейкам:
For i = 1 To Selection.Count
В конце кода не забудем добавить конец цикла:
Next
Вместо ссылки на активную ячейку Active.Cell теперь будем использовать ссылку на очередную по счету ячейку в выделенном диапазоне: Selection.(i). Полная версия усовершенствованного макроса выглядит следующим образом:
Sub RazdelitVstavit()
Dim adres As String
Dim i As Long
For i = 1 To Selection.Count
adres = Selection(i).MergeArea.Address
If adres <> Selection(i).Address Then
Selection(i).UnMerge
Selection(i).Copy
ActiveSheet.Paste ActiveSheet.Range(adres)
Application.CutCopyMode = False
End If
Next
End Sub
Цикл, который перемещается по каждой объединенной ячейке выделенного диапазона, каждый раз вызывает VBA код макроса для разъединения их диапазона объединения с учетом всех выше описанных условий.
Читайте также: Как объединить ячейки в Excel с помощью кода макроса VBA.
Так же стоит отметить, что выделенный диапазон может содержать необъединенные ячейки, которые будут просто игнорироваться макросом. Если бы мы не усовершенствовали наш макрос, то при выделении нескольких объединенных ячеек – разделилась бы только первая.
Alex Пользователь Сообщений: 115 |
Добрый день! Помогите, пожалуйста. Требуется снять объединение ячеек с заполнением всех разъединенных ячеек значением, которое было в объединенной ячейке. Таблицы большие, ручная работа утомляет. Как ускорить процесс? |
Макросом выделить нужный диапазон и |
|
Воть Sub Macro1() Перед запуском макроса, необходимо активировать (тыкнуть мышкой) на нужной ячейке |
|
Тыкаем в объединенную ячейку и запускаем макрос: СердЖиГ, у Вас только один столбец заполняеется |
|
Лузер, я — ламер :-))) Начинающий вобщем |
|
СердЖиГ, просто проверить ведь этот код |
|
Alex Пользователь Сообщений: 115 |
Спасибо всем. Я правда надеялся обойтись без макросов, но видно нет такого варианта. ((( Придется с макросами. |
Alex_ST Пользователь Сообщений: 2746 На лицо ужасный, добрый внутри |
А ведь тема-то интересная, часто нужная и так и не доведенная до ума… Sub UnMerge_And_Fill_All() при выделении по очереди каждой из объединенных ячеек всё делает правильно. С уважением, Алексей (ИМХО: Excel-2003 — THE BEST!!!) |
VovaK Пользователь Сообщений: 1716 |
Делаете еще один цикл и проверяете каждую Cell in Selection, если Cell.MergeCells = True то Call UnMerge_And_Fill_All затем Next Собственно все. Отлаживайте и готово. |
Alex_ST Пользователь Сообщений: 2746 На лицо ужасный, добрый внутри |
Что-то у меня не работает… Т.к. после iCell.UnMerge изначальное Selection сбрасывается и выбранными оказываются разгруппированные ячейки, то пришлось его запоминать в дополнительной переменной Sel_0 Сделал так: С уважением, Алексей (ИМХО: Excel-2003 — THE BEST!!!) |
Alex_ST Пользователь Сообщений: 2746 На лицо ужасный, добрый внутри |
The_Prist как всегда СУПЕР! С уважением, Алексей (ИМХО: Excel-2003 — THE BEST!!!) |
КАДР Пользователь Сообщений: 148 |
http://www.planetaexcel.ru/tip.php?aid=86
для Excel 2007: на ленте выбрать Главная — Найти и выделить — Выделение группы ячеек — пустые ячейки |
КАДР Пользователь Сообщений: 148 |
Это делать после того, как снято объединение ячеек и выделен диапазон для заполнения |
Alex_ST Пользователь Сообщений: 2746 На лицо ужасный, добрый внутри |
The_Prist , С уважением, Алексей (ИМХО: Excel-2003 — THE BEST!!!) |
Alex_ST Пользователь Сообщений: 2746 На лицо ужасный, добрый внутри |
СПАСИБО, The_Prist !!! С уважением, Алексей (ИМХО: Excel-2003 — THE BEST!!!) |
Alex_ST Пользователь Сообщений: 2746 На лицо ужасный, добрый внутри |
вот тут «в лёт» не получилось… С уважением, Алексей (ИМХО: Excel-2003 — THE BEST!!!) |
Alex_ST Пользователь Сообщений: 2746 На лицо ужасный, добрый внутри |
Да! С уважением, Алексей (ИМХО: Excel-2003 — THE BEST!!!) |
Alex_ST Пользователь Сообщений: 2746 На лицо ужасный, добрый внутри |
на всякий случай если кому-нибудь надо: http://www.planetaexcel.ru/forum.php?thread_id=3760&thread_id=3760&page_forum=lastpage&allnum_forum=14#post86381 ) Sub UnMerge_and_Fill_by_HyperLink() http://www.planetaexcel.ru/forum.php?thread_id=3760&thread_id=3760&page_forum=lastpage&allnum_forum=14#post86381 ) С уважением, Алексей (ИМХО: Excel-2003 — THE BEST!!!) |
Alex_ST Пользователь Сообщений: 2746 На лицо ужасный, добрый внутри |
Пардон, не углядел небольшую неточность… Sub UnMerge_and_Fill_by_Value() http://www.planetaexcel.ru/forum.php?thread_id=3760&thread_id=3760&page_forum=lastpage&allnum_forum=14#post86381 ) Sub UnMerge_and_Fill_by_HyperLink() http://www.planetaexcel.ru/forum.php?thread_id=3760&thread_id=3760&page_forum=lastpage&allnum_forum=14#post86381 ) С уважением, Алексей (ИМХО: Excel-2003 — THE BEST!!!) |
Alex_ST Пользователь Сообщений: 2746 На лицо ужасный, добрый внутри |
Разбирался с кучей макросов в своём Personal.xls, немного «причесал» и слепил в один два предыдущих макроса заполнения разгруппированных ячеек: http://www.planetaexcel.ru/forum.php?thread_id=3760 ‘ Purpose : Снимает объединение со всех ячеек выделенного диапазона С уважением, Алексей (ИМХО: Excel-2003 — THE BEST!!!) |
AlexST спасибо за то что причесал макрос, сохранил себе. Пригодится |
|
student Пользователь Сообщений: 24 |
#22 02.05.2012 13:35:45 Пишу дисер, столкнулся с такой проблемой — по первой же ссылке нашел ваш форум. Спасибо ребята за Ваши труды! Очень помогли! Добро всегда возвращается! Спасибо! lev |
Разъединить объединенную ячейку и заполнить данными. |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |