Vba excel снять объединение ячеек на листе

Объединение диапазона ячеек в одну или построчно с помощью кода VBA Excel. Метод Range.Merge и свойство MergeCells. Отмена объединения ячеек. Примеры.

Метод Range.Merge

Метод Merge объекта Range объединяет ячейки заданного диапазона в одну или построчно из кода VBA Excel.

Синтаксис метода:

  1. Expression — выражение, возвращающее объект Range.
  2. Across — логическое значение, определяющее характер объединения ячеек:
    • True — ячейки объединяются построчно: каждая строка заданного диапазона преобразуется в одну ячейку.
    • False — весь диапазон преобразуется в одну ячейку. False является значением по умолчанию.

Преимущество метода Range.Merge перед свойством MergeCells заключается в возможности построчного объединения ячеек заданного диапазона без использования цикла.

Свойство MergeCells

Свойство MergeCells объекта Range применяется как для объединения ячеек, так и для его отмены.

Синтаксис свойства с присвоением значения:

Expression.MergeCells = Boolean

  1. Expression — выражение, представляющее объект Range.
  2. 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


Студворк — интернет-сервис помощи студентам

надо на выделенном диапазоне ячеек,если стоит галка на фОРМАТ ЯЧЕЕК -> ОБЪЕДИНЕНИЕ ЯЧЕЕК … убрать ее
т.е. снять объединение ячеек программно
не знаю как написать условие if .MergeCells = True (дает ошибку)
спасибо за ответы



0



natalie

19.10.2010, 09:55

2

Все просто:

Visual Basic
1
If Range('A1:B2').MergeCells Then Range('A1:B2').MergeCells = False

0 / 0 / 0

Регистрация: 11.10.2010

Сообщений: 21

19.10.2010, 11:07

3

а еще один способ снять объединение ячеек — использовать метод unmerge:
selection.unmerge



0



0 / 0 / 0

Регистрация: 03.05.2010

Сообщений: 141

27.10.2010, 11:24

 [ТС]

4

Да,
If Range(‘A1:B2’).MergeCells Then Range(‘A1:B2’).MergeCells = False
срабатывает, если если известно, какие ячейки листа были объединены
А если нужно снять объединение вообще с листа:
пометили все ячейки листа, проверили — есть объединенные ячейки
как снять объединение?
спасибо за ответы



0



natalie

27.10.2010, 11:46

5

могу предложить некрасивый вариант.
на самом деле, если ты хотя бы приблизительно знаешь, на каком диапазоне располагаются данные, то лучше этот диапазон обозначить, а если нет, но объединение снять ну уж очень необходимо, то предлагаю так (правда считаться это будет ну очень долго)

Visual Basic
1
2
3
4
Лист1.Cells.Select
For Each c In Selection.Cells
If c.MergeCells Then c.MergeCells = False
Next

я думаю, есть более короткий вариант, но чем богаты…

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 дает правильный результат
а снимать объединение нужно, так как когда делаешь программно автофильтр, если есть объединенные ячейки-получаешь непредсказуемый результат, снимаешь объединение-все Ok!

Уважаемый Vlth, в очередной раз огромное спасибо за поддержку и реальную помощь



0



В программе Excel присутствует кнопка для разъединения объединенных ячеек таблицы на закладке: «ГЛАВНАЯ»-«Выравнивание»-«Отменить объединение ячеек». Но что, если эту операцию нужно выполнять многократно, да еще и после нее заполнять данными ново созданные ячейки. Реализовать данную задачу вручную – это весьма затратное занятие по времени и силам. Здесь рационально воспользоваться макросом.

Макрос для разъединения объединенных ячеек в Excel

Допустим у нас уже имеется вполне читабельная таблица списка заказов, в которой имеются объединенные ячейки в столбце «Год». Пример, такой таблицы изображен ниже на рисунке:

таблица списка заказов.

Но нам необходимо преобразовать данную таблицу в стандартный формат, например, для создания отчета на основе сводной таблицы. Для этого откроем редактор Visual Basic (ALT+F11):

Visual Basic.

И вставим новый стандартный модуль используя инструмент в редакторе: «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

модуль VBA код макроса.

Если мы хотим отменить объединение ячеек в столбце «Год» и заполнить созданные ячейки соответствующими значениями (годами), тогда перейдите на одну большую объединенную ячейку 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

Пример2.

Цикл, который перемещается по каждой объединенной ячейке выделенного диапазона, каждый раз вызывает VBA код макроса для разъединения их диапазона объединения с учетом всех выше описанных условий.

Читайте также: Как объединить ячейки в Excel с помощью кода макроса VBA.

Так же стоит отметить, что выделенный диапазон может содержать необъединенные ячейки, которые будут просто игнорироваться макросом. Если бы мы не усовершенствовали наш макрос, то при выделении нескольких объединенных ячеек – разделилась бы только первая.

 

Alex

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

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

Добрый день!  

  Помогите, пожалуйста. Требуется снять объединение ячеек с заполнением всех разъединенных ячеек значением, которое было в объединенной ячейке. Таблицы большие, ручная работа утомляет. Как ускорить процесс?  
Спасибо.

 

Макросом выделить нужный диапазон и  
Selection.UnMerge

 

Воть  

  Sub Macro1()  
i = ActiveCell.Row  
b = ActiveCell.Column  
Cells(i, b).UnMerge  
Selection.FillDown  
End Sub  

  Перед запуском макроса, необходимо активировать (тыкнуть мышкой) на нужной ячейке :-)

 

Тыкаем в объединенную ячейку и запускаем макрос:  
Sub Макрос1()  
a = Selection.Value  
Selection.UnMerge  
For Each rr In Selection  
rr.Value = a  
Next  
End Sub  

    СердЖиГ, у Вас только один столбец заполняеется

 

Лузер, я — ламер :-))) Начинающий вобщем

 

СердЖиГ, просто проверить ведь этот код :)

 

Alex

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

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

Спасибо всем. Я правда надеялся обойтись без макросов, но видно нет такого варианта. ((( Придется с макросами.

 

Alex_ST

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

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

На лицо ужасный, добрый внутри

А ведь тема-то интересная, часто нужная и так и не доведенная до ума…  
Вот есть, например, таблица — штатное расписание организации (ну, или табличное описание чего угодно, имеющего иерархическую структуру) составленное с использованием объединенных ячеек. Естественно, что из-за наличия объединенных ячеек такую таблицу нормально фильтровать будет невозможно, а уж о том, чтобы перенести информацию в базу данных даже и подумать страшно…  
Макрос типа:  

  Sub UnMerge_And_Fill_All()  
  Dim MainValue  
  Dim iCell As Range  
  MainValue = Selection.Value  
  Selection.UnMerge  
  For Each iCell In Selection  
     iCell.Value = MainValue  
  Next  
End Sub  

  при выделении по очереди каждой из объединенных ячеек всё делает правильно.  
Но если выделить диапазон, содержащий несколько групп объединенных ячеек, то после разъединения все ячейки выделенного диапазона окажутся заполнены значением MainValue.  
А надо сделать чтобы в выделенном диапазоне перебирались в цикле все группы объединенных ячеек, каждая группа разгруппировывалась и её ячейкам присваивалось своё значение MainValue  
Алгоритм-то мне ясен, но как сделать, что-то не пойму…  
В приведенном примере на Лист1 в ячейках A1:E40 (в общем случае A:E) показана исходная таблица, а на Лист2 — таблица, как она должна выглядеть после разгруппировки макросом Smart_UnMerge

С уважением, Алексей (ИМХО: Excel-2003 — THE BEST!!!)
<#0>

 

VovaK

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

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

Делаете еще один цикл и проверяете каждую Cell in Selection, если  Cell.MergeCells = True то Call UnMerge_And_Fill_All затем Next  

  Собственно все. Отлаживайте и готово.

 

Alex_ST

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

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

На лицо ужасный, добрый внутри

Что-то у меня не работает…  
Ругается «Недопустимое число аргументов или присвоение значения свойства.  

  Т.к. после iCell.UnMerge изначальное Selection сбрасывается и выбранными оказываются разгруппированные ячейки, то пришлось его запоминать в дополнительной переменной Sel_0  

  Сделал так:  
Sub Smart_UnMerge()  
  Dim MainValue  
  Dim iCell As Range  
  Dim iiCell As Range  
  Dim Sel_0  
  Sel_0 = Selection.Range  
  For Each iCell In Sel_0  
     If iCell.MergeCells = True Then  
        MainValue = iCell.Value  
        iCell.UnMerge  
        For Each iiCell In Selection  
           iiCell.Value = MainValue  
        Next  
     End If  
  Next  
End Sub

С уважением, Алексей (ИМХО: Excel-2003 — THE BEST!!!)
<#0>

 

Alex_ST

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

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

На лицо ужасный, добрый внутри

The_Prist как всегда СУПЕР!  
Спасибо. Тестирую. Пока всё отлично работает.

С уважением, Алексей (ИМХО: Excel-2003 — THE BEST!!!)
<#0>

 

КАДР

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

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

http://www.planetaexcel.ru/tip.php?aid=86  

для Excel 2007: на ленте выбрать Главная — Найти и выделить — Выделение группы ячеек — пустые ячейки

 

КАДР

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

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

Это делать после того, как снято объединение ячеек и выделен диапазон для заполнения

 

Alex_ST

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

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

На лицо ужасный, добрый внутри

The_Prist ,  
если выделить целиком несколько столбцов, то разгруппировывает очень долго…  
Надо бы, наверное, как-то ограничить обрабатываемый диапазон «до последней используемой строки».  
А как это сделать?

С уважением, Алексей (ИМХО: Excel-2003 — THE BEST!!!)
<#0>

 

Alex_ST

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

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

На лицо ужасный, добрый внутри

СПАСИБО, The_Prist !!!  
Вы пишете макросы быстрее чем я их тестирую…  
Всё теперь отлично и быстро работает.  
А что надо изменить чтобы в разгруппированные ячейки вставлялось не значение первой («главной») ячейки, а формула =главной_ячейке?  
Тогда, изменив «ключевую» ячейку, мы сразу же изменим и те, с которыми она была сгруппирована.    
Ну, а уж после всех исправлений можно будет и специальной вставкой формулы на значения заменить.

С уважением, Алексей (ИМХО: Excel-2003 — THE BEST!!!)
<#0>

 

Alex_ST

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

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

На лицо ужасный, добрый внутри

вот тут «в лёт» не получилось…  
1. Разгруппировываются все ячейки в столбце даже если выбран ограниченный диапазон, а не столбец.  
2. Формула по строкам (сверху вниз) размножается правильно, а по столбцам (слева-направо) — нет. Берет значения из ячейки выше, а не слева…  
Пункт 2 попробую, конечно, сам исправить, но это мне ещё придётся побиться…

С уважением, Алексей (ИМХО: Excel-2003 — THE BEST!!!)
<#0>

 

Alex_ST

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

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

На лицо ужасный, добрый внутри

Да!  
Отлично!  
Всё работает!  
СПАСИБО!  
Ща запихну эти два кода к себе в Personal.xls и сделаю для них кнопочки на панели управления (не забыть бы потом Excel11.xlb в XLSTART переложить чтобы настройки не пропали)

С уважением, Алексей (ИМХО: Excel-2003 — THE BEST!!!)
<#0>

 

Alex_ST

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

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

На лицо ужасный, добрый внутри

на всякий случай если кому-нибудь надо:  
Sub UnMerge_and_Fill_by_Value()  
  ‘—————————————————————————————  
  ‘ Procedure : UnMerge_and_Fill_by_Value  
  ‘ Author    : The_Prist (

http://www.planetaexcel.ru/forum.php?thread_id=3760&thread_id=3760&page_forum=lastpage&allnum_forum=14#post86381

)  
  ‘ Date      : 23.12.2009  
  ‘ Purpose   : Снимает объединение со всех ячеек выделенного диапазона _  
    и заполняет все разгруппированные ячейки каждой бывшей группы значениями верхней левой  
  ‘—————————————————————————————  
  Dim sValue As String, sAddress As String  
  Dim rRange As Range, rCell As Range  
  Application.ScreenUpdating = False  
  Set rRange = Range(Cells(Selection.Row, Selection.Column), _  
                     Cells(Cells.SpecialCells(xlLastCell).Row, _  
                           Selection.Column + Selection.Columns.Count — 1))  
  For Each rCell In rRange  
     If rCell.MergeCells = True Then  
        sValue = rCell.Value: sAddress = rCell.MergeArea.Address  
        rCell.UnMerge: Range(sAddress).Value = rCell.Value  
     End If  
  Next  
  Application.ScreenUpdating = True  
End Sub  

  Sub UnMerge_and_Fill_by_HyperLink()  
  ‘—————————————————————————————  
  ‘ Procedure : UnMerge_and_Fill_by_HyperLink  
  ‘ Author    : The_Prist (

http://www.planetaexcel.ru/forum.php?thread_id=3760&thread_id=3760&page_forum=lastpage&allnum_forum=14#post86381

)  
  ‘ Date      : 23.12.2009  
  ‘ Purpose   : Снимает объединение со всех ячеек выделенного диапазона _  
    и заполняет все разгруппированные ячейки каждой бывшей группы ссылками на значения верхней левой  
  ‘—————————————————————————————  
  Dim sAddress As String  
  Dim rRange As Range, rCell As Range, rEmptyRange As Range  
  Dim lLastRow As Long, lLastCol As Long  
  lLastRow = Cells.SpecialCells(xlLastCell).Row  
  lLastCol = Selection.Column + Selection.Columns.Count — 1  
  If lLastRow > Selection.Row + Selection.Rows.Count — 1 Then lLastRow = Selection.Row + Selection.Rows.Count — 1  
  Application.ScreenUpdating = False  
  Set rRange = Range(Cells(Selection.Row, Selection.Column), Cells(lLastRow, lLastCol))  
  For Each rCell In rRange  
     If rCell.MergeCells = True Then  
        sAddress = rCell.MergeArea.Address: rCell.UnMerge  
        On Error Resume Next: Set rEmptyRange = Range(sAddress).SpecialCells(xlCellTypeBlanks)  
        If Not rEmptyRange Is Nothing Then rEmptyRange.Formula = «=» & rCell.Cells(1).Address  
     End If  
  Next  
  Set rRange = Nothing: Set rCell = Nothing: Set rEmptyRange = Nothing  
  Application.ScreenUpdating = True  
End Sub

С уважением, Алексей (ИМХО: Excel-2003 — THE BEST!!!)
<#0>

 

Alex_ST

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

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

На лицо ужасный, добрый внутри

Пардон, не углядел небольшую неточность…  
Диапазон выделения не ограничивается Selection  
Естественно, должно быть так:  

  Sub UnMerge_and_Fill_by_Value()  
‘—————————————————————————————  
‘ Procedure : UnMerge_and_Fill_by_Value  
‘ Author : The_Prist (

http://www.planetaexcel.ru/forum.php?thread_id=3760&thread_id=3760&page_forum=lastpage&allnum_forum=14#post86381

)  
‘ Date : 23.12.2009  
‘ Purpose : Снимает объединение со всех ячеек выделенного диапазона _  
и заполняет все разгруппированные ячейки каждой бывшей группы значениями верхней левой  
‘—————————————————————————————  
Dim sValue As String, sAddress As String  
Dim rRange As Range, rCell As Range  
Application.ScreenUpdating = False  
Set rRange = Intersect(Selection, Range(Cells(Selection.Row, Selection.Column), _  
Cells(Cells.SpecialCells(xlLastCell).Row, _  
Selection.Column + Selection.Columns.Count — 1)))  
For Each rCell In rRange  
If rCell.MergeCells = True Then  
sValue = rCell.Value: sAddress = rCell.MergeArea.Address  
rCell.UnMerge: Range(sAddress).Value = rCell.Value  
End If  
Next  
Application.ScreenUpdating = True  
End Sub  

  Sub UnMerge_and_Fill_by_HyperLink()  
‘—————————————————————————————  
‘ Procedure : UnMerge_and_Fill_by_HyperLink  
‘ Author : The_Prist (

http://www.planetaexcel.ru/forum.php?thread_id=3760&thread_id=3760&page_forum=lastpage&allnum_forum=14#post86381

)  
‘ Date : 23.12.2009  
‘ Purpose : Снимает объединение со всех ячеек выделенного диапазона _  
и заполняет все разгруппированные ячейки каждой бывшей группы ссылками на значения верхней левой  
‘—————————————————————————————  
Dim sAddress As String  
Dim rRange As Range, rCell As Range, rEmptyRange As Range  
Dim lLastRow As Long, lLastCol As Long  
lLastRow = Cells.SpecialCells(xlLastCell).Row  
lLastCol = Selection.Column + Selection.Columns.Count — 1  
If lLastRow > Selection.Row + Selection.Rows.Count — 1 Then lLastRow = Selection.Row + Selection.Rows.Count — 1  
Application.ScreenUpdating = False  
Set rRange = Intersect(Selection, Range(Cells(Selection.Row, Selection.Column), Cells(lLastRow, lLastCol)))  
For Each rCell In rRange  
If rCell.MergeCells = True Then  
sAddress = rCell.MergeArea.Address: rCell.UnMerge  
On Error Resume Next: Set rEmptyRange = Range(sAddress).SpecialCells(xlCellTypeBlanks)  
If Not rEmptyRange Is Nothing Then rEmptyRange.Formula = «=» & rCell.Cells(1).Address  
End If  
Next  
Set rRange = Nothing: Set rCell = Nothing: Set rEmptyRange = Nothing  
Application.ScreenUpdating = True  
End Sub

С уважением, Алексей (ИМХО: Excel-2003 — THE BEST!!!)
<#0>

 

Alex_ST

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

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

На лицо ужасный, добрый внутри

Разбирался с кучей макросов в своём Personal.xls, немного «причесал» и слепил в один два предыдущих макроса заполнения разгруппированных ячеек:  
Sub UnMerge_and_Fill()  
  ‘—————————————————————————————  
  ‘ Procedure    : UnMerge_and_Fill  
  ‘ Topic_HEADER : Снятие объединения ячеек с заполнением  
  ‘ Topic_URL    :

http://www.planetaexcel.ru/forum.php?thread_id=3760  

  ‘ Purpose      : Снимает объединение со всех ячеек выделенного диапазона  
  ‘                и заполняет все разгруппированные ячейки КАЖДОЙ бывшей группы  
  ‘                либо ссылками на значения верхней левой, либо её значениями  
  ‘—————————————————————————————  
  If Selection.Cells.Count <= 1 Then Exit Sub  
  Dim rRange As Range, rCell As Range, sValue$, sAddress$, i&  
  Application.ScreenUpdating = False  
  Set rRange = Intersect(Selection, ActiveSheet.UsedRange)  
  Select Case MsgBox(«»»ДА»» — заполнить ячейки формулами-ссылками на первую ячейку» & vbCrLf & _  
                     «»»НЕТ»» — заполнить ячейки значениями из первой ячейки» & vbCrLf & _  
                     «»»ОТМЕНА»» не разгруппировывать» _  
                     , vbYesNoCancel + vbQuestion, «Как заполнять ячейки после разгруппировки?»)  
     Case vbYes   ‘ разгруппировать все ячейки в Selection и ячейки каждой бывшей группы заполнить формулами-ссылками на их первые ячейки  
        For Each rCell In rRange  
           If rCell.MergeCells Then  
              sAddress = rCell.MergeArea.Address: rCell.UnMerge  
              For i = 2 To Range(sAddress).Cells.Count  
                 With Range(sAddress)  
                    .Cells(i).Formula = «=» & .Cells(1).Address  
                    .Cells(i).Replace What:=»$», Replacement:=»», LookAt:=xlPart  ‘ сделать ссылки перемещаемыми  
                    .Cells(i).Font.ColorIndex = 5   ‘ сделать шрифт формул синим (это на любителя, конечно)  
                 End With  
              Next i  
           End If  
        Next rCell  
     Case vbNo    ‘ разгруппировать все ячейки в Selection и ячейки каждой бывшей группы заполнить значениями из их первых ячеек  
        For Each rCell In rRange  
           If rCell.MergeCells Then  
              sAddress = rCell.MergeArea.Address: sValue = rCell.Value: rCell.UnMerge  
              Range(sAddress).Value = rCell.Value  
           End If  
        Next  
     Case vbCancel  
        If MsgBox(«Разгруппировать стандартным способом?», vbYesNo + vbQuestion) = vbYes Then Selection.UnMerge  
  End Select  
  rRange.Select  
  Application.ScreenUpdating = True  
End Sub

С уважением, Алексей (ИМХО: Excel-2003 — THE BEST!!!)
<#0>

 

AlexST спасибо за то что причесал макрос, сохранил себе. Пригодится :)

 

student

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

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

#22

02.05.2012 13:35:45

Пишу дисер, столкнулся с такой проблемой — по первой же ссылке нашел ваш форум. Спасибо ребята за Ваши труды! Очень помогли! Добро всегда возвращается! Спасибо!

lev

Разъединить объединенную ячейку и заполнить данными.

Aleksej

Дата: Вторник, 16.08.2016, 07:22 |
Сообщение № 1

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

Ранг: Участник

Сообщений: 69


Репутация:

0

±

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


Excel 2010

Всем доброго времени суток! :)

Нужна помощь знатоков VBA в написании макроса!

Задача:
1. Имеется файл Excel с объединенными ячейками (см. приложение)
2. Необходим макрос который находит объединенную ячейку, разъединяет её и во все получившиеся после разъединения ячейки записывает значение, которое было в объединенной ячейке. %)
3. В примере файла Excel: на листе1 исходные данные, на листе 2 как должно быть после применения макроса.

Спасибо! :)

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

3333333.xls
(49.5 Kb)

 

Ответить

Pelena

Дата: Вторник, 16.08.2016, 07:30 |
Сообщение № 2

Группа: Админы

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

Сообщений: 18797


Репутация:

4284

±

Замечаний:
±


Excel 2016 & Mac Excel

Здравствуйте.
Последовательность действий такая:
— выделяем нужный диапазон (в примере А3:G29)
— снимаем объединение ячеек
— нажимаем F5 — Выделить — Пустые ячейки — ОК
— нажимаем на клавиатуре = и стрелку вверх. В строке формул должно получиться =A3
— нажимаем на клавиатуре сочетание Ctrl+Enter

Если нужен именно макрос, запишите действия макрорекодером
На эту тему можно посмотреть видео http://www.excelworld.ru/video….n_range


«Черт возьми, Холмс! Но как??!!»
Ю-money 41001765434816

 

Ответить

Aleksej

Дата: Вторник, 16.08.2016, 07:39 |
Сообщение № 3

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

Ранг: Участник

Сообщений: 69


Репутация:

0

±

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


Excel 2010

Pelena,

Цитата

Если нужен именно макрос, запишите действия макрорекодером

Это если несколько ячеек то можно и так, а если их сотни или тысячи в файле, как сделать чтоб макрос нашел все и преобразовал? %)

 

Ответить

Pelena

Дата: Вторник, 16.08.2016, 07:43 |
Сообщение № 4

Группа: Админы

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

Сообщений: 18797


Репутация:

4284

±

Замечаний:
±


Excel 2016 & Mac Excel

Какая разница? Выделите весь диапазон с данными (Ctrl+*)


«Черт возьми, Холмс! Но как??!!»
Ю-money 41001765434816

 

Ответить

Aleksej

Дата: Вторник, 16.08.2016, 07:44 |
Сообщение № 5

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

Ранг: Участник

Сообщений: 69


Репутация:

0

±

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


Excel 2010

Pelena,

Цитата

Какая разница? Выделите весь диапазон с данными (Ctrl+*)

Сори, все разобрался. Спасибо за помощь. :)

 

Ответить

Aleksej

Дата: Вторник, 16.08.2016, 07:53 |
Сообщение № 6

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

Ранг: Участник

Сообщений: 69


Репутация:

0

±

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


Excel 2010

Pelena,

Цитата

Выделите весь диапазон с данными

Если всё выделять другая проблема появляется, ячейки которые не были объеденены тоже заполняются, а это не нужно.
Нужно, чтоб заполнялись ячейки которые были объединенными. :)

 

Ответить

Pelena

Дата: Вторник, 16.08.2016, 08:07 |
Сообщение № 7

Группа: Админы

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

Сообщений: 18797


Репутация:

4284

±

Замечаний:
±


Excel 2016 & Mac Excel

Тогда приведите более реальный пример


«Черт возьми, Холмс! Но как??!!»
Ю-money 41001765434816

 

Ответить

nilem

Дата: Вторник, 16.08.2016, 08:15 |
Сообщение № 8

Группа: Авторы

Ранг: Старожил

Сообщений: 1612


Репутация:

563

±

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


Excel 2013, 2016

можно так попробовать
[vba]

Код

Sub ertert()
Dim r As Range
For Each r In Range(«A3:G» & Cells(Rows.Count, 1).End(xlUp).Row)
    If r.MergeCells Then
        With r.MergeArea
            .UnMerge
            .Value = r.Value
        End With
    End If
Next r
End Sub

[/vba]
правда, на тысячах ячеек будет, видимо, тормозить


Яндекс.Деньги 4100159601573

 

Ответить

Aleksej

Дата: Вторник, 16.08.2016, 08:27 |
Сообщение № 9

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

Ранг: Участник

Сообщений: 69


Репутация:

0

±

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


Excel 2010

Pelena,

Цитата

приведите более реальный пример

Изменил исходный файл — ЛИСТ1.
Возможно, чтоб макрос сам находил только объединенные ячейки, разъединял и заполнял их? :(
Потому что реальный исходный файл, там тысячи строк. Выложить настоящий не могу по понятным причинам.

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

0557251.xls
(45.5 Kb)

 

Ответить

Aleksej

Дата: Вторник, 16.08.2016, 08:33 |
Сообщение № 10

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

Ранг: Участник

Сообщений: 69


Репутация:

0

±

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


Excel 2010

nilem,

Цитата

можно так попробовать

Спасибо, вроде работает. :) На ошибки не проверял, но на первый взгляд все правильно. yes

Цитата

на тысячах ячеек будет, видимо, тормозит

Конечно не мгновенно, но это и не требуется. Ещё раз спасибо. :)

 

Ответить

Понравилась статья? Поделить с друзьями:
  • Vba excel следующий цикл
  • Vba excel снять выделение ячеек в excel
  • Vba excel следующий лист
  • Vba excel следующая строка
  • Vba excel скрыть ячейку в excel