Многократное объединение отдельных групп ячеек в столбцах вручную – требует много времени и сил. Поэтому рационально будет воспользоваться макросом, который автоматически выполнит всю эту, плюс еще и дополнительную работу.
Как объединить 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 все строки объединились бы в одну ячейку, что не есть хорошо.
макрос объединения столбцов в один построчно |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
You didn’t mention if you are using Excel 2003 or 2007, but you may run into an issue with the # of rows in Excel 2003 being capped at 65,536. If you are using 2007, the limit is 1,048,576.
Also, can I ask what your end goal is for your analysis? If you need to perform many statistical calculations on your data, I would recommend moving out of the Excel environment into something that is more directly suited for data manipulation and analysis, such as R.
There are a variety of options for connecting R to Excel, including
- RExcel
- RODBC
- Other options in the R manual
Regardless of what you choose to use to move data in/out of R, the code to change from wide to long format is pretty trivial. I enjoy the melt()
function from the reshape package. That code would look like:
library(reshape)
#Fake data, 4 columns, 20k rows
df <- data.frame(foo = rnorm(20000)
, bar = rlnorm(20000)
, fee = rnorm(20000)
, fie = rlnorm(20000)
)
#Create new object with 1 column, 80k rows
df.m <- melt(df)
From there, you can perform any number of statistical or graphing operations. If you use the RExcel plugin above, you can fire all of this up and run it within Excel itself. The R community is very active and can help address any and all questions you may encounter.
Good luck!
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 Чем шире угол зрения, тем он тупее. |
||
Ситуация такая: Есть два столбца — в одном написаны имена, в другом фамилии (причём фамилий намного больше). Как переписать в третий столбец все сочетания ячеек из первых двух столбцов?
Наглядно:
Анна | Петрова |
Евгения | Воронцова |
Мария | Зеленская |
Орлова | |
Авдеева |
и т.д.
Чтобы получилось Анна Петрова, Анна Воронцова, Анна Зеленская и т.д.; Евгения Петрова, Евгения Воронцова и т.д.
По идее самый логичный вариант это создать формулу, когда первая ячейка первого столбца сочетается со всеми ячейками из второго, потом вторая ячейка первого столбца сочетается со всеми ячейками из второго и т.д. Наверно, примерно так: А1+(*В*)=С1
Но я не знаю как создать эту формулу или же как по другому решить этот вопрос.
Знатоки, подскажите, пожалуйста!