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

Переход по объеденённым ячейкам

imxotep

Дата: Среда, 18.11.2015, 13:38 |
Сообщение № 1

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

Ранг: Новичок

Сообщений: 22


Репутация:

0

±

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


Excel 2010

Добрый день. Подскажите есть ли возможность перейти на объеденённую ячейку?
Допустим есть ячейка А1 в которой объеденено 3 строки, следовательно следующая за ней ячейка будет с адресом А4, можно ли как то сразу перейти на ячейку если не известно сколько строк объеденено в А1??

 

Ответить

Manyasha

Дата: Среда, 18.11.2015, 13:49 |
Сообщение № 2

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

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

Сообщений: 2198


Репутация:

898

±

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


Excel 2010, 2016

imxotep, примерно так:[vba]

Код

    i = 1
    Do
        Debug.Print Cells(i, 1).Value
        i = i + Cells(i, 1).MergeArea.Cells.Count
    Loop While (Cells(i, 1)) <> «»

[/vba]


ЯД: 410013299366744 WM: R193491431804

 

Ответить

imxotep

Дата: Среда, 18.11.2015, 13:51 |
Сообщение № 3

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

Ранг: Новичок

Сообщений: 22


Репутация:

0

±

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


Excel 2010

Manyasha, Спасибо попробую.

 

Ответить

imxotep

Дата: Среда, 18.11.2015, 13:57 |
Сообщение № 4

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

Ранг: Новичок

Сообщений: 22


Репутация:

0

±

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


Excel 2010

Manyasha, у меня вывелось число 65 — это количество объединённых ячеек??

 

Ответить

Manyasha

Дата: Среда, 18.11.2015, 14:04 |
Сообщение № 5

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

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

Сообщений: 2198


Репутация:

898

±

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


Excel 2010, 2016

imxotep, Cells(i, 1).Value — возвращает значение ячейки.
За количество объединенных ячеек отвечает MergeArea.Cells.Count


ЯД: 410013299366744 WM: R193491431804

 

Ответить

imxotep

Дата: Среда, 18.11.2015, 14:36 |
Сообщение № 6

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

Ранг: Новичок

Сообщений: 22


Репутация:

0

±

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


Excel 2010

В общем получаем количество объединённых строк и на это количество сдвигаемся вниз.

 

Ответить

Manyasha

Дата: Среда, 18.11.2015, 14:46 |
Сообщение № 7

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

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

Сообщений: 2198


Репутация:

898

±

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


Excel 2010, 2016

В данном случае, да. Если у Вам объединены ячейки НЕ одного столбца (напр. А1:С3), то нужно писать MergeArea.Rows.Count.
Чтобы посчитать кол-во объединенных столбцов — MergeArea.Columns.Count.
Короче, работайте с MergeArea, как с обычным диапазоном (Range).


ЯД: 410013299366744 WM: R193491431804

 

Ответить

Alex_ST

Дата: Четверг, 19.11.2015, 14:36 |
Сообщение № 8

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

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

Сообщений: 3176


Репутация:

604

±

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


2003

imxotep, вот Вам пара примеров работы с объединёнными ячейками:



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

Сообщение отредактировал Alex_STЧетверг, 19.11.2015, 14:37

 

Ответить

Return to VBA Code Examples

In this Article

  • Merge Cells Using VBA
  • Unmerge Cells Using VBA
  • More Merge Examples
    • Merge Rows Using VBA
    • Merge Columns Using VBA
    • Merge and Center Cell Contents Horizontally
    • Merge and Center Cell Contents Vertically
    • Merge Cells Across a Cell Range

In this tutorial, we are going to look at the different ways you can merge cells using VBA.

Merge Cells Using VBA

You can merge cells in VBA using the Range.Merge method. The following code will merge cells A1:C1:

Sub MergingCells()

Range("A1:C1").Merge

End Sub

The result is:

How to Merge Cells in VBA

Unmerge Cells Using VBA

You can unmerge a merged cell range using the Range.UnMerge method. Let’s say you’ve merged the cell range A1:D1. You can use one of the cell references in the range to unmerge the cells. The following code shows you how to unmerge cells A1:D1, in this case we are using cell B1:

Sub UnmergeCells()

Range("B1").UnMerge

End Sub

More Merge Examples

Merge Rows Using VBA

You can merge rows using VBA by specifying the row numbers that you want to merge. We have the text in cell A1 shown below:

Merging Rows Using VBA

The following code will merge rows 1-4:

Sub MergeRows()

Range("1:4").Merge

End Sub

The result is:

Merging Rows Using VBA

Merge Columns Using VBA

You can merge columns using VBA and the column letters. The following code will merge columns A:C.

Sub MergeColumns()

Range("A:C").Merge

End Sub

The result is:

Merging Columns In VBA

Merge and Center Cell Contents Horizontally

You can merge and center cell contents horizontally across a cell range. You have to merge the cells of interest and also set the horizontal alignment property of the range object to center. We have the text in cell A1 as shown below:

Merge Cells Horizontally Using VBA

The following code will merge the cell range A1:D1 and center the contents of cell A1 horizontally across this cell range:

Sub MergeandCenterContentsHorizontally()

Range("A1:D1").Merge
Range("A1:D1").HorizontalAlignment = xlCenter

End Sub

The result is:

Merging and Centering Cells Contents in VBA Horizontally

VBA Coding Made Easy

Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!

automacro

Learn More

Merge and Center Cell Contents Vertically

You can merge and center cell contents vertically across a cell range. You have to merge the cells of interest and also set the vertical alignment property of the range object to center. We have the text in cell A1 as shown below:

Merging Cells in VBA using Vertical Alignment

The following code will merge the cell range A1:A4 and center the contents of cell A1 vertically across this cell range:

Sub MergeandCenterContentsVertically()

Range("A1:A4").Merge
Range("A1:D1").VerticalAlignment = xlCenter

End Sub

The result is:

Merging Cells Using Vertical Alignment in VBA

Merge Cells Across a Cell Range

You can merge cells across a cell range. You have to set the optional Across parameter of the Merge method to True. We have the text in cell A1 as shown below:

Merge Cells Across in VBA

The following code will merge the cell range A1:D1:

Sub MergeCellsAcross()

Range("A1:D1").Merge Across:=True

End Sub

The result is:

Merge Cells Across in VBA

0 / 0 / 0

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

Сообщений: 41

1

Операции с объединенными ячейками

27.11.2015, 02:13. Показов 4816. Ответов 6


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

Вопрос простой (для знающих): есть некая таблица с объединенными ячейками. Нужно как-то прописать в столбце 4 формулу суммы ячеек из столбца 3 и строк, прилегающих к этой ячейке. Проще говоря, как узнать номер первой и последней прилегающей строки? И как по ним шагать? Представьте себе, таких строк 100. Вот как узнать сумму в объединенной ячейке?
Вот картинка для наглядности

Изображения

 



0



1813 / 1135 / 346

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

Сообщений: 4,002

27.11.2015, 10:23

2

Двигаемся сверху вниз напр по столбцу D.
выделяем ячейку (select) и смотрим N=selection.rows.count, если N=1, то ни с кем не объединена, а если нет, то получаете нужное вам число объединенных строк. после того как просуммировали не забудьте «перескочить» через этот блок ячеек для поиска следующего. Burk

Добавлено через 1 час 18 минут
Если сами не справитесь, прочитав мои пояснения, пишите, пришлю код.Burk



0



pashulka

4131 / 2235 / 940

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

Сообщений: 4,624

27.11.2015, 10:30

3

Альтернативный вариант :

Visual Basic
1
2
3
4
5
6
7
8
9
10
Private Sub Test()
    Dim iSource As Range, iCell As Range
    Set iSource = Range("A:A"): Set iCell = iSource(1)
    
    For iCount = 1 To Application.CountIf(iSource, "*")
        Set iCell = iSource.Find("*", iCell)
        iCell(1, 4) = "=SUM(" & iCell(1, 3).Resize( _
        iCell(1, 4).MergeArea.Rows.Count).Address(False, False) & ")"
    Next
End Sub



0



0 / 0 / 0

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

Сообщений: 41

30.11.2015, 00:42

 [ТС]

4

Завтра по свободе попробую оба способа. Хотя, мне кажется, первый будет проще. Проверю таймером.



0



1813 / 1135 / 346

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

Сообщений: 4,002

30.11.2015, 07:26

5

Кстати, двигаться лучше по столбцу А с проверкой, есть ли в ней название товара. А вдруг просто пустая строка. Burk



0



0 / 0 / 0

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

Сообщений: 41

30.11.2015, 08:24

 [ТС]

6

Это вряд ли. Макрос сначала формирует таблицу без пустых строк, потом убирает повторяющиеся значения и объединяет ячейки. И последнее — это сумма в объединенных ячейках. Вот такой гемор…



0



1813 / 1135 / 346

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

Сообщений: 4,002

30.11.2015, 09:58

7

Ну, тогда совсем просто и никакого гем…



0



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

Автоматическое объединение большого количества ячеек по вертикали

Допустим мы имеем маркетинговый план внедрения нового информационного программного продукта:

маркетинговый план.

Чтобы план было легче визуально анализировать лучше объединить ячейки этапов выполнения плана: A2:A4, B2:B4 и т.д. К сожалению, многократно объединять диапазоны с большим количеством строк вручную – это задание требует слишком много времени и сил. Кроме того, можно допустить много ошибок после очередного десятка выделения ячеек перед объединением. Рассмотрим каким способом можно существенно облегчить свой труд переложив большую часть работы на простую программу, написанную на языке VBA прямо в Excel. Для этого следует написать макрос, который безошибочно быстро и автоматически объединит ячейки диапазонов с разным количеством строк для каждого столбца.

  1. Сначала откройте редактор макросов: «РАЗРАБОТЧИК»-«Код»-«Visual Basic» (или просто нажмите ALT+F11).
  2. Visual Basic.

  3. Откройте стандартный модуль выбрав инструмент в редакторе: «Insert»-«Module» и введите в него следующий код макроса для объединения ячеек:

Sub ObedenitVertikal()
Dim i As Long
Dim j As Long
Dim intext As String
Application.DisplayAlerts = False
For i = 1 To Selection.Columns.Count
  intext = Selection.Cells(1, i)
  For j = 2 To Selection.Rows.Count
    intext = intext & Chr(10) & Selection.Cells(j, i)
  Next
  Selection.Columns(i).Merge
  Selection.Cells(1, i) = intext
Next
Application.DisplayAlerts = True
End Sub

Module.

Пока что это еще не полная версия макроса поэтому перед тем как его проверить нам все еще вручную необходимо выделить первый диапазон A2:D4. После чего можно выполнить нашу первую версию макроса.



Запуск макроса для объединения ячеек

Выбираем инструмент: «РАЗРАБОТЧИК»-«Код»-«Макросы».

РАЗРАБОТЧИК.

В появившемся диалоговом окне выделяем значение «ObedenitVertikal» и нажимаем на кнопку «Выполнить».

Выполнить.

Потом снова вручную выделите новый диапазон A5:D9 и повторно выполните тот же макрос. Ячейки будут выделены как показано ниже на рисунке:

Пример.

В начале кода определены 3 переменные: две из них выполняют функцию счетчика, а третья служит для временного хранения текстового содержания ячеек. Счетчик первой переменной в цикле проходит по очереди все столбцы выделенного диапазона ячеек. В каждом таком столбце в текстовую переменную записывается текст, который содержится в первой ячейке каждого выделенного столбца. Второй счетчик идет по строкам каждого столбца и дописывает в текстовую переменную текстовые значения из остальных ячеек каждого текущего столбца выделенного диапазона – сверху вниз. Тексты, взятые из отдельных ячеек разделяться символом обрыва строки.

Символ обрыва строки вставлен с помощью функции Chr(10). Каждый вводимый символ из клавиатуры имеет свой код ASCII. Если введем код 10 в качестве аргумента для функции Chr(), тогда она будет возвращать символ обрыва строки. Такой же код ASCII на клавиатуре вызывается клавишей Enter для обрыва строки во всех текстовых редакторах.

Потом остальной код макроса объединяет все ячейки столбцов в выделенном диапазоне, а потом заполняет их текстом из текстовой переменной. Чтобы не появлялось предупреждающее сообщение об объединении ячеек, в начале кода программы макроса отключаем отображение сообщений в Excel средствами программирования. Для этой цели используем свойство: Application.DisplayAlerts = Fale. После выполнения кода макроса изменяем значение свойства на True, чтобы в дальнейшем процессе работы с программой Excel все сообщения предупреждений (Alerts) имели возможность отображаться.

Внимание! Если ячейки выделенного диапазона будут содержать формулы, то после выполнения макроса эти формулы будут заменены на текст. В результате после объединения ячеек макросом, формулы могут быть утеряны.

Модернизация и настройка кода макроса для объединения ячеек

Если нам нужно изменить текст разделяющий отдельные строки символов содержащийся в целых ячейках, то можно вписать другой код символа, текст или несколько текстов соединенных символом амперсантом (&). Допустим мы хотим вставить между двумя символами разрыва строки текст, состоящий из пяти тире «——». Тогда данную строку следует модифицировать следующим образом:

intext = intext & Chr(10) & “——” & Chr(10) & Selection.Cells(j, i)

разбиение на строки.

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

закомментируем.

Если нам нужно чтобы выполнять макрос после выделения нескольких диапазонов (с удержанием клавиши CTRL), тогда можно добавить еще одну переменную, которая будет дополнять функцию счетчика:

Dim k As Long

Перед первым циклом добавим новую строку с кодом:

For k = 1 To Selection.Areas.Count

А после последнего цикла добавим строку конца нового цикла:

Next

Соответственно добавим новый отступ, чтобы код был более читабельным. Кроме того, после всех изменений для объекта Selection добавим ссылку на диапазон:

Selection.Areas(k)

Полная новая версия макроса для объедения ячеек выделенных нескольких диапазонов, выглядит так:

Sub ObedenitVertikal()
Dim i As Long
Dim j As Long
Dim k As Long
Dim intext As String
Application.DisplayAlerts = False
For k = 1 To Selection.Areas.Count
  For i = 1 To Selection.Areas(k).Columns.Count
    intext = Selection.Areas(k).Cells(1, i)
    For j = 2 To Selection.Areas(k).Rows.Count
     intext = intext & Chr(10) & Selection.Areas(k).Cells(j, i)
    Next
    Selection.Areas(k).Columns(i).Merge
    Selection.Areas(k).Cells(1, i) = intext
  Next
Next
Application.DisplayAlerts = True
End Sub

Тепер выделяем 2 диапазона подряд A2:D4, A5:D8, A с нажатой клавишей CTRL на клавиатуре:

2 диапазона подряд.

В результате получаем идентичный вид таблицы с объединенными ячейками:

Пример2.

Читайте также:

Как разъединить объединенные ячейки в Excel используя макрос.

Как объединить столбцы в Excel используя макрос.

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

Like this post? Please share to your friends:
  • Vba excel работа с числами
  • Vba excel свернуть группировку
  • Vba excel работа с формулами
  • Vba excel самоучитель книга
  • Vba excel работа с формами