Войти

Показать полную графическую версию : Объединить ячейки в одном столбце


blackeangel
30-08-2017, 15:34
В общем надо объединить ячейки в одном столбце, при условии что ячейки в другом столбце одинаковые.
То есть если содержимое столбца 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
blackeangel, что-то не соображу. Образец Рабочей книги в архиве приложите, на одном рабочем листе — пример исходника, на другом — полученный с примера результат.

blackeangel
30-08-2017, 16:16
Вот там 2 листа

Iska
01-09-2017, 06:31
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
Iska, это здорово. Но вот теперь стала необходимость обьединять последовательно сначала второй, потом третий, потом произвольный, а в самом конце первый столбец. То есть примерно все останется так же, но куда надо и что добавить чтоб заработало поновым условиям? Просто в текущем коде ничего непонял.

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

Iska
01-09-2017, 09:33
в текущем коде ничего непонял. »
Там достаточно просто.

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

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

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

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

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

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

blackeangel
01-09-2017, 13:08
Вот пример второй чтоб понятнее стало

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

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

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

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

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

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

Iska
03-09-2017, 00:18
Единственное, что здесь можно пояснить, »
Поясните:
Если подается нулевое значение, значит столбец пропускаем. »
Как будет выглядеть вызов функции?

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

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

Iska
03-09-2017, 10:32
1. Функция(1,5,7,0,12,3) »
Что это должно означать? Распишите подробно именно данный пример: «1 — это …, 5 — это …».

blackeangel
03-09-2017, 12:02
1. Функция(1,5,7,0,12,3) »
Что это должно означать? Распишите подробно именно данный пример: «1 — это …, 5 — это …».
1 - столбец А(и он опорный в этом примере), 5 - столбец Е, 7 - столбец G, 3 - столбец С, 12 - столбец L.
Если 0, то понятно что этого столбца не существует и его следует пропустить. Так же опорный столбец не может быть 0.

Iska
03-09-2017, 12:29
Если 0, то понятно что этого столбца не существует и его следует пропустить. »
blackeangel, хоть убейте — не могу понять, зачем вообще надо указывать столбец, который не существует? Почему не просто «Функция(1,5,7,12,3)»?

blackeangel
03-09-2017, 13:20
Если 0, то понятно что этого столбца не существует и его следует пропустить. »
blackeangel, хоть убейте — не могу понять, зачем вообще надо указывать столбец, который не существует? Почему не просто «Функция(1,5,7,12,3)»?
На всякий случай, тк номера столбцов будут находиться по имени столбца. Хотя ладно, можно и без этого, сделаю проверку на ошибку.




© OSzone.net 2001-2012