powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Макрос для объединения ячеек
25 сообщений из 56, страница 1 из 3
Макрос для объединения ячеек
    #34395782
McGruber
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день всем.
В написании макросов опыта нет совсем, а задачу небольшую необходимо решить)
Нужен макрос, который бы для первого столбца таблицы в Excel объединил подряд идущие ячейки с одинаковыми значениями.
Может быть кто-то уже решал такую задачу и может помочь?)
...
Рейтинг: 0 / 0
Макрос для объединения ячеек
    #34395870
andMegaM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может тебе просто нужна сортировка (по убыванию или возростанию)? Не совсем понятно. Если можно пример
...
Рейтинг: 0 / 0
Макрос для объединения ячеек
    #34395932
McGruber
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет, сортировка не то, что мне надо
Например, в таблице данные
|1|2|3|
|1|2|3|
|1|2|3|
|2|2|3|
|2|2|3|
|2|2|3|
а после выполнения макроса получим
| |2|3|
|1|2|3|
| |2|3|
| |2|3|
|2|2|3|
| |2|3|
с объединением соотв-их ячеек первого столбца.
...
Рейтинг: 0 / 0
Макрос для объединения ячеек
    #34396574
andMegaM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Само объединение сделать не сложно,но если только знать диапазон объединяемых ячеек.
Я думаю как бы вот узнать адрес первой и последней объединяемой ячейки, потом в цикле по всему столбцу. Может кто-нибудь знает? Самому стало интересно.
...
Рейтинг: 0 / 0
Макрос для объединения ячеек
    #34396670
Oleg_Slip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Где-то так, но, думаю, можно оптимизировать.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Sub qqq()

    j =  1 : k =  1 

    For i =  1  To UsedRange.Rows.Count
        If Cells(i,  1 ).Value = Cells(i +  1 ,  1 ).Value Then
           k = k +  1 : Cells(i,  1 ).Value = ""
        Else
           With Range(Cells(j,  1 ).Address, Cells(k,  1 ).Address)
                .MergeCells = True
                .VerticalAlignment = xlCenter
           End With
           j = i +  1 : k = i +  1 
        End If
    Next i
        
End Sub
...
Рейтинг: 0 / 0
Макрос для объединения ячеек
    #34396745
vbapro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
McGruberНет, сортировка не то, что мне надо
Например, в таблице данные
|1|2|3|
|1|2|3|
|1|2|3|
|2|2|3|
|2|2|3|
|2|2|3|
а после выполнения макроса получим
| |2|3|
|1|2|3|
| |2|3|
| |2|3|
|2|2|3|
| |2|3|
с объединением соотв-их ячеек первого столбца.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
Sub test1()
Dim RowIndex As Long
Dim StartRow As Long
Dim LastRow As Long
Dim ColumnToMerge As Long
    
    StartRow =  1  ' с какой строки начинать
    ColumnToMerge =  1  ' в какой колонке объединять

    LastRow = Cells(Rows.Count, ColumnToMerge).End(xlUp).Row

    Application.DisplayAlerts = False

    For RowIndex = StartRow +  1  To LastRow
        With Cells(RowIndex, ColumnToMerge)
            If .Value = .Offset(- 1 ,  0 ).MergeArea.Cells( 1 ).Value Then
                Range(Cells(RowIndex, ColumnToMerge), .Offset(- 1 ,  0 )).Merge
            End If
        End With
    Next RowIndex

    Application.DisplayAlerts = True
    
End Sub




andMegaMСамо объединение сделать не сложно,но если только знать диапазон объединяемых ячеек.
Я думаю как бы вот узнать адрес первой и последней объединяемой ячейки, потом в цикле по всему столбцу. Может кто-нибудь знает? Самому стало интересно.до объединения или после?
...
Рейтинг: 0 / 0
Макрос для объединения ячеек
    #34396852
McGruber
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо большое всем ответившим, последний вариант делает сейчас именно то,что мне и надо)
...
Рейтинг: 0 / 0
Макрос для объединения ячеек
    #34609181
Dimen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А можно ли сделать так, что бы объединялися ячейки любого выделенного диапазона построчто, без потери данных (примерно как в Worde), только что бы в одну строчку, с пробелом между данными из ячеек?
Заранее благодарен.
...
Рейтинг: 0 / 0
Макрос для объединения ячеек
    #34609234
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimenА можно ли сделать так, что бы объединялися ячейки любого выделенного диапазона построчто, без потери данных (примерно как в Worde), только что бы в одну строчку, с пробелом между данными из ячеек?
Заранее благодарен.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Sub Test()
Dim irow As Range, icel As Range, MergeVal As String
 Application.DisplayAlerts = False
   For Each irow In Selection.Rows
     For Each icel In irow.Cells
       If icel.Value <> "" Then MergeVal = MergeVal & icel.Value & " "
     Next icel
   If MergeVal <> "" Then irow( 1 ).Value = Left(MergeVal, Len(MergeVal) -  1 )
   MergeVal = ""
   irow.Merge
   Next irow
 Application.DisplayAlerts = True
End Sub
...
Рейтинг: 0 / 0
Макрос для объединения ячеек
    #34610077
McGruber
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ещё маленькая задачка на объединение ячеек.
Необходимо пройтись по таблице начиная со строки X, и если в ячейке Y значение начинается с 'Лист', то объединить ячейки в этой строке с 1-ой по Z-ую в одну.
Спасибо всем, кто захочет помочь.
...
Рейтинг: 0 / 0
Макрос для объединения ячеек
    #34610144
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
McGruberЕщё маленькая задачка на объединение ячеек.
Необходимо пройтись по таблице начиная со строки X, и если в ячейке Y значение начинается с 'Лист', то объединить ячейки в этой строке с 1-ой по Z-ую в одну.
Спасибо всем, кто захочет помочь.

Имеется ввиду посмотреть первый столбец листа, начиная с X-строки и до конца. Если начинается 'Лист', то в этой строке с 1 до z-го столбца объединить строку с разделителем " "(пробел)?
...
Рейтинг: 0 / 0
Макрос для объединения ячеек
    #34610168
McGruber
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, именно, разве что столбец второй
...
Рейтинг: 0 / 0
Макрос для объединения ячеек
    #34610215
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
McGruberДа, именно, разве что столбец второй

Щас пообедаю, если никто не предложит, то сделаю!
...
Рейтинг: 0 / 0
Макрос для объединения ячеек
    #34610515
Dimen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Deggasad спасибо за код, работает отлично!
А есть пример как все это обратно вернуть по столбцам,
можно конечно через "разбить по столбцам", но хотелось бы также программно, любой выделенный диапазон.
Заранее благодарю!
...
Рейтинг: 0 / 0
Макрос для объединения ячеек
    #34610866
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Deggasad McGruberДа, именно, разве что столбец второй

Щас пообедаю, если никто не предложит, то сделаю!

Пообедал

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
Sub Test2()
Dim firstRow As Long, lastRow As Long, lastCol As String, SearchChar As String
Dim irow As Range, icel As Range, MergeVal As String
'номер первой строки
firstRow =  45 
' номер последней строки
lastRow = ActiveSheet.Range(firstCol & firstRow & ":" & firstCol & Rows.Count) _
   .Find("*", , , , xlByRows, xlPrevious).Row
'буква последнего столбца
firstCol = "B"
lastCol = "G"
SearchChar = "'Лист'"

 Application.DisplayAlerts = False
   For Each irow In Range(firstCol & firstRow & ":" & lastCol & lastRow).Rows
    If InStr(irow.Cells( 1 ).Value, SearchChar) =  1  Then
     For Each icel In irow.Cells
       If icel.Value <> "" Then MergeVal = MergeVal & icel.Value & " "
     Next icel
     irow.Cells( 1 ).Value = Left(MergeVal, Len(MergeVal) -  1 )
     MergeVal = ""
     irow.Merge
    End If
   Next irow
 Application.DisplayAlerts = True
End Sub
...
Рейтинг: 0 / 0
Макрос для объединения ячеек
    #34610919
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimenDeggasad спасибо за код, работает отлично!
А есть пример как все это обратно вернуть по столбцам,
можно конечно через "разбить по столбцам", но хотелось бы также программно, любой выделенный диапазон.
Заранее благодарю!

Может так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Sub UnTest()
Dim irow As Range, icel As Range, MergeVal As String, x As Variant, y
 Application.DisplayAlerts = False
   For Each irow In Selection.Rows
     With irow
       If .MergeCells Then
          .UnMerge
         ' разделитель " "(пробел)
         x = Split(.Cells( 1 ).Value, " ")
         For y =  0  To UBound(x)
          .Cells( 1 ).Offset( 0 , y).Value = x(y)
         Next
       End If
     End With
   Next irow
 Application.DisplayAlerts = True
End Sub
...
Рейтинг: 0 / 0
Макрос для объединения ячеек
    #34611049
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Deggasad
Может так

Код: plaintext
1.
2.
3.
4.
         x = Split(.Cells( 1 ).Value, " ")
         For y =  0  To UBound(x)
          .Cells( 1 ).Offset( 0 , y).Value = x(y)
         Next


лучше наверное так, без цыклов:

Код: plaintext
1.
   x = Split(.Cells( 1 ).Value, " ")
   .Cells( 1 ).Resize(,  1  + UBound(x)) = x

а еще лучше записать макрос во время выполнения "разбить по столбцам" и слегка подчистить код :-)

KL
[MVP - Microsoft Excel]
...
Рейтинг: 0 / 0
Макрос для объединения ячеек
    #34611067
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KL (XL)
а еще лучше записать макрос во время выполнения "разбить по столбцам" и слегка подчистить код :-)
KL
[MVP - Microsoft Excel]

Привет
Пробовал. Мне не понравилось почему-то.
...
Рейтинг: 0 / 0
Макрос для объединения ячеек
    #34611158
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Deggasad KL (XL)
а еще лучше записать макрос во время выполнения "разбить по столбцам" и слегка подчистить код :-)
Привет
Пробовал. Мне не понравилось почему-то.

Странно, весь твой код можно заменить на несравненно более быстрый и более короткий:

Код: plaintext
1.
2.
3.
4.
Sub Macro1()
    With Selection
        .TextToColumns .Cells( 1 ), xlDelimited, , True, , , , True
    End With
End Sub

или для пущей понятности:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Sub Macro2()
    With Selection
        .TextToColumns _
            Destination:=.Cells( 1 ), _
            DataType:=xlDelimited, _
            ConsecutiveDelimiter:=True, _
            Space:=True
    End With
End Sub

KL
[MVP - Microsoft Excel]
...
Рейтинг: 0 / 0
Макрос для объединения ячеек
    #34611266
McGruber
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Deggasad , спасибо большое, всё отлично работает
...
Рейтинг: 0 / 0
Макрос для объединения ячеек
    #34611283
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если вот так, то практически да

Код: plaintext
1.
2.
3.
4.
5.
Sub Macro1()
    With Selection
        .UnMerge
        .Columns( 1 ).TextToColumns .Cells( 1 ), xlDelimited, , True, , , , True
    End With
End Sub

Я просто там ещё проверки ещё какие-то вставлял может и зря. Ну Если тоже делать то и мой код сокращается

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Sub UnTest()
Dim icel As Range, x As Variant
  Selection.UnMerge
  For Each icel In Selection.Columns( 1 ).Rows
    x = Split(icel.Value, " ")
    If UBound(x) >=  0  Then icel.Resize(,  1  + UBound(x)) = x
  Next
End Sub
...
Рейтинг: 0 / 0
Макрос для объединения ячеек
    #34611612
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Deggasad...Ну Если тоже делать то и мой код сокращается

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Sub UnTest()
Dim icel As Range, x As Variant
  Selection.UnMerge
  For Each icel In Selection.Columns( 1 ).Rows
    x = Split(icel.Value, " ")
    If UBound(x) >=  0  Then icel.Resize(,  1  + UBound(x)) = x
  Next
End Sub


Да, но только внешне, т.к. один из цыклов все равно остается, а Split - функция сравнительно медленная если память мне не изменяет :-)

KL
[MVP - Microsoft Excel]
...
Рейтинг: 0 / 0
Макрос для объединения ячеек
    #34611689
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KL (XL) Deggasad...Ну Если тоже делать то и мой код сокращается

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Sub UnTest()
Dim icel As Range, x As Variant
  Selection.UnMerge
  For Each icel In Selection.Columns( 1 ).Rows
    x = Split(icel.Value, " ")
    If UBound(x) >=  0  Then icel.Resize(,  1  + UBound(x)) = x
  Next
End Sub


Да, но только внешне, т.к. один из цыклов все равно остается, а Split - функция сравнительно медленная если память мне не изменяет :-)

KL
[MVP - Microsoft Excel]

Я полностью с тобой согласен, только вот тот же текст по столбцам этож тоже цикл наверное!

Ещё вариант

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Sub UnTest2()
Dim icel As Range, x As Variant
 
With Selection
  .UnMerge
  Set icel = .Columns( 1 ).Find("*", , , , xlByRows, xlPrevious)
   If Not icel Is Nothing Then
     firstAddress = icel.Address
     Do
       x = Split(icel.Value, " ")
       icel.Resize(,  1  + UBound(x)) = x
       Set icel = .Columns( 1 ).FindNext(icel)
     Loop While Not icel Is Nothing And icel.Address <> firstAddress
   End If
End With

End Sub
...
Рейтинг: 0 / 0
Макрос для объединения ячеек
    #34611926
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DeggasadЯ полностью с тобой согласен, только вот тот же текст по столбцам этож тоже цикл наверное!

Конечно, но с крооооошечной оговоркой: этот цикл написан в C, а не VBA ;-)

KL
[MVP - Microsoft Excel]
...
Рейтинг: 0 / 0
Макрос для объединения ячеек
    #34611983
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KL (XL)
Конечно, но с крооооошечной оговоркой: этот цикл написан в C, а не VBA ;-)
KL
[MVP - Microsoft Excel]

Это хорошо или плохо?
...
Рейтинг: 0 / 0
25 сообщений из 56, страница 1 из 3
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Макрос для объединения ячеек
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]