Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Объединить ячейки в одном столбце (http://forum.oszone.net/showthread.php?t=329423)

blackeangel 30-08-2017 15:34 2761512

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

Но что то у меня не получилось его переделать.

Iska 30-08-2017 16:05 2761514

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

blackeangel 30-08-2017 16:16 2761517

Вложений: 1
Вот там 2 листа

Iska 01-09-2017 06:31 2761784

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


blackeangel 01-09-2017 08:36 2761795

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

Iska 01-09-2017 09:12 2761800

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

Цитата blackeangel
необходимость обьединять последовательно сначала второй, потом третий, потом произвольный, а в самом конце первый столбец »


Iska 01-09-2017 09:33 2761809

Цитата:

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

Там достаточно просто.

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

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

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

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

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

blackeangel 01-09-2017 11:16 2761826

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

blackeangel 01-09-2017 13:08 2761846

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

Iska 01-09-2017 16:19 2761904

Цитата:

Цитата blackeangel
Пример вызова функции какой то такой
Функция(1,5,7,9,12,3) »

Что это должно означать?

Цитата:

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

Куда? Пример «подачи».

Цитата:

Цитата blackeangel
И ещё один момент, объединенять ячейки надо только с повторяющимися значениями. »

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

blackeangel 02-09-2017 15:20 2762063

Цитата:

Цитата Iska (Сообщение 2761904)
Цитата:

Цитата blackeangel
Пример вызова функции какой то такой
Функция(1,5,7,9,12,3) »

Что это должно означать?

Цитата:

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

Куда? Пример «подачи».

Цитата:

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

это все одно целое.
Единственное, что здесь можно пояснить, это то что цифры это номера столбцов.Где первый столбец - опорный(в текущих книгах он был первым), по нему проходит цикл и по нему объединять надо в последнюю очередь. Остальные цифры это тоже столбцы, но уже не опорные.

Iska 03-09-2017 00:18 2762159

Цитата:

Цитата blackeangel
Единственное, что здесь можно пояснить, »

Поясните:
Цитата:

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

Как будет выглядеть вызов функции?

Цитата:

Цитата blackeangel
Где первый столбец - опорный(в текущих книгах он был первым), »

Опорный всегда будет первым столбцом на Рабочем листе?

blackeangel 03-09-2017 10:01 2762190

Iska,
1. Функция(1,5,7,0,12,3)
2. Нет, но вызове функции стоять первым
Как то так
Функция(опорный As Integer, неопорные As Variant)

Iska 03-09-2017 10:32 2762196

Цитата:

Цитата blackeangel
1. Функция(1,5,7,0,12,3) »

Что это должно означать? Распишите подробно именно данный пример: «1 — это …, 5 — это …».

blackeangel 03-09-2017 12:02 2762207

Цитата:

Цитата Iska (Сообщение 2762196)
Цитата:

Цитата blackeangel
1. Функция(1,5,7,0,12,3) »

Что это должно означать? Распишите подробно именно данный пример: «1 — это …, 5 — это …».

1 - столбец А(и он опорный в этом примере), 5 - столбец Е, 7 - столбец G, 3 - столбец С, 12 - столбец L.
Если 0, то понятно что этого столбца не существует и его следует пропустить. Так же опорный столбец не может быть 0.

Iska 03-09-2017 12:29 2762213

Цитата:

Цитата blackeangel
Если 0, то понятно что этого столбца не существует и его следует пропустить. »

blackeangel, хоть убейте — не могу понять, зачем вообще надо указывать столбец, который не существует? Почему не просто «Функция(1,5,7,12,3)»?

blackeangel 03-09-2017 13:20 2762223

Цитата:

Цитата Iska (Сообщение 2762213)
Цитата:

Цитата blackeangel
Если 0, то понятно что этого столбца не существует и его следует пропустить. »

blackeangel, хоть убейте — не могу понять, зачем вообще надо указывать столбец, который не существует? Почему не просто «Функция(1,5,7,12,3)»?

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


Время: 19:25.

Время: 19:25.
© OSzone.net 2001-