Макрос для объединения ячеек в excel по условию

Склеивание текста по условию

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

Допустим, что у нас имеется база данных по клиентам, где одному названию компании может соответствовать несколько разных email’ов ее сотрудников. Наша задача состоит в том, чтобы собрать все адреса по названиям компаний и сцепить их (через запятую или точку с запятой), чтобы сделать потом, например, почтовую рассылку по клиентам, т.е. получить на выходе что-то похожее на:

склеивание (сцепка) текста по условию

Другими словами, нам нужен инструмент, который будет склеивать (сцеплять) текст по условию — аналог функции СУММЕСЛИ (SUMIF), но для текста.

Способ 0. Формулой

Не очень изящный, зато самый простой способ. Можно написать несложную формулу, которая будет проверять отличается ли компания в очередной строке от предыдущей.  Если не отличается, то приклеиваем через запятую очередной адрес. Если отличается, то «сбрасываем» накопленное, начиная заново:

Сцепка текста по условию формулой

Минусы такого подхода очевидны: из всех ячеек полученного дополнительного столбца нам нужны только последние по каждой компании (желтые). Если список большой, то чтобы их быстро отобрать придется добавить еще один столбец, использующий функцию ДЛСТР (LEN), проверяющий длину накопленных строк:

Отбор строк

Теперь можно отфильтровать единички и скопировать нужные склейки адресов для дальнейшего использования.

Способ 1. Макрофункция склейки по одному условию

Если исходный список не отсортирован по компаниям, то приведенная выше простая формула не работает, но можно легко выкрутиться с помощью небольшой пользовательской функции на VBA. Откройте редактор Visual Basic нажатием на сочетание клавиш Alt+F11 или с помощью кнопки Visual Basic на вкладке Разработчик (Developer). В открывшемся окне вставьте новый пустой модуль через меню Insert — Module и скопируйте туда текст нашей функции:

Function MergeIf(TextRange As Range, SearchRange As Range, Condition As String)
    Dim Delimeter As String, i As Long
    Delimeter = ", " 'символы-разделители (можно заменить на пробел или ; и т.д.)
    
    'если диапазоны проверки и склеивания не равны друг другу - выходим с ошибкой
    If SearchRange.Count <> TextRange.Count Then
        MergeIf = CVErr(xlErrRef)
        Exit Function
    End If
    
    'проходим по все ячейкам, проверяем условие и собираем текст в переменную OutText
    For i = 1 To SearchRange.Cells.Count
        If SearchRange.Cells(i) Like Condition Then OutText = OutText & TextRange.Cells(i) & Delimeter
    Next i
    
    'выводим результаты без последнего разделителя
    MergeIf = Left(OutText, Len(OutText) - Len(Delimeter))
End Function

Если теперь вернуться в Microsoft Excel, то в списке функций (кнопка fx в строке формул или вкладка Формулы — Вставить функцию) можно будет найти нашу функцию MergeIf в категории Определенные пользователем (User Defined). Аргументы у функции следующие:

функция сцепить если выполняется условие

Способ 2. Сцепить текст по неточному условию

Если заменить в 13-й строчке нашего макроса первый знак = на оператор приблизительного совпадения Like, то можно будет осуществлять склейку по неточному совпадению исходных данных с критерием отбора. Например, если название компании может быть записано в разных вариантах, то мы можем одной функцией проверить и собрать их все:

склейка по приблизительному условию

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

  • звездочка (*) — обозначает любое количество любых символов (в т.ч. и их отсутствие)
  • вопросительный знак (?) — обозначает один любой символ
  • решетка (#) — обозначает одну любую цифру (0-9)

По умолчанию оператор Like регистрочувствительный, т.е. понимает, например, «Орион» и «оРиОн» как разные компании. Чтобы не учитывать регистр можно добавить в самое начало модуля в редакторе Visual Basic строчку Option Compare Text, которая переключит Like в режим, когда он невосприимчив к регистру.

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

  • ?1##??777RUS — выборка по всем автомобильным номерам 777 региона, начинающимся с 1
  • ООО* — все компании, название которых начинается на ООО
  • ##7## — все товары с пятизначным цифровым кодом, где третья цифра 7
  • ????? — все названия из пяти букв и т.д.

Способ 3. Макрофункция склейки текста по двум условиям

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

Function MergeIfs(TextRange As Range, SearchRange1 As Range, Condition1 As String, SearchRange2 As Range, Condition2 As String)
    Dim Delimeter As String, i As Long
    Delimeter = ", " 'символы-разделители (можно заменить на пробел или ; и т.д.)
    
    'если диапазоны проверки и склеивания не равны друг другу - выходим с ошибкой
    If SearchRange1.Count <> TextRange.Count Or SearchRange2.Count <> TextRange.Count Then
        MergeIfs = CVErr(xlErrRef)
        Exit Function
    End If
    
    'проходим по все ячейкам, проверяем все условия и собираем текст в переменную OutText
    For i = 1 To SearchRange1.Cells.Count
        If SearchRange1.Cells(i) = Condition1 And SearchRange2.Cells(i) = Condition2 Then
            OutText = OutText & TextRange.Cells(i) & Delimeter
        End If
    Next i
    
    'выводим результаты без последнего разделителя
    MergeIfs = Left(OutText, Len(OutText) - Len(Delimeter))
End Function

Применяться она будет совершенно аналогично — только аргументов теперь нужно указывать больше:

склейка по нескольким условиям

Способ 4. Группировка и склейка в Power Query

Решить проблему можно и без программирования на VBA, если использовать бесплатную надстройку Power Query. Для Excel 2010-2013 ее можно скачать здесь, а в Excel 2016 она уже встроена по умолчанию. Последовательность действий будет следующей:

Power Query не умеет работать с обычными таблицами, поэтому первым шагом превратим нашу таблицу в «умную». Для этого ее нужно выделить и нажать сочетание Ctrl+T или выбрать на вкладке Главная — Форматировать как таблицу (Home — Format as Table). На появившейся затем вкладке Конструктор (Design) можно задать имя таблицы (я оставил стандартное Таблица1):

Умная таблица

Теперь загрузим нашу таблицу в надстройку Power Query. Для этого на вкладке Данные (если у вас Excel 2016) или на вкладке Power Query (если у вас Excel 2010-2013) жмем Из таблицы (Data — From Table):

Загрузка в Power Query

В открывшемся окне редактора запросов выделяем щелчком по заголовку столбец Компания и сверху жмем кнопку Группировать (Group By). Вводим имя нового столбца и тип операции в группировке — Все строки (All Rows):

Группировка в Power Query

Жмем ОК и получаем для каждой компании мини-таблицу сгруппированных значений. Содержимое таблиц хорошо видно, если щелкать левой кнопкой мыши в белый фон ячеек (не в текст!) в получившемся столбце:

Содержимое таблиц группировки

Теперь добавим еще один столбец, где с помощью функции склеим через запятую содержимое столбцов Адрес в каждой из мини-таблиц. Для этого на вкладке Добавить столбец жмем Пользовательский столбец (Add column — Custom column) и в появившемся окне вводим имя нового столбца и формулу сцепки на встроенном в Power Query языке М:

Пользовательский столбец с функцией склейки

Обратите внимание, что все М-функции регистрочувствительные (в отличие от Excel). После нажатия на ОК получаем новый столбец со склееными адресами:

Результат

Осталось удалить ненужный уже столбец ТаблАдресов (правой кнопкой мыши по заголовку — Удалить столбец) и выгрузить результаты на лист, нажав на вкладке Главная — Закрыть и загрузить (Home — Close and load):

Выгрузка результатов на лист

Важный нюанс: в отличие от предыдущих способов (функций), таблицы из Power Query не обновляются автоматически. Если в будущем произойдут какие-либо изменения в исходных данных, то нужно будет щелкнуть правой кнопкой в любое место таблицы результатов и выбрать команду Обновить (Refresh).

Ссылки по теме

  • Как разделить длинную текстовую строку на части
  • Несколько способов склеить текст из разных ячеек в одной
  • Использование оператора Like для проверки текста по маске

saachaaa, здравствуйте.

Прошу помощи в написании макроса.

Позвольте немного праведно поворчать и заметить, что есть большая разница между «помочь» и «сделать всё с нуля» :D

Во вложении справа от таблицы макрос на кнопке «Преобразовать». Нажимаем и радуемся :D

[vba]

Код

Sub Rio_Merge()
Application.ScreenUpdating = False: Application.DisplayAlerts = False
With ThisWorkbook.Sheets(1)

‘Made by Roman «Rioran» Voronov
‘For www.excelworld.ru user
‘Any help: voronov_rv@mail.ru

Dim X As Long: X = 7 ‘Row runner
Dim Y As Long: Y = 6 ‘Low bound for merging
Dim Z As Long: Z = 0 ‘For merging small columns
Dim EndX As Long: EndX = .Cells(Rows.Count, 1).End(xlUp).Row ‘To know our limits

Do While X < EndX + 2
     If .Cells(X, 1).Value <> .Cells(X — 1, 1).Value Then
         .Range(«A» & Y & «:A» & X — 1).Merge
         .Rows(X).Insert Shift:=xlDown
         .Range(«A» & X & «:B» & X).Merge
         .Range(«C» & X & «:L» & X).Value = «X»
         .Range(«A» & X & «:B» & X).Value = «Итого за » & .Cells(Y, 1).Value
         EndX = EndX + 1: X = X + 1: Y = X
     End If
     X = X + 1
Loop

X = 7: Y = 6

Do While X < EndX + 2
     If .Cells(X, 3).Value = .Cells(X — 1, 3).Value Then
         Z = Z + 1
     Else
         If Z > 0 Then
             .Range(«B» & X — 1 — Z & «:B» & X — 1).Merge
             .Range(«C» & X — 1 — Z & «:C» & X — 1).Merge
             .Range(«M» & X — 1 — Z & «:M» & X — 1).Merge
             .Cells(X — 1 — Z, 13).Value = Application.Sum(Range(«L» & X — 1 — Z & «:L» & X — 1).Value)
             Z = 0
         ElseIf Z = 0 Then
             If .Cells(X — 1, 12).Value = «X» Then
                 .Cells(X — 1, 13).Value = Application.Sum(Range(«M» & Y & «:M» & X — 1).Value)
                 Y = X
             Else
                 .Cells(X — 1, 13).Value = .Cells(X — 1, 12).Value
             End If
         End If
     End If
     X = X + 1
Loop

.Range(«A4:N» & EndX).Borders.LineStyle = xlContinuous
.Range(«A4:N» & EndX).Borders.Weight = xlThin
.Range(«A4:N» & EndX).HorizontalAlignment = xlCenter
.Range(«A4:N» & EndX).VerticalAlignment = xlCenter

End With
Application.DisplayAlerts = True: Application.ScreenUpdating = True
End Sub

[/vba]

Макрос объединения ячеек по условию

Автор Vittel, 01.07.2015, 12:02

« назад — далее »

День добрый!
Получил задание :
Если № повторяется несколько раз, то разные адреса с данным номером прописываются в 1 ячейку через ;
К примеру как видим на скрине, номер 2609 повторяется 3 раза, значит макрос должен отработать так : 1 ячейка = 2609, а рядом с ней ячейка Каширское шоссе 78 к.2;Каширское шоссе 78 к.3;Каширское шоссе 78 к.4
И так на все 30000 строк, повторение № встречается до 40 раз.

Помогите пожалуйста  :)



Добавил файл с примером, всего строк около 31к


Sub uuu()
Dim a(), LR#, i#, sd As Object
LR = Cells(Rows.Count, 1).End(xlUp).Row 'определяем последнюю заполненную ячейку по первому столбцу
a = Range("A3:B" & LR).Value 'заносим данные с листа в массив
Set sd = CreateObject("Scripting.Dictionary") ' объявляем словарь.
   For i = 1 To UBound(a) ' цикл по массиву
     If sd.Exists(a(i, 1)) Then ' если ключ в словаре есть то
       sd.Item(a(i, 1)) = sd.Item(a(i, 1)) & "; " & a(i, 2) ' к значению существующего ключа дописываем новое значение
     Else ' иначе
       sd.Item(a(i, 1)) = a(i, 2) ' создаем ключ с именем из первого столбца массива и значением из второго столбца массива
     End If
   Next
   Cells(3, 4).Resize(sd.Count) = Application.Transpose(sd.Keys) ' записываем имена ключей в 4 столбец
   Cells(3, 5).Resize(sd.Count) = Application.Transpose(sd.Items) ' записываем значения соответствующие ключам в 5 столбец
End Sub

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


Спасибо, но этот код выводит только уникальный №, а вот адреса выводить не хочет, ругается.


Цитата: Vittel от 02.07.2015, 10:26
не хочет, ругается.

что пишет то. подозреваю что в вашем файле в 5 столбце есть что то мешающее вставке.
в примере соорудил 31тыщ. строк макрос сработал без проблем.


  • Профессиональные приемы работы в Microsoft Excel

  • Обмен опытом

  • Microsoft Excel

  • Макрос объединения ячеек по условию

0 / 0 / 0

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

Сообщений: 7

1

Excel

Объединение ячеек с условием

31.10.2018, 10:26. Показов 4093. Ответов 4


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

Доброй день, не особо вникал в VBA, но на работе пригодилось, нужно сделать проверку на одинаковые записи в столбце Гос.№, напротив него надо сделать объединение ячеек и в объеденные ячейки нужно вставить сумму из столбца разница(л), заранее спасибо.



0



1813 / 1135 / 346

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

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

31.10.2018, 13:26

2

Цитата
Сообщение от Liklok86
Посмотреть сообщение

не особо вникал в VBA

А вы попробуйте чуть глубже вникнуть или вы рассчитываете, что вашу работу будут делать другие?



0



0 / 0 / 0

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

Сообщений: 7

01.11.2018, 06:39

 [ТС]

3

Может хоть знаете литературу или сайт, который поможет в моей проблеме? А то ничего не могу найти.



0



1813 / 1135 / 346

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

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

01.11.2018, 09:39

4

Liklok86, а просто прочитать про некоторые операторы вба (циклы, операции и т.д.) — не надо всё сразу и при помощи рекодера (Запись макроса на вкладке РАЗРАБОТЧИК) проделать ручками все действия в вашей задаче и после ОСТАНОВИТЬ ЗАПИСЬ посмотреть макрос, который создаст эксель. А в точности найти вашу, довольно простую проблему, не удастся. Надо маленько знать язык, чтобы из подобных задач вытаскивать, что нужно, а лучше делать самому. Думаю, строк в 30-49 кода можно уложиться



0



Остап Бонд

Заблокирован

01.11.2018, 10:31

5

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

Решение

Цитата
Сообщение от Burk
Посмотреть сообщение

Думаю, строк в 30-49 кода можно уложиться

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Sub main()
For r = 2 To 1000000
  If Cells(r, "B") <> s Then
    If Not IsEmpty(s) Then
      Range(Cells(r0, "L"), Cells(r - 1, "L")).MergeCells = True
      Cells(r0, "L") = Application.WorksheetFunction.Sum(Range(Cells(r0, "j"), Cells(r - 1, "j")))
    End If
    s = Cells(r, "B")
    r0 = r
    If s = "" Then Exit For
  End If
Next r
End Sub

11-13 строк — что я сделал не так?



0



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

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

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

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

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

Макросы объединения ячеек в EXEL.

Иногда бывает необходимо провести объединение ячеек в EXEL.
Стандартно и просто EXEL этого делать не умеет.
Нужно писать макросы.
Вот два из них.

1) Данный макрос объединяет данные из выделенных ячеек в одну.

Sub MergeToOneCell()
    Const sDELIM As String = » » ‘символ-разделитель
    Dim rCell As Range
    Dim sMergeStr As String
    If TypeName(Selection) <> «Range» Then Exit Sub ‘если выделены не ячейки — выходим
    With Selection
        For Each rCell In .Cells
            sMergeStr = sMergeStr & sDELIM & rCell.Text  ‘собираем текст из ячеек
        Next rCell
        Application.DisplayAlerts = False   ‘отключаем стандартное предупреждение о потере текста
        .Merge Across:=False                ‘объединяем ячейки
        Application.DisplayAlerts = True
        .Item(1).Value = Mid(sMergeStr, 1 + Len(sDELIM))    ‘добавляем к объед.ячейке суммарный текст
    End With
End Su

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

Sub Merge_Cells()
tStr = «»
cs = Selection.Item(1).Column
cf = Selection.Item(Selection.Count).Column
   For Each Cell In Selection.Cells
       tStr = tStr & » » & Cell
       If cf = Cell.Column Then
           Application.DisplayAlerts = False
           Range(Cells(Cell.Row, cs), Cells(Cell.Row, cf)).MergeCells = True
           Application.DisplayAlerts = True
           Cells(Cell.Row, cs) = Mid(tStr, 2)
           tStr = «»
       End If
   Next Cell
End Sub


Как пользоваться макросами в EXEL? А вот так:
Открываем редактор Visual Basic  через меню Сервис — Макрос — Редактор Visual Basic (Tools — Macro — Visual Basic Editor) или сочетанием клавиш ALT+F11, вставим в нашу книгу новый программный модуль (меню Insert — Module) и скопируем туда текст такого простого макроса.
Теперь, если выделить несколько ячеек и запустить этот макрос с помощью сочетания клавиш ALT+F8 или в меню Сервис — Макрос — Макросы (Tools — Macro — Macros), то Excel объединит выделенные ячейки в одну, слив туда же и текст через пробелы.
Также стоит отметить, что каждому макросу можно назначить «быстрые клавиши».
А еще, если решили сохранить EXEL-евскую таблицу с макросами, не забудьте сохранить ее в формате, поддерживающем эти самые макросы.

На этом пока все. Спасибо.

Популярные сообщения из этого блога

Как увидеть список выданных адресов в DHCP на Debian или CentOS.

В Debian: Информация о выданных адресах хранится в: dhcpd.leases внутри каталога /var/lib/dhcp/dhcpd.leases Открываем файл с помощью «cat» и смотрим, кто что получил. В CentOS: cd /var/lib/dhcpd cat dhcpd.leases OR TO EDIT nano dhcpd.leases

Получение доступа к серверу SQL при отсутствии пароля администратора SQL.

Изображение

Столкнулся я тут с проблемой: после смены пароля от учетной записи, из под которой работал сервер централизованного управления «Kaspersky Security Center 10», данная служба перестала работать. Подменили учётную запись, из под которой запускается служба приложения — безрезультатно. В итоге выяснили, что проблема уходят корнями в «Microsoft SQL Server», доступ к которому также осуществлялся из под этой УЗ. Чтобы сменить УЗ, из под которой «Kaspersky Security Center 10» «ломится» к базе данных, нужны административные права от «Microsoft SQL Server», которых ни у локального администратора ни у доменных администраторов не оказалось. ВНИМАНИЕ: ВСЕ КОМАНДЫ НУЖНО ЗАПУСКАТЬ ИЗ ПОД «CMD» или «Poweshell», которые в свою очередь запущены с повышением прав!!! (Правой кнопкой мыши на запускаемом приложении и далее, ЗАПУСТИТЬ ОТ АДМИНИСТРАТОРА). В итоге, пришлось запускать базу данных в специальном режиме: 1) Останавливаем э

Здравствуйте.

В первом столбце excel значения, во втором соответствующие им, но в разных строках:
96f16ab77e934baca5af511debb9196e.PNG

Нужно объединить все «a» в ячейку напротив 1, все b напротив 2 и т.д, причем с сохранением переноса строк:
1464c505a48d4646abb611fc7c2e9e28.PNG

Записей, естественно, тысячи.
Подскажите, пожалуйста, как это сделать?


  • Вопрос задан

    более трёх лет назад

  • 1098 просмотров

Накидал без особых красивостей :)

Из минусов:
— между значениями после обработки остаются пустые строки, равные количеству элементов — 1 во втором столбце (соответственно конкатенированные значения); пустые строки в экселе подчистить не должно быть проблемой;
— начальная инициализация завязана на расположение элементов.

Не забудьте расширить диапазон Range() для цикла.

Sub concat()
    txt = Range("B1").Text
    Range("A1").Select
    Set hCell = ActiveCell
    For Each cell In Range("A1:A20")
        If cell.Value <> "" Or cell.Offset(0, 1).Value = "" Then
            hCell.Offset(0, 1).Value = txt
            cell.Select
            Set hCell = ActiveCell
            txt = ""
        End If
        
        If cell.Offset(0, 1).Value = "" Then
            Exit Sub
        End If
        
        txt = txt + vbCrLf + cell.Offset(0, 1).Text
        ' Очистка ячейки
        cell.Offset(0, 1).Value = ""
    Next
End Sub

Пригласить эксперта


  • Показать ещё
    Загружается…

16 апр. 2023, в 09:40

10000 руб./за проект

16 апр. 2023, в 08:25

20000 руб./за проект

16 апр. 2023, в 06:36

1000 руб./за проект

Минуточку внимания

Понравилась статья? Поделить с друзьями:
  • Макрос для объединения таблиц excel
  • Макрос для объединения одинаковых ячеек в таблице excel
  • Макрос для объединения нескольких файлов excel в один файл
  • Макрос для объединения листов в excel в один лист
  • Макрос для объединения книг excel