Страницы: 1
RSS
Макрос форматирования предварительно выделенного диапазона ячеек
 
Здравствуйте. Нужно реализовать макрос, который заливает цветом предварительно выделенные ячейки (ячейку) и который срабатывает по выделению определённой ячейки. В прикреплённом файле макрос заливает цветом ту ячейку, по выделению которой он срабатывает (А1). То есть нужно как-то запомнить предварительно выделенный диапазон и уже к нему применить форматирование. Возможно ли это? Тогда, наверное, макрос должен начинать работу ещё при выделении диапазона ячеек?
 
да, вы абсолютно правы, нужно где-то сохранять адрес выделения и при выборе указанной ячейки работать именно с записью
Живи и дай жить..
 
А не проще будет заливать цветом выделенные ячейки не по выделению ячейки, а по другому действию?  
Неизлечимых болезней нет, есть неизлечимые люди.
 
Можно так:
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Static rng As Range
    If Target.Address = "$A$1" Then
        If Not rng Is Nothing Then
            rng.Interior.ColorIndex = 3
            Set rng = Nothing
        End If
    Else: Set rng = Target
    End If
End Sub
Пример во вложении.
Чем шире угол зрения, тем он тупее.
 
Спасибо, SAS888, это то, что нужно!

Цитата
TheBestOfTheBest написал: А не проще будет заливать цветом выделенные ячейки не по выделению ячейки, а по другому действию?
Запуск макроса по выделению ячейки нужен для появления примечания-подсказки при расположении курсора над ячейкой.
 
Уважаемые знатоки Excel, подскажите, пожалуйста, ещё один момент: Ячеек, управляющих заливкой диапазонов несколько (одна заливает одним цветом, вторая - другим, третья - убирает заливку). Проблема в том, что "управляющие" ячейки заливают друг друга. Чего быть не должно. То есть в макросе нужно добавить строку "Если выделенная ячейка принадлежит столбцу А (или выделенный диапазон содержит столбец А), то макрос срабатывать не должен". Как реализовать это условие?
 
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
On Error Resume Next
Select Case Target.Address
    Case "$A$2" 'выделение зелёным
        Static kkan As Range
        If Not kkan Is Nothing And Intersect(kkan, Columns(1)) Is Nothing Then
           kkan.Interior.ColorIndex = 35
           Set kkan = Nothing
        End If
    Case "$A$4" 'выделение синим
        Static kzdor As Range
        If Not kzdor Is Nothing And Intersect(kzdor, Columns(1)) Is Nothing Then
           kzdor.Interior.ColorIndex = 37
           Set kzdor = Nothing
        End If
    Case "$A$6" 'очистка ячейки
        Static kdel As Range
        If Not kdel Is Nothing And Intersect(kdel, Columns(1)) Is Nothing Then
               kdel.Interior.ColorIndex = xlNone
        Set kdel = Nothing
        End If
    Case Else
        Set kkan = Target
        Set kzdor = Target
        Set kdel = Target
End Select
End Sub
Изменено: Sanja - 25.07.2015 18:30:42
Согласие есть продукт при полном непротивлении сторон
 
Sanja, огромное Вам спасибо! В Вашем примере все "ячейки-кнопки" отрабатывают своё действие  по 1 разу с предварительно выделенным диапазоном не форматируя друг друга. А можно ли сделать работу "ячеек-кнопок" с предварительно выделенным диапазоном многократной? То есть предварительно выделенный диапазон после срабатывания макроса снова должен выделяться. Это было бы лучше и с точки зрения наглядности - видно какой диапазон будет сейчас отформатирован.
 
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
On Error Resume Next
Select Case Target.Address
    Case "$A$2" 'выделение зелёным
        Static kkan As Range
        If Not kkan Is Nothing And Intersect(kkan, Columns(1)) Is Nothing Then
           kkan.Interior.ColorIndex = 35
           kkan.Select
           Set kkan = Nothing
        End If
    Case "$A$4" 'выделение синим
        Static kzdor As Range
        If Not kzdor Is Nothing And Intersect(kzdor, Columns(1)) Is Nothing Then
           kzdor.Interior.ColorIndex = 37
           kzdor.Select
           Set kzdor = Nothing
        End If
    Case "$A$6" 'очистка ячейки
        Static kdel As Range
        If Not kdel Is Nothing And Intersect(kdel, Columns(1)) Is Nothing Then
            kdel.Interior.ColorIndex = xlNone
            kdel.Select
            Set kdel = Nothing
        End If
    Case Else
        Set kkan = Target
        Set kzdor = Target
        Set kdel = Target
End Select
End Sub
Файл не прикрепляется
Изменено: Sanja - 26.07.2015 11:08:24
Согласие есть продукт при полном непротивлении сторон
 
Sanja, реализовал Ваше решение. Ещё до удаления "лучшего" файла пробовал реализовать и его - код не срабатывает. Хотя, конечно, он лучше подойдёт для большого количества "ячеек-кнопок" (у меня их 6). И ещё один важный для меня момент: макрос не работает, если включена защита листа (с возможностью выделения ячеек). Дело в том, что в форматируемых ячейках будут находиться формулы, поэтому их защита от изменений должна быть однозначно. Возможно ли заставить работать макрос при включенной защите?  
 
Пароль на лист - 123
Согласие есть продукт при полном непротивлении сторон
 
Цитата
jurij271 написал: Возможно ли заставить работать макрос при включенной защите?
КАК ЗАЩИТИТЬ ЛИСТ ОТ ПОЛЬЗОВАТЕЛЯ, НО НЕ ОТ МАКРОСА?
 
Извините, конечно моё упоминание о запуске макроса при включенной защите листа не входит в рассматриваемую тему.  Нужно было сначала поискать. Как-то "на автомате" получилось - уж очень шокировало  не срабатывание кода при включенной защите ("Как, и это всё напрасно???"). Ещё раз приношу извинения...
Изменено: jurij271 - 29.07.2015 09:36:46
 
Sanja, ещё раз выражаю Вам свою благодарность за помощь в решении этой задачи. В принципе это решение вполне удовлетворяет. Но поскольку предела совершенству нет, наберусь ещё наглости и попрошу посмотреть прилагаемый файл. Рабочие зоны предназначенные для форматирования - это области где находится календарь, заливку дней которого нужно производить. Между этими зонами (строки между группами месяцев календаря) ячейки заливать не нужно (то есть пользователю должны быть предоставлены для форматирования только определённые области листа). Пытался решить такую задачу указывая в параметрах Intersect наряду с Columns ещё и Rows, однако это не проходит (не действует "защита" даже столбца). Удаётся защитить от форматирования диапазон, указав в параметрах Intersect Range(Cells(х1, y1), Cells(x2, y2)). Но таким образом защищается от форматирования только одна область, указание в параметрах Intersect нескольких областей (Intersect(..., Range(Cells(х1, y1), Cells(x2, y2)), Range(Cells(х3, y3), Cells(x4, y4)))) тоже не проходит, также не работает "защита" ни одной зоны. Подозреваю, что я неправильно понимаю смысл строки, где указываются "защищаемые" области и указание нескольких параметров является взаимоисключающим. Если предложенная структура листа не окажется чрезвычайно трудоёмкой для решения и у Вас будет возможность помочь в её реализации - буду Вам очень признателен! С уважением, Юрий Чиркин.
Изменено: jurij271 - 29.07.2015 08:22:10
 
1. Вопрос не по теме. Защита - это не форматирование.
2. Наглость - второе счастье? :)
Может, имеет смысл разместить задачу в платном разделе или связаться в личке? Сможете отблагодарить Sanja не только словесно.
 
Договорились разместить решение на форуме
Согласие есть продукт при полном непротивлении сторон
Страницы: 1
Наверх