Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Объединение строк и выделение цветом (макрос) - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Объединение строк и выделение цветом (макрос) (Макросы/Sub)
Объединение строк и выделение цветом (макрос)
force Дата: Понедельник, 18.08.2014, 01:43 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 42
Репутация: 1 ±
Замечаний: 0% ±

Excel 2010
Всем доброго времени суток!

Нужна Ваша помощь с написанием макроса. Есть прайс, где наименование категорий находятся в столбце "А", а остальные семь строк равны нулю, нужно сделать объединение всех восьми строк, с сохранением текста из первой, и фон залить желтым цветом, как указано в примере (файл с наименованием finish).
Исходник (файл с наименованием start) и пример (файл с наименованием finish) прилагаю.

В интернете нарыл что-то похожее, но как ни пытался переделать, ничего не вышло.



Надеюсь и рассчитываю на Вашу помощь в решении такой сложной задачи.
К сообщению приложен файл: Start.xlsx (19.8 Kb) · Finish.xlsx (19.9 Kb)


Сообщение отредактировал force - Понедельник, 18.08.2014, 02:08
 
Ответить
СообщениеВсем доброго времени суток!

Нужна Ваша помощь с написанием макроса. Есть прайс, где наименование категорий находятся в столбце "А", а остальные семь строк равны нулю, нужно сделать объединение всех восьми строк, с сохранением текста из первой, и фон залить желтым цветом, как указано в примере (файл с наименованием finish).
Исходник (файл с наименованием start) и пример (файл с наименованием finish) прилагаю.

В интернете нарыл что-то похожее, но как ни пытался переделать, ничего не вышло.



Надеюсь и рассчитываю на Вашу помощь в решении такой сложной задачи.

Автор - force
Дата добавления - 18.08.2014 в 01:43
Rioran Дата: Понедельник, 18.08.2014, 09:55 | Сообщение № 2
Группа: Авторы
Ранг: Ветеран
Сообщений: 903
Репутация: 290 ±
Замечаний: 0% ±

Excel 2013
force, здравствуйте.

Можете попробовать такой макрос, привязан к листу с именем "Data":

[vba]
Код
Sub Rio_Painter()

'Author:    Roman Rioran Voronov
'Date:      the 18-th of August, 2014
'Feedback:  voronov_rv@mail.ru

'Purpose:   Solution for excel-world.ru user
'           http://www.excelworld.ru/forum/10-12524-1#

Dim X As Long 'To roll cells

Application.DisplayAlerts = False
Application.ScreenUpdating = False

With ThisWorkbook.Worksheets("Data")
     X = 3
     Do While .Cells(X, 1).Value <> ""
         Debug.Print "Cell " & X
         If Not IsNumeric(.Cells(X, 1).Value) Then
             With .Range(.Cells(X, 1), .Cells(X, 8))
                 .MergeCells = True
                 .HorizontalAlignment = xlCenter
                 .VerticalAlignment = xlCenter
                 .Font.Bold = True
                 .Interior.Color = 65535
                 .Borders(xlEdgeLeft).Weight = xlThin
                 .Borders(xlEdgeTop).Weight = xlThin
                 .Borders(xlEdgeBottom).Weight = xlThin
                 .Borders(xlEdgeRight).Weight = xlThin
             End With
         End If
         X = X + 1
     Loop
End With

Application.ScreenUpdating = True
Application.DisplayAlerts = True

End Sub
[/vba]
К сообщению приложен файл: Rio_Format.xlsm (33.1 Kb)


Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279
 
Ответить
Сообщениеforce, здравствуйте.

Можете попробовать такой макрос, привязан к листу с именем "Data":

[vba]
Код
Sub Rio_Painter()

'Author:    Roman Rioran Voronov
'Date:      the 18-th of August, 2014
'Feedback:  voronov_rv@mail.ru

'Purpose:   Solution for excel-world.ru user
'           http://www.excelworld.ru/forum/10-12524-1#

Dim X As Long 'To roll cells

Application.DisplayAlerts = False
Application.ScreenUpdating = False

With ThisWorkbook.Worksheets("Data")
     X = 3
     Do While .Cells(X, 1).Value <> ""
         Debug.Print "Cell " & X
         If Not IsNumeric(.Cells(X, 1).Value) Then
             With .Range(.Cells(X, 1), .Cells(X, 8))
                 .MergeCells = True
                 .HorizontalAlignment = xlCenter
                 .VerticalAlignment = xlCenter
                 .Font.Bold = True
                 .Interior.Color = 65535
                 .Borders(xlEdgeLeft).Weight = xlThin
                 .Borders(xlEdgeTop).Weight = xlThin
                 .Borders(xlEdgeBottom).Weight = xlThin
                 .Borders(xlEdgeRight).Weight = xlThin
             End With
         End If
         X = X + 1
     Loop
End With

Application.ScreenUpdating = True
Application.DisplayAlerts = True

End Sub
[/vba]

Автор - Rioran
Дата добавления - 18.08.2014 в 09:55
Alex_ST Дата: Понедельник, 18.08.2014, 10:29 | Сообщение № 3
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3209
Репутация: 609 ±
Замечаний: 0% ±

2003
Ну, я понимаю, когда без макроса никак, но в этом-то случае зачем плодить лишнее? :)
Ведь всё элементарно делается:
1. Автофильтром выделяете те строки, где в столбце В 0 (ну, для верности можно ещё и по другим столбцам 0 фильтрануть)
2. Выделяете отфильтрованные заголовки и делаете "Объединить по строкам".



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
СообщениеНу, я понимаю, когда без макроса никак, но в этом-то случае зачем плодить лишнее? :)
Ведь всё элементарно делается:
1. Автофильтром выделяете те строки, где в столбце В 0 (ну, для верности можно ещё и по другим столбцам 0 фильтрануть)
2. Выделяете отфильтрованные заголовки и делаете "Объединить по строкам".

Автор - Alex_ST
Дата добавления - 18.08.2014 в 10:29
force Дата: Понедельник, 18.08.2014, 20:22 | Сообщение № 4
Группа: Пользователи
Ранг: Новичок
Сообщений: 42
Репутация: 1 ±
Замечаний: 0% ±

Excel 2010
Rioran, огромное спасибо, то что нужно! first


Сообщение отредактировал force - Понедельник, 18.08.2014, 20:26
 
Ответить
СообщениеRioran, огромное спасибо, то что нужно! first

Автор - force
Дата добавления - 18.08.2014 в 20:22
force Дата: Понедельник, 18.08.2014, 20:24 | Сообщение № 5
Группа: Пользователи
Ранг: Новичок
Сообщений: 42
Репутация: 1 ±
Замечаний: 0% ±

Excel 2010
2. Выделяете отфильтрованные заголовки и делаете "Объединить по строкам".

В прайсе примерно 45 000 строк, объединение нужно делать руками, или можно как-то автоматом?
Не совсем Ваша мысль понятна.


Сообщение отредактировал force - Понедельник, 18.08.2014, 20:26
 
Ответить
Сообщение
2. Выделяете отфильтрованные заголовки и делаете "Объединить по строкам".

В прайсе примерно 45 000 строк, объединение нужно делать руками, или можно как-то автоматом?
Не совсем Ваша мысль понятна.

Автор - force
Дата добавления - 18.08.2014 в 20:24
Alex_ST Дата: Понедельник, 18.08.2014, 20:35 | Сообщение № 6
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3209
Репутация: 609 ±
Замечаний: 0% ±

2003
Не совсем Ваша мысль понятна.
Ну уж куда понятнее-то?
Вы попробовали автофильтром выделить только заголовки, как я сказал?
1. Автофильтром выделяете те строки, где в столбце В 0 (ну, для верности можно ещё и по другим столбцам 0 фильтрануть)

А после этого ВЫДЕЛИТЬ ВСЁ ОТФИЛЬТРОВАННОЕ и выполнить "Объединить по строкам"?
Ну, единственно, что придётся сделать, так это столько раз, сколько у Вас будет строк заголовков, согласиться с тем, что при объединении данные затрутся.
Хотя и этого можно избежать если в отфильтрованных заголовках сначала перед объединением по строкам выделить всё, что правее столбца А, и стереть его. Тогда там будут не нули, а пустышки и про их стирание при объединении Excel кричать не будет.



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
Сообщение
Не совсем Ваша мысль понятна.
Ну уж куда понятнее-то?
Вы попробовали автофильтром выделить только заголовки, как я сказал?
1. Автофильтром выделяете те строки, где в столбце В 0 (ну, для верности можно ещё и по другим столбцам 0 фильтрануть)

А после этого ВЫДЕЛИТЬ ВСЁ ОТФИЛЬТРОВАННОЕ и выполнить "Объединить по строкам"?
Ну, единственно, что придётся сделать, так это столько раз, сколько у Вас будет строк заголовков, согласиться с тем, что при объединении данные затрутся.
Хотя и этого можно избежать если в отфильтрованных заголовках сначала перед объединением по строкам выделить всё, что правее столбца А, и стереть его. Тогда там будут не нули, а пустышки и про их стирание при объединении Excel кричать не будет.

Автор - Alex_ST
Дата добавления - 18.08.2014 в 20:35
force Дата: Понедельник, 18.08.2014, 21:28 | Сообщение № 7
Группа: Пользователи
Ранг: Новичок
Сообщений: 42
Репутация: 1 ±
Замечаний: 0% ±

Excel 2010
Alex_ST, действительно все просто :) , но все это занимает время, с макросом все гораздо веселее.
Rioran очень выручил, я его макрос уже применил еще в нескольких прайсах.
Всем, кто помогал, ОГРОМНОЕ спасибо!
Очень приятно, когда помогают такие профессионалы, не оставляют в беде... pray
 
Ответить
СообщениеAlex_ST, действительно все просто :) , но все это занимает время, с макросом все гораздо веселее.
Rioran очень выручил, я его макрос уже применил еще в нескольких прайсах.
Всем, кто помогал, ОГРОМНОЕ спасибо!
Очень приятно, когда помогают такие профессионалы, не оставляют в беде... pray

Автор - force
Дата добавления - 18.08.2014 в 21:28
Alex_ST Дата: Понедельник, 18.08.2014, 21:51 | Сообщение № 8
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3209
Репутация: 609 ±
Замечаний: 0% ±

2003
Ну, уж если такую операцию приходится проделывать со многими файлами, то макрос лучше положить в Personal и вместо[vba]
Код
With ThisWorkbook.Worksheets("Data")
[/vba]записать [vba]
Код
With ActiveSheet
[/vba]а на панели инструментов сделать кнопочку для вызова макроса



С уважением,
Алексей
MS Excel 2003 - the best!!!


Сообщение отредактировал Alex_ST - Понедельник, 18.08.2014, 21:52
 
Ответить
СообщениеНу, уж если такую операцию приходится проделывать со многими файлами, то макрос лучше положить в Personal и вместо[vba]
Код
With ThisWorkbook.Worksheets("Data")
[/vba]записать [vba]
Код
With ActiveSheet
[/vba]а на панели инструментов сделать кнопочку для вызова макроса

Автор - Alex_ST
Дата добавления - 18.08.2014 в 21:51
force Дата: Понедельник, 18.08.2014, 22:02 | Сообщение № 9
Группа: Пользователи
Ранг: Новичок
Сообщений: 42
Репутация: 1 ±
Замечаний: 0% ±

Excel 2010
макрос лучше положить в Personal

Дело в том, что в одном файле нужно объединять 8 строк, в другом 6 и тд..., в каждом прайсе разное количество столбцов, поэтому я макрос под каждый прайс подгоняю.
 
Ответить
Сообщение
макрос лучше положить в Personal

Дело в том, что в одном файле нужно объединять 8 строк, в другом 6 и тд..., в каждом прайсе разное количество столбцов, поэтому я макрос под каждый прайс подгоняю.

Автор - force
Дата добавления - 18.08.2014 в 22:02
Alex_ST Дата: Понедельник, 18.08.2014, 22:15 | Сообщение № 10
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3209
Репутация: 609 ±
Замечаний: 0% ±

2003
Ну уж это совсем не проблема: выведите сначала запрос о количестве строк. Да и объединять лучше тогда не с третьей строки начиная, а с запрашиваемой или с той, которая выделена при запуске макроса (можно и её попросить ткнуть в диалоговом окне)



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
СообщениеНу уж это совсем не проблема: выведите сначала запрос о количестве строк. Да и объединять лучше тогда не с третьей строки начиная, а с запрашиваемой или с той, которая выделена при запуске макроса (можно и её попросить ткнуть в диалоговом окне)

Автор - Alex_ST
Дата добавления - 18.08.2014 в 22:15
_Boroda_ Дата: Понедельник, 18.08.2014, 22:32 | Сообщение № 11
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16675
Репутация: 6481 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
в одном файле нужно объединять 8 строк, в другом 6 и тд

А такой вариант макроса? Частично основан на идее Алексея про автофильтр.
[vba]
Код
Sub tt()
     Application.ScreenUpdating = 0
     r_ = ActiveCell.SpecialCells(xlLastCell).Row
     c_ = ActiveCell.SpecialCells(xlLastCell).Column
     With Range(Cells(r_ + 1, 1), Cells(r_ + 1, c_))
         .Merge
         .HorizontalAlignment = xlCenter
         .Interior.ColorIndex = 6
     End With
     ActiveSheet.Range(Cells(1, 1), Cells(r_, c_)).AutoFilter Field:=3, Criteria1:="0"
     Range(Cells(r_ + 1, 1), Cells(r_ + 1, c_)).Copy
     Range(Cells(3, 1), Cells(r_, c_)).SpecialCells(xlCellTypeVisible).PasteSpecial Paste:=xlPasteFormats
     Range("A" & r_ + 1).EntireRow.Delete
     Selection.AutoFilter
     Application.ScreenUpdating = 1
End Sub
[/vba]
К сообщению приложен файл: Start_1.xlsm (28.2 Kb)


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

А такой вариант макроса? Частично основан на идее Алексея про автофильтр.
[vba]
Код
Sub tt()
     Application.ScreenUpdating = 0
     r_ = ActiveCell.SpecialCells(xlLastCell).Row
     c_ = ActiveCell.SpecialCells(xlLastCell).Column
     With Range(Cells(r_ + 1, 1), Cells(r_ + 1, c_))
         .Merge
         .HorizontalAlignment = xlCenter
         .Interior.ColorIndex = 6
     End With
     ActiveSheet.Range(Cells(1, 1), Cells(r_, c_)).AutoFilter Field:=3, Criteria1:="0"
     Range(Cells(r_ + 1, 1), Cells(r_ + 1, c_)).Copy
     Range(Cells(3, 1), Cells(r_, c_)).SpecialCells(xlCellTypeVisible).PasteSpecial Paste:=xlPasteFormats
     Range("A" & r_ + 1).EntireRow.Delete
     Selection.AutoFilter
     Application.ScreenUpdating = 1
End Sub
[/vba]

Автор - _Boroda_
Дата добавления - 18.08.2014 в 22:32
force Дата: Понедельник, 18.08.2014, 23:01 | Сообщение № 12
Группа: Пользователи
Ранг: Новичок
Сообщений: 42
Репутация: 1 ±
Замечаний: 0% ±

Excel 2010
А такой вариант макроса? Частично основан на идее Алексея про автофильтр.

Такой вариант тоже подходит, но все работает если в ячейках прописаны нули, а если ячейка пуста, то макрос прекращает работу на этом этапе:
Код

Range(Cells(3, 1), Cells(r_, c_)).SpecialCells(xlCellTypeVisible).PasteSpecial Paste:=xlPasteFormats
К сообщению приложен файл: price_online.xlsm (60.6 Kb)


Сообщение отредактировал force - Понедельник, 18.08.2014, 23:05
 
Ответить
Сообщение
А такой вариант макроса? Частично основан на идее Алексея про автофильтр.

Такой вариант тоже подходит, но все работает если в ячейках прописаны нули, а если ячейка пуста, то макрос прекращает работу на этом этапе:
Код

Range(Cells(3, 1), Cells(r_, c_)).SpecialCells(xlCellTypeVisible).PasteSpecial Paste:=xlPasteFormats

Автор - force
Дата добавления - 18.08.2014 в 23:01
_Boroda_ Дата: Вторник, 19.08.2014, 00:08 | Сообщение № 13
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16675
Репутация: 6481 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
а остальные семь строк равны нулю

а если ячейка пуста

Может, стоит все-таки определиться как-то уже, что у Вас там прописано?
Если и так, и эдак, то перепишите строку после End With вот так
[vba]
Код
ActiveSheet.Range(Cells(1, 1), Cells(r_, c_)).AutoFilter Field:=3, Criteria1:="=0", Operator:=xlOr, Criteria2:="="
[/vba]
К сообщению приложен файл: Start_2.xlsm (27.3 Kb)


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

а если ячейка пуста

Может, стоит все-таки определиться как-то уже, что у Вас там прописано?
Если и так, и эдак, то перепишите строку после End With вот так
[vba]
Код
ActiveSheet.Range(Cells(1, 1), Cells(r_, c_)).AutoFilter Field:=3, Criteria1:="=0", Operator:=xlOr, Criteria2:="="
[/vba]

Автор - _Boroda_
Дата добавления - 19.08.2014 в 00:08
force Дата: Вторник, 19.08.2014, 00:42 | Сообщение № 14
Группа: Пользователи
Ранг: Новичок
Сообщений: 42
Репутация: 1 ±
Замечаний: 0% ±

Excel 2010
Может, стоит все-таки определиться как-то уже, что у Вас там прописано?

Дело в том что в разных прайсах по-разному прописано, не серчайте.

Вы сделали то что нужно, все прекрасно работает respect
Спасибо Вам большое!


Сообщение отредактировал force - Вторник, 19.08.2014, 00:54
 
Ответить
Сообщение
Может, стоит все-таки определиться как-то уже, что у Вас там прописано?

Дело в том что в разных прайсах по-разному прописано, не серчайте.

Вы сделали то что нужно, все прекрасно работает respect
Спасибо Вам большое!

Автор - force
Дата добавления - 19.08.2014 в 00:42
RAN Дата: Вторник, 19.08.2014, 01:01 | Сообщение № 15
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Саш, проще :D
[vba]
Код
ActiveWindow.DisplayZeros = False
ActiveSheet.Range(Cells(1, 1), Cells(r_, c_)).AutoFilter Field:=3, Criteria1:="="
[/vba]


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеСаш, проще :D
[vba]
Код
ActiveWindow.DisplayZeros = False
ActiveSheet.Range(Cells(1, 1), Cells(r_, c_)).AutoFilter Field:=3, Criteria1:="="
[/vba]

Автор - RAN
Дата добавления - 19.08.2014 в 01:01
force Дата: Вторник, 19.08.2014, 01:39 | Сообщение № 16
Группа: Пользователи
Ранг: Новичок
Сообщений: 42
Репутация: 1 ±
Замечаний: 0% ±

Excel 2010
%) Я за Вами не успеваю :)
 
Ответить
Сообщение%) Я за Вами не успеваю :)

Автор - force
Дата добавления - 19.08.2014 в 01:39
RAN Дата: Вторник, 19.08.2014, 01:48 | Сообщение № 17
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
?? :D
К сообщению приложен файл: 8536827.gif (19.7 Kb)


Быть или не быть, вот в чем загвоздка!
 
Ответить
Сообщение?? :D

Автор - RAN
Дата добавления - 19.08.2014 в 01:48
Alex_ST Дата: Вторник, 19.08.2014, 09:14 | Сообщение № 18
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3209
Репутация: 609 ±
Замечаний: 0% ±

2003
[offtop]Что-то уж очень не добрый ты, Андрей, в 2 часа ночи… :'(
И вообще, ребята, вы что, все в отпусках что ли и утром на работу не вставать?[/offtop]



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
Сообщение[offtop]Что-то уж очень не добрый ты, Андрей, в 2 часа ночи… :'(
И вообще, ребята, вы что, все в отпусках что ли и утром на работу не вставать?[/offtop]

Автор - Alex_ST
Дата добавления - 19.08.2014 в 09:14
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Объединение строк и выделение цветом (макрос) (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!