Многократное объединение отдельных групп ячеек в столбцах вручную – требует много времени и сил. Поэтому рационально будет воспользоваться макросом, который автоматически выполнит всю эту, плюс еще и дополнительную работу.
Как объединить 2 и несколько столбцов в таблице Excel
Допустим, что мы имеем таблицу содержащую данные оп договорам и выставленных на их основе счетов. Данные по договорам находиться в столбцах D, E и F, но некоторые фактуры взяты с других подчиненных документов, а не из договора. Для таких случаев в столбце D указывается номер договора или описание подчиненного документа для каждой фактуры.
Нам необходимо объединить ячейки в этих трех столбцах (D, E и F) таким образом, чтобы для каждой строки где нет договоров была одна объединенная ячейка.
Откроем редактор Visual Basic (ALT+F11):
И вставим новый стандартный модуль используя инструмент в редакторе: «Insert»-«Module». А после чего запишем в модуль VBA код макроса для объединения ячеек столбцов по горизонтали:
Sub ObedinitGorizontal()
Dim i As Long
Dim j As Long
Dim savetext As String
Application.DisplayAlerts = False
For i = 1 To Selection.Rows.Count
savetext = Selection.Cells(i, 1)
For j = 2 To Selection.Columns.Count
savetext = savetext & Chr(32) & Selection.Cells(i, j)
Next
Selection.Rows(i).Merge
Selection.Cells(i, 1) = savetext
Selection.Cells(i, 1).HorizontalAlignment = xlHAlignCenter
Next
Application.DisplayAlerts = True
End Sub
В первом цикле данного кода выполняется прогон по отдельных строках выделенного диапазона, а во втором объединяться значения столбцов в Excel. Тексты между собой разделяться символом пробела, его код в таблице символом ASCII имеет номер 32.
В конце выполнения первого цикла VBA кода мы изменяем свойство HorizontalAlignment для объединенной ячейки, что позволяет выровнять текст по центру с помощью макроса.
Если мы хотим объединить ячейки в строках содержащих информацию о выставленных счетах без подчиненных договоров, выделяем диапазон ячеек D5:F7 и запускаем наш макрос: «РАЗРАБОТЧИК»-«Код»-«Макросы». В появившемся диалоговом окне выбираем имя нашего макроса «ObedinitGorizontal» и нажимаем на кнопку «Выполнить». А далее снова выделяем диапазон ячеек D9:F11 и вновь запускаем макрос «ObedinitGorizontal». В результате ячейки будут объединены как показано ниже на рисунке:
Внимание! Если объединяемые ячейки будут содержать формулы, то они могут быть утеряны так как в процессе объединения формулы преобразуются в интерпретированный текст.
Модификация и настройка кода макроса
Если мы хотим разделять тексты не пробелом, а вертикальной линией, тогда нужно просто изменить ASCII код в аргументе функции Chr() на 124:
savetext = savetext & Chr(124) & Selection.Cells(i, j)
Если в объединенных ячейках мы хотим вставлять только тексты из первого столбца (D), без текстов, записанных в остальных двух столбцах E и F тогда удалите или закомментируйте переменную j и код второго цикла:
Как объединить ячейки по столбцам в Excel
Если мы хотим выполнить макрос одновременно и сразу для нескольких выделенных диапазонов ячеек (с помощью удержания клавиши CTRL на клавиатуре), добавим еще одну переменную:
Dim k As Long
Перед первым циклом добавим строку для начала нового цикла прохода по всех выделенных диапазонах:
For k = 1 To Selection.Areas.Count
В конце первого цикла не забудьте добавить конце для нового цикла:
Next
Кроме этого для всех элементов объекта Selection следует добавить ссылку на диапазон: Selection.Areas(k). Полная версия VBA кода модифицированного макроса выглядит следующим образом:
Sub ObedinitGorizontal()
Dim i As Long
Dim j As Long
Dim k As Long
Dim savetext As String
Application.DisplayAlerts = False
For k = 1 To Selection.Areas.Count
For i = 1 To Selection.Areas(k).Rows.Count
savetext = Selection.Areas(k).Cells(i, 1)
For j = 2 To Selection.Areas(k).Columns.Count
savetext = savetext & Chr(32) & Selection.Areas(k).Cells(i, j)
Next
Selection.Areas(k).Rows(i).Merge
Selection.Areas(k).Cells(i, 1) = savetext
Selection.Areas(k).Cells(i, 1).HorizontalAlignment = xlHAlignCenter
Next
Next
Application.DisplayAlerts = True
End Sub
Читайте также: Как разъединить объединенные ячейки в Excel используя макрос.
Если хотите узнать как объединить строки в Excel, читайте статью: макрос для объединения строк в таблице.
Если бы мы не изменили код, то даже при многократном выделении диапазонов с нажатой клавишей CTRL все строки объединились бы в одну ячейку, что не есть хорошо.
Andronomus Пользователь Сообщений: 15 |
Подскажите, |
Sanja Пользователь Сообщений: 14838 |
Ну вот опять. Что значит «объединить»? И почему с «помощью макроса»? Может достаточно СЦЕПИТЬ() или & ? Покажите в файле желаемый результат Согласие есть продукт при полном непротивлении сторон. |
Andronomus Пользователь Сообщений: 15 |
Вот так должно получиться. Файл прикрепил. |
_Igor_61 Пользователь Сообщений: 3007 |
Здравствуйте! Если формулами, то примерно так (два синих столбца сцеплены в зеленом) — тема здесь |
Kuzmich Пользователь Сообщений: 7998 |
#5 08.01.2017 23:14:44 Макросом
|
||
Andronomus Пользователь Сообщений: 15 |
Спасибо. Глюк какой то. |
Мотя Пользователь Сообщений: 3218 |
См. вариант. Изменено: Мотя — 09.01.2017 13:14:52 |
SAS888 Пользователь Сообщений: 757 |
#8 09.01.2017 06:11:24 Можно существенно проще:
Пример во вложении. Прикрепленные файлы
Изменено: SAS888 — 09.01.2017 06:35:30 Чем шире угол зрения, тем он тупее. |
||
0 / 0 / 0 Регистрация: 10.06.2016 Сообщений: 9 |
|
1 |
|
Соединить несколько столбцов в один!10.06.2016, 09:02. Показов 8888. Ответов 22
Есть задачка, ответа на нее нормального и рабочего не могу найти 3-ий день уже! Одни макросы с ошибками другие не так как надо делают и т.д.
0 |
6875 / 2807 / 533 Регистрация: 19.10.2012 Сообщений: 8,562 |
|
10.06.2016, 09:05 |
2 |
Есть такие функции как СЦЕПИТЬ и СЖПРОБЕЛЫ — используйте. Ну можно конечно и макрос написать, но зачем?
0 |
4131 / 2235 / 940 Регистрация: 01.12.2010 Сообщений: 4,624 |
|
10.06.2016, 09:20 |
3 |
0 |
6875 / 2807 / 533 Регистрация: 19.10.2012 Сообщений: 8,562 |
|
10.06.2016, 09:31 |
4 |
Ну наконец-то сподобились
0 |
0 / 0 / 0 Регистрация: 10.06.2016 Сообщений: 9 |
|
10.06.2016, 09:36 [ТС] |
5 |
Да какие нафиг сцепить! Они мне не нужны сцепленные! Просто вниз их перенести под первый столбец, все остальные столбцы! Добавлено через 56 секунд
0 |
6875 / 2807 / 533 Регистрация: 19.10.2012 Сообщений: 8,562 |
|
10.06.2016, 09:43 |
6 |
Ну так почему! В примере! Нет примера!
0 |
0 / 0 / 0 Регистрация: 10.06.2016 Сообщений: 9 |
|
10.06.2016, 09:50 [ТС] |
7 |
В прикрепленном файле необходимо все данные из столбцов соединить в один столбец друг за другом!
Ну так почему! В примере! Нет примера!
0 |
6875 / 2807 / 533 Регистрация: 19.10.2012 Сообщений: 8,562 |
|
10.06.2016, 09:52 |
8 |
Можно ведь было в том файле дать 10 строк исходных данных и рядом/ниже/какугодно показать в понятном виде какой результат нужен — всем бы сэкономили кучу букв ответов…
0 |
0 / 0 / 0 Регистрация: 10.06.2016 Сообщений: 9 |
|
10.06.2016, 10:14 [ТС] |
9 |
Можно ведь было в том файле дать 10 строк исходных данных и рядом/ниже/какугодно показать в понятном виде какой результат нужен — всем бы сэкономили кучу букв ответов… Не я правда туда попал?!
все данные из столбцов соединить в один столбец друг за другом!
0 |
pashulka 4131 / 2235 / 940 Регистрация: 01.12.2010 Сообщений: 4,624 |
||||
10.06.2016, 10:24 |
10 |
|||
Сообщение было отмечено Abilok как решение РешениеAbilok, Тестируйте … на кошках (c)
2 |
Hugo121 6875 / 2807 / 533 Регистрация: 19.10.2012 Сообщений: 8,562 |
||||
10.06.2016, 10:30 |
11 |
|||
Не я правда туда попал?! — это смотря куда собирались попасть Но может так подойдёт?
0 |
0 / 0 / 0 Регистрация: 10.06.2016 Сообщений: 9 |
|
10.06.2016, 10:36 [ТС] |
12 |
— это смотря куда собирались попасть Это правда важно? Добавлено через 22 секунды
Abilok, Тестируйте … на кошках (c) Что еще за кошки?)
0 |
6875 / 2807 / 533 Регистрация: 19.10.2012 Сообщений: 8,562 |
|
10.06.2016, 10:36 |
13 |
Это правда важно? Вам виднее — иногда бывает даже очень важно.
0 |
876 / 555 / 291 Регистрация: 21.11.2012 Сообщений: 1,551 |
|
10.06.2016, 10:40 |
14 |
Abilok, вы, видимо, сами не туда попали. в представленном вами примере нет какой-то зависимости. исходя из вашего описания к поставленной задаче следует, что вы хотите из столбцов получить: но в вашем примере «объединение» вообще не понятно по какому принципу сливаются столбцы. сначала берется первый. далее хз просто даже тупой тест, выделить все заполненные ячейки на исходном листе — показывает 574 заполненных, на втором — 282. Вы либо научитесь правильно формулировать вопросы, либо разбирайтесь в своем мусоре сами
0 |
0 / 0 / 0 Регистрация: 10.06.2016 Сообщений: 9 |
|
10.06.2016, 10:53 [ТС] |
15 |
Sub tt() Этот с ошибкой какой то… Добавлено через 6 минут
вы, видимо, сами не туда попали. в представленном вами примере нет какой-то зависимости. исходя из вашего описания к поставленной задаче следует, что вы хотите из столбцов Вам либо заняться нечем, либо вы просто строите сидя здесь из себя что то понимающее!
A B C Что сложного для Вас, если вы понимающие в этом люди? Добавлено через 5 минут
Abilok, Тестируйте … на кошках (c) Уважаемый, pashulka! А как Вам удалось понять мой вопрос?
0 |
876 / 555 / 291 Регистрация: 21.11.2012 Сообщений: 1,551 |
|
10.06.2016, 10:53 |
16 |
Abilok, Что сложного для Вас, если вы понимающие в этом люди? а вы объясните людям что вам надо, а в вашем примере, который вы написали, все выглядит так: получить A
0 |
0 / 0 / 0 Регистрация: 10.06.2016 Сообщений: 9 |
|
10.06.2016, 10:56 [ТС] |
17 |
Abilok, Прощайте, hamin!
0 |
414 / 262 / 82 Регистрация: 27.10.2012 Сообщений: 860 |
|
10.06.2016, 11:44 |
18 |
Не по теме: Abilok, кое-где (не скажу где) уже бан бы схлопотали, а тут люди ещё и отвечают .
0 |
0 / 0 / 0 Регистрация: 10.06.2016 Сообщений: 9 |
|
10.06.2016, 11:49 [ТС] |
19 |
kalbasiatka, Что я написал не так как надо кому то?
0 |
414 / 262 / 82 Регистрация: 27.10.2012 Сообщений: 860 |
|
10.06.2016, 11:59 |
20 |
Элементарная вежливость должна быть. Ни кто вам ни чего не обязан.
0 |
I have multiple lists that are in separate columns in excel. What I need to do is combine these columns of data into one big column. I do not care if there are duplicate entries, however I want it to skip row 1 of each column.
Also what about if ROW1 has headers from January to December, and the length of the columns are different and needs to be combine into one big column?
ROW1| 1 2 3
ROW2| A D G
ROW3| B E H
ROW4| C F I
should combine into
A
B
C
D
E
F
G
H
I
The first row of each column needs to be skipped.
asked Jun 4, 2010 at 20:40
Try this. Click anywhere in your range of data and then use this macro:
Sub CombineColumns()
Dim rng As Range
Dim iCol As Integer
Dim lastCell As Integer
Set rng = ActiveCell.CurrentRegion
lastCell = rng.Columns(1).Rows.Count + 1
For iCol = 2 To rng.Columns.Count
Range(Cells(1, iCol), Cells(rng.Columns(iCol).Rows.Count, iCol)).Cut
ActiveSheet.Paste Destination:=Cells(lastCell, 1)
lastCell = lastCell + rng.Columns(iCol).Rows.Count
Next iCol
End Sub
answered Jun 5, 2010 at 13:15
Alex PAlex P
12.2k5 gold badges51 silver badges69 bronze badges
3
You can combine the columns without using macros. Type the following function in the formula bar:
=IF(ROW()<=COUNTA(A:A),INDEX(A:A,ROW()),IF(ROW()<=COUNTA(A:B),INDEX(B:B,ROW()-COUNTA(A:A)),IF(ROW()>COUNTA(A:C),"",INDEX(C:C,ROW()-COUNTA(A:B)))))
The statement uses 3 IF functions, because it needs to combine 3 columns:
- For column A, the function compares the row number of a cell with the total number of cells in A column that are not empty. If the result is true, the function returns the value of the cell from column A that is at row(). If the result is false, the function moves on to the next IF statement.
- For column B, the function compares the row number of a cell with the total number of cells in A:B range that are not empty. If the result is true, the function returns the value of the first cell that is not empty in column B. If false, the function moves on to the next IF statement.
- For column C, the function compares the row number of a cell with the total number of cells in A:C range that are not empty. If the result is true, the function returns a blank cell and doesn’t do any more calculation. If false, the function returns the value of the first cell that is not empty in column C.
TylerH
20.6k64 gold badges76 silver badges97 bronze badges
answered Dec 3, 2014 at 8:25
CristinaPCristinaP
3063 silver badges6 bronze badges
0
Not sure if this completely helps, but I had an issue where I needed a «smart» merge. I had two columns, A & B. I wanted to move B over only if A was blank. See below. It is based on a selection Range, which you could use to offset the first row, perhaps.
Private Sub MergeProjectNameColumns()
Dim rngRowCount As Integer
Dim i As Integer
'Loop through column C and simply copy the text over to B if it is not blank
rngRowCount = Range(dataRange).Rows.Count
ActiveCell.Offset(0, 0).Select
ActiveCell.Offset(0, 2).Select
For i = 1 To rngRowCount
If (Len(RTrim(ActiveCell.Value)) > 0) Then
Dim currentValue As String
currentValue = ActiveCell.Value
ActiveCell.Offset(0, -1) = currentValue
End If
ActiveCell.Offset(1, 0).Select
Next i
'Now delete the unused column
Columns("C").Select
selection.Delete Shift:=xlToLeft
End Sub
answered Jun 4, 2010 at 20:49
Function Concat(myRange As Range, Optional myDelimiter As String) As String
Dim r As Range
Application.Volatile
For Each r In myRange
If Len(r.Text) Then
Concat = Concat & IIf(Concat <> "", myDelimiter, "") & r.Text
End If
Next
End Function
answered Jun 4, 2010 at 21:01
Mark BakerMark Baker
208k31 gold badges340 silver badges383 bronze badges
макрос объединения столбцов в один построчно |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |