Макрос на объединение столбцов в excel

Многократное объединение отдельных групп ячеек в столбцах вручную – требует много времени и сил. Поэтому рационально будет воспользоваться макросом, который автоматически выполнит всю эту, плюс еще и дополнительную работу.

Как объединить 2 и несколько столбцов в таблице Excel

Допустим, что мы имеем таблицу содержащую данные оп договорам и выставленных на их основе счетов. Данные по договорам находиться в столбцах D, E и F, но некоторые фактуры взяты с других подчиненных документов, а не из договора. Для таких случаев в столбце D указывается номер договора или описание подчиненного документа для каждой фактуры.

данные оп договорам.

Нам необходимо объединить ячейки в этих трех столбцах (D, E и F) таким образом, чтобы для каждой строки где нет договоров была одна объединенная ячейка.

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

Visual Basic.

И вставим новый стандартный модуль используя инструмент в редакторе: «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

Код VBA.

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

закомментируйте переменную 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 все строки объединились бы в одну ячейку, что не есть хорошо.

макрос объединения столбцов в один построчно

Ilsur

Дата: Среда, 23.11.2016, 23:34 |
Сообщение № 1

Группа: Пользователи

Ранг: Прохожий

Сообщений: 4


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

Доброго времени суток! Суть проблемы такая:
Имеется файл с таблицей с указанием в столбцах наименования товара, производитель, единица измерения. Нужно объединить эти 3 столбца в один построчно. Я так думаю макросом. Примерный код я нашел, но он при выделении нескольких строк обьеденяет все ячейки в одну. Вот он:
[vba]

Код

Sub MergeCell()
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 Sub

[/vba]

Может тут что-то нужно изменить, чтобы при выделении всех значений 3 столбцов — обьединение произошло построчно. Прикрепляю файл с этими тремя столбцами. Заранее Спасибо!

К сообщению приложен файл:

6207947.xls
(58.0 Kb)


с благодарностью Ilsur

Сообщение отредактировал IlsurСреда, 23.11.2016, 23:36

 

Ответить

_Boroda_

Дата: Четверг, 24.11.2016, 00:00 |
Сообщение № 2

Группа: Модераторы

Ранг: Местный житель

Сообщений: 16618


Репутация:

6465

±

Замечаний:
0% ±


2003; 2007; 2010; 2013 RUS

А формулой в соседнем столбце не пойдет? Потом оттуда можно скопировать и вставить значениями в нужно место

Код

=D7&J$6&» «&E7&J$6&» «&F7

В J$6 — разделитель у меня в файле точка с запятой


Скажи мне, кудесник, любимец ба’гов…
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

 

Ответить

Ilsur

Дата: Четверг, 24.11.2016, 00:11 |
Сообщение № 3

Группа: Пользователи

Ранг: Прохожий

Сообщений: 4


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

Конечно можно, я как вариант рассматривал его, но желательно с использованием макроса


с благодарностью Ilsur

 

Ответить

Timber_Wolf

Дата: Четверг, 24.11.2016, 09:48 |
Сообщение № 4

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 107


Репутация:

2

±

Замечаний:
0% ±


Excel 2010

Ilsur,

Вопрос 1
А результирующая ячейка то какая? =)) Вы выделяете 2-4 ячейки используете макрос и куда вы результат хотите получить? Во все 2-4 выделенных ячейки? =)

Вопрос 2
Вы хотите делать такую процедуру в ручную? Взять, выделить, макрос, готово, следующая строка… А обработка всего листа сразу не страивает? )

Сообщение отредактировал Timber_WolfЧетверг, 24.11.2016, 09:49

 

Ответить

Wasilich

Дата: Четверг, 24.11.2016, 12:32 |
Сообщение № 5

Группа: Друзья

Ранг: Старожил

Сообщений: 1232


Репутация:

326

±

Замечаний:
0% ±


2003

Сама тема начинается со слова «макрос» но, почему то здесь!
Так пойдет?
[vba]

Код

Sub Макрос1()
  Dim I&, TX$
  Application.ScreenUpdating = False:  Application.DisplayAlerts = False
  For I = 7 To Range(«D» & Rows.Count).End(xlUp).Row
    TX = Cells(I, 4) & »  » & Cells(I, 5) & »  » & Cells(I, 6)
    Range(«D» & I & «:F» & I).Merge Across:=True
    Cells(I, 4) = TX
  Next
  Application.ScreenUpdating = True: Application.DisplayAlerts = True
End Sub

[/vba]

Сообщение отредактировал WasilichЧетверг, 24.11.2016, 12:36

 

Ответить

Ilsur

Дата: Четверг, 24.11.2016, 16:07 |
Сообщение № 6

Группа: Пользователи

Ранг: Прохожий

Сообщений: 4


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

да я и хочу весь лист с использованием макроса


с благодарностью Ilsur

 

Ответить

Ilsur

Дата: Четверг, 24.11.2016, 16:08 |
Сообщение № 7

Группа: Пользователи

Ранг: Прохожий

Сообщений: 4


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

Wasilich большое спасибо за помощь, то что надо!))


с благодарностью Ilsur

 

Ответить

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

  1. RExcel
  2. RODBC
  3. 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
Регистрация: 08.01.2017

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

 

Sanja

Пользователь

Сообщений: 14838
Регистрация: 10.01.2013

Ну вот опять. Что значит «объединить»? И почему с «помощью макроса»? Может достаточно СЦЕПИТЬ() или & ? Покажите в файле желаемый результат

Согласие есть продукт при полном непротивлении сторон.

 

Andronomus

Пользователь

Сообщений: 15
Регистрация: 08.01.2017

Вот так должно получиться. Файл прикрепил.
Т.е. данные второго столбца помещаются в конец 1го столбца, данные 3го в конец первого, и т.д. Все выстраиваются в один столбик.
Макрос создает столбцы. Как их формулой скрепить в этом процессе?

 

_Igor_61

Пользователь

Сообщений: 3007
Регистрация: 18.07.2016

Здравствуйте! Если формулами, то примерно так (два синих столбца сцеплены в зеленом) — тема

здесь

 

Kuzmich

Пользователь

Сообщений: 7998
Регистрация: 21.12.2012

#5

08.01.2017 23:14:44

Макросом

Код
Sub Perenos()
Dim j As Integer
Dim iLR_A As Long
Dim iLastRow
  For j = 2 To 5
    iLR_A = Cells(Rows.Count, "A").End(xlUp).Row + 1
    iLastRow = Cells(Rows.Count, j).End(xlUp).Row
    Range(Cells(1, j), Cells(iLastRow, j)).Cut Cells(iLR_A, 1)
  Next
  iLR_A = Cells(Rows.Count, "A").End(xlUp).Row
  For j = iLR_A To 1 Step -1
    If IsEmpty(Cells(j, 1)) Then Rows(j).Delete
  Next
End Sub
 

Andronomus

Пользователь

Сообщений: 15
Регистрация: 08.01.2017

Спасибо. Глюк какой то.
Кнопка макроса мерцает.
Жмешь Esc, вылетает ошибка: Метод Delete из класса Range завершен неверно.
И подсвечивается строка If IsEmpty(Cells(j, 1)) Then Rows(j).Delete                       Подсвечивается (Rows(j).Delete)
Что исправлять?

 

Мотя

Пользователь

Сообщений: 3218
Регистрация: 25.12.2012

См. вариант.

Изменено: Мотя09.01.2017 13:14:52

 

SAS888

Пользователь

Сообщений: 757
Регистрация: 01.01.1970

#8

09.01.2017 06:11:24

Можно существенно проще:

Код
Sub Collect()
    Dim i As Long, j As Long, a(), b()
    Application.ScreenUpdating = False
    a = ActiveSheet.UsedRange.Value: Cells.Clear
    For i = 1 To UBound(a, 2)
        j = Cells(Rows.Count, 1).End(xlUp).Row + 1
        b = Application.Index(a, 0, i)
        Cells(j, 1).Resize(UBound(b)).Value = b
    Next
    Columns(1).SpecialCells(4).Delete xlUp
End Sub

Пример во вложении.

Прикрепленные файлы

  • Пример.xlsb (15.44 КБ)

Изменено: SAS88809.01.2017 06:35:30

Чем шире угол зрения, тем он тупее.

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

Ситуация такая: Есть два столбца — в одном написаны имена, в другом фамилии (причём фамилий намного больше). Как переписать в третий столбец все сочетания ячеек из первых двух столбцов?

Наглядно:

Анна Петрова
Евгения Воронцова
Мария Зеленская
  Орлова
  Авдеева

и т.д.

Чтобы получилось Анна Петрова, Анна Воронцова, Анна Зеленская и т.д.; Евгения Петрова, Евгения Воронцова и т.д.

По идее самый логичный вариант это создать формулу, когда первая ячейка первого столбца сочетается со всеми ячейками из второго, потом вторая ячейка первого столбца сочетается со всеми ячейками из второго и т.д. Наверно, примерно так: А1+(*В*)=С1
Но я не знаю как создать эту формулу или же как по другому решить этот вопрос.
Знатоки, подскажите, пожалуйста!

Понравилась статья? Поделить с друзьями:
  • Макрос на миф для excel
  • Макрос на кнопку в меню excel
  • Макрос на запрет на сохранение в excel
  • Макрос на заполнение ячеек данными в excel
  • Макрос на заливку ячеек в excel