Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » VBA - Объединить ячейки в одном столбце

Ответить
Настройки темы
VBA - Объединить ячейки в одном столбце

Аватара для blackeangel

Старожил


Сообщения: 329
Благодарности: 3

Профиль | Отправить PM | Цитировать


В общем надо объединить ячейки в одном столбце, при условии что ячейки в другом столбце одинаковые.
То есть если содержимое столбца 1 повторяется от строки к строке, то в столбце 2 объединяем.
За основу брал такой код
Код: Выделить весь код
Sub MergeCls()
  r1 = 1
  r2 = 1
  Do
    If Cells(r1, 1) <> Cells(r2 + 1, 1) Then
      If r1 <> r2 Then
        Range(Cells(r1 + 1, 1), Cells(r2, 1)).ClearContents
        Range(Cells(r1, 1), Cells(r2, 1)).MergeCells = True
      End If
      r1 = r2 + 1
    End If
    r2 = r2 + 1
  Loop Until Cells(r2, 1) = ""
End Sub
Но что то у меня не получилось его переделать.

-------
Забудем боль, забудем страх -
И только ветер в парусах!


Отправлено: 15:34, 30-08-2017

 

Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


blackeangel, что-то не соображу. Образец Рабочей книги в архиве приложите, на одном рабочем листе — пример исходника, на другом — полученный с примера результат.

Отправлено: 16:05, 30-08-2017 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Аватара для blackeangel

Старожил


Сообщения: 329
Благодарности: 3

Профиль | Отправить PM | Цитировать


Вложения
Тип файла: rar 1.rar
(9.4 Kb, 12 просмотров)

Вот там 2 листа

-------
Забудем боль, забудем страх -
И только ветер в парусах!


Отправлено: 16:16, 30-08-2017 | #3


Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


blackeangel, это может выглядеть примерно так:
Скрытый текст
Код: Выделить весь код
Option Explicit

Sub Sample()
    Dim i As Integer
    Dim objRange As Range
    Dim PrevValue As Variant
    Dim objRange4Union As Range
    
    
    Application.DisplayAlerts = False
    
    With ActiveSheet.UsedRange
        With .Columns.Item(1).Cells
            Set objRange4Union = .Item(2, 1)
            PrevValue = objRange4Union.Value
        End With
            
        For i = 3 To .Rows.Count
            Set objRange = .Columns.Item(1).Cells.Item(i, 1)
            
            If PrevValue = objRange.Value Then
                Set objRange4Union = Union(objRange4Union, objRange)
            Else
                With objRange4Union
                    With .Offset(0, 1)
                        .UnMerge
                        .Merge
                        
                        .HorizontalAlignment = xlCenter
                        .VerticalAlignment = xlCenter
                    End With
                    
                    With .Offset(0, 2)
                        .UnMerge
                        .Merge
                        
                        .HorizontalAlignment = xlCenter
                        .VerticalAlignment = xlCenter
                    End With
                End With
                
                Set objRange4Union = objRange
            End If
            
            PrevValue = objRange.Value
        Next i
    End With
    
    With objRange4Union
        With .Offset(0, 1)
            .UnMerge
            .Merge
            
            .HorizontalAlignment = xlCenter
            .VerticalAlignment = xlCenter
        End With
        
        With .Offset(0, 2)
            .UnMerge
            .Merge
            
            .HorizontalAlignment = xlCenter
            .VerticalAlignment = xlCenter
        End With
    End With
    
    Application.DisplayAlerts = True
End Sub
Это сообщение посчитали полезным следующие участники:

Отправлено: 06:31, 01-09-2017 | #4


Аватара для blackeangel

Старожил


Сообщения: 329
Благодарности: 3

Профиль | Отправить PM | Цитировать


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

-------
Забудем боль, забудем страх -
И только ветер в парусах!


Отправлено: 08:36, 01-09-2017 | #5


Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


blackeangel, чтобы мы продолжили понимать друг друга — от Вас новая рабочая книга с иллюстрацией:
Цитата blackeangel:
необходимость обьединять последовательно сначала второй, потом третий, потом произвольный, а в самом конце первый столбец »

Отправлено: 09:12, 01-09-2017 | #6


Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


Цитата blackeangel:
в текущем коде ничего непонял. »
Там достаточно просто.

Работаем с первым столбцом использованного диапазона (.UsedRange) активного рабочего листа (ActiveSheet). Предполагаем, что данные тупо расположены с первой же ячейки и имеют заголовки столбцов. Посему начинаем с того, что диапазону для объединения (objRange4Union) присваиваем диапазон, состоящий из ячейки A2, и запоминаем значение из той же самой ячейки A2. Далее перебираем все строки из первого столбца от третьей строки до последней строки использованного диапазона.

Если значение в очередной ячейке совпадает с запомненным значением (из ячейки выше) — включаем в диапазон для объединения эту ячейку (путём операции Union() над ним самим и этой самой очередной ячейкой).

Если не совпадает — то на всякий случай сначала проводим разъединение ячеек, расположенными в столбце правее (.Offset(0, 1)) диапазона для объединения (objRange4Union), затем объединение этих ячеек, делаем выравнивание содержимого. Ту же операцию проделываем с ячейками, расположенными на два стобца правее (.Offset(0, 2)) диапазона для объединения. Наконец, начинаем заново собирать новый диапазон для объединения, начиная с текущей очередной ячейки.

После завершения проверки условия в конце цикла запоминаем в переменной значение текущей очередной ячейки и повторяем весь цикл.

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

Отправлено: 09:33, 01-09-2017 | #7


Аватара для blackeangel

Старожил


Сообщения: 329
Благодарности: 3

Профиль | Отправить PM | Цитировать


Iska, ну в общем всё на самом деле просто.необходима функция, котороя обьединяла бы любые ячейки в столбцах в указанном порядке. Пример вызова функции какой то такой
Функция(1,5,7,9,12,3)
Если подается нулевое значение, значит столбец пропускаем.
И ещё один момент, объединенять ячейки надо только с повторяющимися значениями.

-------
Забудем боль, забудем страх -
И только ветер в парусах!


Последний раз редактировалось blackeangel, 01-09-2017 в 12:49.


Отправлено: 11:16, 01-09-2017 | #8


Аватара для blackeangel

Старожил


Сообщения: 329
Благодарности: 3

Профиль | Отправить PM | Цитировать


Вложения
Тип файла: xlsx приме2.xlsx
(11.5 Kb, 11 просмотров)

Вот пример второй чтоб понятнее стало

-------
Забудем боль, забудем страх -
И только ветер в парусах!


Отправлено: 13:08, 01-09-2017 | #9


Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


Цитата blackeangel:
Пример вызова функции какой то такой
Функция(1,5,7,9,12,3) »
Что это должно означать?

Цитата blackeangel:
Если подается нулевое значение, значит столбец пропускаем. »
Куда? Пример «подачи».

Цитата blackeangel:
И ещё один момент, объединенять ячейки надо только с повторяющимися значениями. »
Новую Рабочую книгу пока не глядел, но по первой изначально был иной алгоритм: смотрим в первый столбец и по нему осуществляем объединение столбцов справа. То, что предлагается делать сейчас, отличается от ранее поставленной задачи, насколько я вижу.

Отправлено: 16:19, 01-09-2017 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » VBA - Объединить ячейки в одном столбце

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
2010 - [решено] Поиск фразы в столбце и создание записи в соседнем столбце blackeangel Microsoft Office (Word, Excel, Outlook и т.д.) 11 22-12-2015 15:54
2007 - [решено] Excel получение предыдущей непустой ячейки в столбце eus_deus Microsoft Office (Word, Excel, Outlook и т.д.) 4 06-12-2015 09:17
CMD/BAT - [решено] awk замена текста во втором столбце shmel_sv@vk Скриптовые языки администрирования Windows 9 14-09-2015 14:16
Sharepoint - Пробелы в числовом столбце AxeL_FoX Другие серверные продукты 0 02-06-2010 21:31
Интерфейс - Не выводится информация в столбце “Размеры” CompFan Microsoft Windows 2000/XP 1 15-02-2008 01:00




 
Переход