Объединить одинаковые ячейки в excel vba

В данном примере напишем код макроса, который сможет автоматически найти и объединить все одинаковые ячейки в таблице Excel любой сложности.

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

Имеется отчет продаж в сети магазинов по целой стране. Нам нужно сделать таблицу данного отчета более читабельной. Для этого следует красиво сформатировать первый столбец, в котором содержаться названия штатов:

Исходная таблица магазинов.

Мы хотим объединить все ячейки с одинаковыми значениями в столбце «Штат» (A). Это можно реализовать с помощью ручного выделения отдельных групп одинаковых значений и объединения их ячеек, воспользовавшись инструментом: «ГЛАВНАЯ»-«Выравнивание»-«Объединить и поместить в центре». Но если таблица содержит тысячи таких групп, да еще с разным количеством повторяющихся ячеек, тогда рационально написать макрос. Он сам быстро и автоматически выполнит всю работу за Вас.

Откройте редактор Visual Basic (ALT+F11):

Откройте редактор.

И создайте новый модуль с помощью инструмента: «Insert»-«Module». А потом запишите в него VBA-код макроса:

Sub JoinDoubles()
Dim i As Long
Application.DisplayAlerts = False
For i = Selection.Rows.Count To 2 Step -1
  If Selection.Cells(i, 1) = Selection.Cells(i - 1, 1) Then
  Range(Selection.Cells(i - 1, 1), Selection.Cells(i, 1)).Merge
  End If
Next
Selection.VerticalAlignment = xlVAlignCenter
Application.DisplayAlerts = True
End Sub

Код в модуле.

Теперь если нам необходимо объединить ячейки с одинаковыми значениями, то выделите диапазон A1:A18 и запустите макрос выбрав инструмент: «РАЗРАБОТЧИК»-«Код»-«Макросы»-«JoinDoubles»-«Выполнить». Результат действия макроса отображен на рисунке:

Пример.

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

Дополнительно в начале кода макроса устанавливаем свойство «False» для объекта «DisplayAlerts», чтобы предотвратить появления предупреждающего сообщение о попытке объединить непустые ячейки в программе Excel. В конце выполнения кода макроса обратно возвращаем свойство «True» для объекта «DisplayAlerts».

Обратите внимание! Если перед выполнением макроса выделить более одного столбца, то в результате будут объединены одинаковые значения только в первом столбце. Чтобы расширить поле действия макроса следует немного изменить его код.



Как объединить все одинаковые ячейки в любой таблице

Немного изменим структуру исходной таблицы:

Новая структура исходной таблицы.

На этот раз нам необходимо объединить все ячейки с одинаковыми значениями в столбце «Штат» (B) в столбце «№» (A).

Если мы хотим, чтобы действия макроса распространялось на несколько выделенных столбцов, то делаем следующее. Сначала добавим новую переменную:

Dim j As Long

Далее добавим строку с кодом начала нового цикла, который будет проходить по другим столбцам выделенного диапазона:

For j = 1 To Selection.Columns.Count

После конца, ранее созданного (внутреннего) цикла добавляем инструкцию Next для конца нового (внешнего) цикла . И соответственно сделаем код более читабельным с помощью отступов табуляции. Кроме того, для всех экземпляров объекта Cells во втором аргументе, вместо числа 1 введем переменную j (например, Selection.Cells(i, j)). Новая версия измененного кода макроса выглядит следующим образом:

Sub JoinDoubles()
Dim i As Long
Dim j As Long
Application.DisplayAlerts = False
For j = 1 To Selection.Columns.Count
  For i = Selection.Rows.Count To 2 Step -1
    If Selection.Cells(i - 1, j) = Selection.Cells(i, j) Then
    Range(Selection.Cells(i - 1, j), Selection.Cells(i, j)).Merge
    End If
  Next
Next
Selection.VerticalAlignment = xlVAlignCenter
Application.DisplayAlerts = True
End Sub

Чтобы увидеть результат действия новой версии кода, выделяем всю таблицу и запускаем макрос:

Объеденены все одинаковы ячейки.

Читайте также: как объединить одинаковые ячейки в строках таблицы.

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

уважаемые!вечер добрый!

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

Например, есть 2 столбца
Значения в столбце 1 марка машины:
    А
1 Ауди
2 БМВ
3 Лексус
4 Тойота
5 Митсубиси
6 Ауди

Значения в столбце 2 — модель марки машины
   А                      В
1 Ауди               Q7
2 БМВ                x5
3 Лексус            RC
4 Тойота            Corolla
5 Митсубиси     Outlander
6 Ауди                TT

нужен макрос, чтобы при поиске одинаковых значений, он объединял в данном случае две строки (1 и 6) и по столбцу В формировались напротив этого значения две строки (1 — Q7, 2 — ТТ)

Вот так:
   А                      В
1 Ауди               Q7
                         TT
2 БМВ                x5
3 Лексус            RC
4 Тойота            Corolla
5 Митсубиси     Outlander

спасибо за помощь!!

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

док объединить одинаковые ячейки 1


Объединить соседние строки с одинаковыми данными с кодом VBA

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

1. Удерживайте ALT + F11 ключи, и он открывает Microsoft Visual Basic для приложений окно.

2. Нажмите Вставить > Модули, и вставьте следующий макрос в Модулиокно.

Sub MergeSameCell()
'Updateby Extendoffice
Dim Rng As Range, xCell As Range
Dim xRows As Integer
xTitleId = "KutoolsforExcel"
Set WorkRng = Application.Selection
Set WorkRng = Application.InputBox("Range", xTitleId, WorkRng.Address, Type:=8)
Application.ScreenUpdating = False
Application.DisplayAlerts = False
xRows = WorkRng.Rows.Count
For Each Rng In WorkRng.Columns
    For i = 1 To xRows - 1
        For j = i + 1 To xRows
            If Rng.Cells(i, 1).Value <> Rng.Cells(j, 1).Value Then
                Exit For
            End If
        Next
        WorkRng.Parent.Range(Rng.Cells(i, 1), Rng.Cells(j - 1, 1)).Merge
        i = j - 1
    Next
Next
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub

3, Затем нажмите F5 нажмите клавишу для запуска этого кода, на экране отобразится диалоговое окно для выбора диапазона для работы. Смотрите скриншот:

док объединить одинаковые ячейки 2

4. Затем нажмите OK, одни и те же данные в столбце A будут объединены. Смотрите скриншот:

док объединить одинаковые ячейки 1


Объединить соседние строки одних и тех же данных с Kutools for Excel

Для Объединить одинаковые ячейки полезности Kutools for Excel, вы можете быстро объединить одни и те же значения в нескольких столбцах одним щелчком мыши.

После установки Kutools for Excel, вы можете сделать следующее:

1. Выберите столбцы, в которых вы хотите объединить соседние строки с одинаковыми данными.

2. Нажмите Кутулс > Слияние и разделение > Объединить одинаковые ячейки, см. снимок экрана:

3. А затем те же данные в выбранных столбцах были объединены в одну ячейку. Смотрите скриншот:

док объединить одинаковые ячейки 4

Нажмите, чтобы скачать Kutools for Excel и бесплатная пробная версия прямо сейчас!

Чтобы узнать больше об этом, посетите этот Объединить одинаковые ячейки функцию.


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


Лучшие инструменты для работы в офисе

Kutools for Excel Решит большинство ваших проблем и повысит вашу производительность на 80%

  • Снова использовать: Быстро вставить сложные формулы, диаграммы и все, что вы использовали раньше; Зашифровать ячейки с паролем; Создать список рассылки и отправлять электронные письма …
  • Бар Супер Формулы (легко редактировать несколько строк текста и формул); Макет для чтения (легко читать и редактировать большое количество ячеек); Вставить в отфильтрованный диапазон
  • Объединить ячейки / строки / столбцы без потери данных; Разделить содержимое ячеек; Объединить повторяющиеся строки / столбцы… Предотвращение дублирования ячеек; Сравнить диапазоны
  • Выберите Дубликат или Уникальный Ряды; Выбрать пустые строки (все ячейки пустые); Супер находка и нечеткая находка во многих рабочих тетрадях; Случайный выбор …
  • Точная копия Несколько ячеек без изменения ссылки на формулу; Автоматическое создание ссылок на несколько листов; Вставить пули, Флажки и многое другое …
  • Извлечь текст, Добавить текст, Удалить по позиции, Удалить пробел; Создание и печать промежуточных итогов по страницам; Преобразование содержимого ячеек в комментарии
  • Суперфильтр (сохранять и применять схемы фильтров к другим листам); Расширенная сортировка по месяцам / неделям / дням, периодичности и др .; Специальный фильтр жирным, курсивом …
  • Комбинируйте книги и рабочие листы; Объединить таблицы на основе ключевых столбцов; Разделить данные на несколько листов; Пакетное преобразование xls, xlsx и PDF
  • Более 300 мощных функций. Поддерживает Office/Excel 2007-2021 и 365. Поддерживает все языки. Простое развертывание на вашем предприятии или в организации. Полнофункциональная 30-дневная бесплатная пробная версия. 60-дневная гарантия возврата денег.

вкладка kte 201905


Вкладка Office: интерфейс с вкладками в Office и упрощение работы

  • Включение редактирования и чтения с вкладками в Word, Excel, PowerPoint, Издатель, доступ, Visio и проект.
  • Открывайте и создавайте несколько документов на новых вкладках одного окна, а не в новых окнах.
  • Повышает вашу продуктивность на 50% и сокращает количество щелчков мышью на сотни каждый день!

офисный дно

Комментарии (43)


Оценок пока нет. Оцените первым!

0 / 0 / 0

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

Сообщений: 5

1

Объединение ячеек с одинаковым значением с учётом первого столбца

05.08.2018, 16:24. Показов 6479. Ответов 7


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

Добрый день

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

Для понятности прикрепил пример.

Нашёл макрос объединения ячеек , но он объединяет всё без разбора и не учитывает первый столбец.

Если есть такой макрос , поделитесь пожалуйста , не могу найти нигде.



0



Казанский

15136 / 6410 / 1730

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

Сообщений: 9,999

05.08.2018, 17:26

2

Лучший ответ Сообщение было отмечено spirit333 как решение

Решение

spirit333,

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Sub Sp()
Dim c As Range, n&, m&
  On Error Resume Next
  Application.DisplayAlerts = False
  For Each c In Columns(1).SpecialCells(xlCellTypeConstants)
    If Not IsEmpty(c.Value) Then
      n = c.MergeArea.Rows.Count
      If n > 1 Then
        For m = 1 To 4
          c.Offset(, m).Resize(n).Merge
        Next
      End If
    End If
  Next
  Application.DisplayAlerts = True
End Sub



1



spirit333

0 / 0 / 0

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

Сообщений: 5

05.08.2018, 22:41

 [ТС]

3

Большое Спасибо , именно то что нужно!

Добавлено через 1 минуту
Казанский , спасибо за помощь работает как нужно , но есть еще просьба , можно ли подредактировать макрос , что бы он объединял не только 2-5 столбцы , но еще и выборочные столбцы?
У самого никак не получается…

Visual Basic
1
2
3
4
n = c.MergeArea.Rows.Count
If n > 1 Then
For m = 1 To 4
c.Offset(, m).Resize(n).Merge

Понял , что в этом месте можно написать 5 , 6 , 7 и т.д. но эти столбцы объединять не нужно , нужно объединить еще 13 и 14 столбец, учитывая так же значения в первом столбце.



0



Казанский

15136 / 6410 / 1730

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

Сообщений: 9,999

06.08.2018, 08:04

4

spirit333,

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Sub Sp()
Dim c As Range, n&, m
  On Error Resume Next
  Application.DisplayAlerts = False
  For Each c In Columns(1).SpecialCells(xlCellTypeConstants)
    If Not IsEmpty(c.Value) Then
      n = c.MergeArea.Rows.Count
      If n > 1 Then
        For Each m In Array(1, 2, 3, 4, 12, 13) 'смещение отн. 1 столбца
          c.Offset(, m).Resize(n).Merge
        Next
      End If
    End If
  Next
  Application.DisplayAlerts = True
End Sub



0



0 / 0 / 0

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

Сообщений: 5

06.08.2018, 09:40

 [ТС]

5

Еще раз огромное Спасибо Вам! Очень помогли!



0



0 / 0 / 0

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

Сообщений: 5

07.08.2018, 01:07

 [ТС]

6

Казанский , ужасно неудобно обращаться к вам и в третий раз , но макрос опять не совсем такой какой нужен.

Простите , моя вина , не сказал сразу конкретно что нужно… Всё приходит опытным путем , когда несколько раз попробуешь.

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



0



0 / 0 / 0

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

Сообщений: 5

07.08.2018, 01:14

 [ТС]

7

Забыл выложить пример. Надеюсь понятно.



0



0 / 0 / 0

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

Сообщений: 3

02.03.2020, 15:08

8

Добрый день. Почти такая-же задача. Данный код не работает выдает ошибку run-time error ’13’ type mismatch.



0



Option Explicit
Option Base 1
'123456789012345678901234567890123456h8nor@ya567890123456789012345678toster56789

Sub Merge_by_Rows() ' Без форматирования границ
  Dim i As Integer, j As Integer, cnt As Integer
  Dim arr() As Variant, s As String
  
  With ActiveSheet.UsedRange ' Кол-во столбцов определяется по 1-й строке
    arr = Range(Cells(1, 1), Cells(.Rows.Count + 1, Range("A1").End(xlToRight).Column))
  End With
  
  cnt = 1: s = get_Row(arr, cnt)
  For i = LBound(arr, 1) + 1 To UBound(arr, 1)
    If get_Row(arr, i) <> s Then
      For j = LBound(arr, 2) To UBound(arr, 2)
        With ActiveSheet.Range(Cells(cnt, j), Cells(i - 1, j)).Offset(, UBound(arr, 2))
          .Merge
          .HorizontalAlignment = xlCenter
          .VerticalAlignment = xlCenter
          .Value = arr(cnt, j)
        End With
      Next j
      cnt = i: s = get_Row(arr, cnt)
    End If
  Next i
End Sub

Function get_Row(ByVal arr As Variant, ByVal num_Row As Integer) As String
  Dim j As Integer
  
  For j = LBound(arr, 2) To UBound(arr, 2)
    get_Row = WorksheetFunction.Trim(get_Row & " " & arr(num_Row, j))
  Next j
End Function

Процедуру выполнять на активном листе.

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