В данном примере напишем код макроса, который сможет автоматически найти и объединить все одинаковые ячейки в таблице 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
спасибо за помощь!!
Предположим, у вас есть рабочий лист с одинаковыми данными в соседних строках, и теперь вы хотите объединить те же ячейки в одну, чтобы данные выглядели аккуратно и красиво. Как быстро и удобно объединить соседние строки с одинаковыми данными? Сегодня я познакомлю вас с быстрым способом решения этой проблемы.
Объединить соседние строки с одинаковыми данными с кодом 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 нажмите клавишу для запуска этого кода, на экране отобразится диалоговое окно для выбора диапазона для работы. Смотрите скриншот:
4. Затем нажмите OK, одни и те же данные в столбце A будут объединены. Смотрите скриншот:
Объединить соседние строки одних и тех же данных с Kutools for Excel
Для Объединить одинаковые ячейки полезности Kutools for Excel, вы можете быстро объединить одни и те же значения в нескольких столбцах одним щелчком мыши.
После установки Kutools for Excel, вы можете сделать следующее:
1. Выберите столбцы, в которых вы хотите объединить соседние строки с одинаковыми данными.
2. Нажмите Кутулс > Слияние и разделение > Объединить одинаковые ячейки, см. снимок экрана:
3. А затем те же данные в выбранных столбцах были объединены в одну ячейку. Смотрите скриншот:
Нажмите, чтобы скачать Kutools for Excel и бесплатная пробная версия прямо сейчас!
Чтобы узнать больше об этом, посетите этот Объединить одинаковые ячейки функцию.
Демонстрация: объедините одинаковые ячейки в одну или разделите их, чтобы заполнить повторяющиеся значения:
Лучшие инструменты для работы в офисе
Kutools for Excel Решит большинство ваших проблем и повысит вашу производительность на 80%
- Снова использовать: Быстро вставить сложные формулы, диаграммы и все, что вы использовали раньше; Зашифровать ячейки с паролем; Создать список рассылки и отправлять электронные письма …
- Бар Супер Формулы (легко редактировать несколько строк текста и формул); Макет для чтения (легко читать и редактировать большое количество ячеек); Вставить в отфильтрованный диапазон…
- Объединить ячейки / строки / столбцы без потери данных; Разделить содержимое ячеек; Объединить повторяющиеся строки / столбцы… Предотвращение дублирования ячеек; Сравнить диапазоны…
- Выберите Дубликат или Уникальный Ряды; Выбрать пустые строки (все ячейки пустые); Супер находка и нечеткая находка во многих рабочих тетрадях; Случайный выбор …
- Точная копия Несколько ячеек без изменения ссылки на формулу; Автоматическое создание ссылок на несколько листов; Вставить пули, Флажки и многое другое …
- Извлечь текст, Добавить текст, Удалить по позиции, Удалить пробел; Создание и печать промежуточных итогов по страницам; Преобразование содержимого ячеек в комментарии…
- Суперфильтр (сохранять и применять схемы фильтров к другим листам); Расширенная сортировка по месяцам / неделям / дням, периодичности и др .; Специальный фильтр жирным, курсивом …
- Комбинируйте книги и рабочие листы; Объединить таблицы на основе ключевых столбцов; Разделить данные на несколько листов; Пакетное преобразование xls, xlsx и PDF…
- Более 300 мощных функций. Поддерживает Office/Excel 2007-2021 и 365. Поддерживает все языки. Простое развертывание на вашем предприятии или в организации. Полнофункциональная 30-дневная бесплатная пробная версия. 60-дневная гарантия возврата денег.
Вкладка 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,
1 |
spirit333 0 / 0 / 0 Регистрация: 05.08.2018 Сообщений: 5 |
||||
05.08.2018, 22:41 [ТС] |
3 |
|||
Большое Спасибо , именно то что нужно! Добавлено через 1 минуту
Понял , что в этом месте можно написать 5 , 6 , 7 и т.д. но эти столбцы объединять не нужно , нужно объединить еще 13 и 14 столбец, учитывая так же значения в первом столбце.
0 |
Казанский 15136 / 6410 / 1730 Регистрация: 24.09.2011 Сообщений: 9,999 |
||||
06.08.2018, 08:04 |
4 |
|||
spirit333,
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
Процедуру выполнять на активном листе.