Новости:

К первому сообщению темы должен быть прикреплен файл примера в формате xls*.
Приложив пример, Вы избавите себя и других от вопросов типа "А какой критерий?", "А куда выводить результат?", "А сколько строк?" и все тех же просьб выложить файл. Рисовать за Вас Ваши же таблички с заданиями, а затем и решение к ним, никто желанием не горит. Да и, как показывает практика, в большинстве случаев без файла решения не найти.

Главное меню

Как вернуть ячейке прежнюю заливку при щелчке...

Автор machodg, 22.05.2011, 19:35

« назад - далее »

machodg

Здравствуйте.
На листе эксел столбец с ячейками разного цвета. При использовании моего кода:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
   If ActiveCell.Value = 0 Or ActiveCell.Column <> 6 Then Exit Sub Else
        Application.ScreenUpdating = False
        Sheets(1).Columns(6).Interior.ColorIndex = 0
        ActiveCell.Interior.ColorIndex = 8
        Cells(2, 3) = ActiveCell.Offset(0, -1)
        Application.ScreenUpdating = True
End Sub

подсвечивается выделенная ячечка, однако обесцвечиваются и все остальные.
Как исправить код, чтобы после щелчка цвет предыдущей и остальных ячеек возвращался  к исходному цвету.
Заранее всех благодарарю за помощь.

Alex_ST

#1
1. Не принципиально, но лучше в данном случае использовать не ActiveCell , а Target(1) т.к. случайно может быть выделено несколько ячеек и при этом выделено не справа-налево, сверху-вниз, когда ActiveCell и будет первой ячейкой выделенного диапазона - Target(1), а как-то "набекрень" (ну, снизу-вверх, например). Тогда ActiveCell окажется самой нижней ячейкой выделения, а Target(1) так и останется самой левой верхней.
Да и вообще, в вашем случае скорее всего нужно сразу проверять, а не выделено ли более одной ячейки?
If target.cells.count >1 then exit sub

2. Наверное, в вашей таблице все ячейки столбца 6 имеют разную заливку (иначе не было бы вопроса, как её восстановить).
Тогда можно, например, ввести глобальную на уровне модуля переменную, в которую записывать адрес (или просто номер строки, т.к. столбец известен) последней активированной ячейки 6-го столбца и её исходный цвет до того, как её обесцвечивать по "клику".
Тогда при следующем клике по какой-то другой ячейке 6-го столбца сначала можно будет восстановить исходный цвет предыдущей обесцвеченной ячейки, потом запомнить в переменной адрес и цвет новой ячейки, а потом уже её обесцветить.
Ну, как-то так примерно... Надеюсь, доработать свой макрос сможете сами.


Прочитал внимательно ваш пост и понял, что предложенный вариант не проходит, т.к. вы как раз обесцвечиваете все ячейки столбца, а выделенную красите...
Тогда, наверное, проще всего использовать скрытый столбец, в котором можно будет форматом по образцу хранить исходные цвета ячеек и восстанавливать их оттуда при смене активной ячейки.
С уважением, Алексей

machodg

Спасибо
Я несколько модернизировал код, исходя из того, что нет необходимости обесцвечивать весь столбец.
Тогда отпадает надобность запоминать все цвета в столбце. Все получается как мне надо, но без MSGBOX ничего придумать не смог.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

If Target(1).Value = 0 Or Target(1).Column <> 6 Then Exit Sub Else
        Application.ScreenUpdating = False
        'Sheets(1).Columns(6).Interior.ColorIndex = 0
        Col = Target(1).Interior.ColorIndex 'сохранили цвет исходной ячейки
        R = Target(1).Row                   'сохранили строку исходной ячейки
       
        Target(1).Interior.ColorIndex = 8 'подсветка исходной ячейки
        Cells(2, 3) = Target(1).Offset(0, -1)
        Application.ScreenUpdating = True

        MsgBox ("OK")
       
       Cells(R, 6).Interior.ColorIndex = Col 'возвращение ячейки к исходному цвету
End Sub
Можно ли обойтись без этого прерывания и как?
Еще раз спасибо

Oleg X

можно сохранять начальные параметры ячейки, например в ячейках A1,A2,A3  а потом их восстанавливать
(если явно на листе сохранять нельзя, мохно сохранять в примечании)

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
   If ActiveCell.Value = 0 Or ActiveCell.Column <> 6 Then Exit Sub Else
        c = ActiveCell.Interior.ColorIndex
        i = ActiveCell.Row
        j = ActiveCell.Column
        ActiveCell.Interior.ColorIndex = 8
        Cells(2, 3) = ActiveCell.Offset(0, -1)
        If [A2] > 0 Then Cells([A2], [A3]).Interior.ColorIndex = [A1]
        [A1] = c
        [A2] = i
        [A3] = j
End Sub
NULL

Alex_ST

Переменные для хранения значений номера строки и цвета нужно определить через dim в декларациях модуля, а не в процедуре.
Иначе их значение потеряться может.

А зачем у вас там вообще этот MsgBox стоит?
Если не нужен, так и уберите его.

Примерно так выглядеть должно:
Option Explicit
Dim PrewColor, PrewRow As Long

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If Target(1).Value = 0 Or Target(1).Column <> 6 Then Exit Sub Else
  Application.EnableEvents = False
  If PrewRow > 0 Then Cells(PrewRow, 6).Interior.ColorIndex = PrewColor      'возвращение ПРЕДЫДУЩЕЙ ячейки к исходному цвету
  PrewColor = Target(1).Interior.ColorIndex      'сохранили цвет НОВОЙ ячейки
  PrewRow = Target(1).Row                        'сохранили строку НОВОЙ ячейки
  Target(1).Interior.ColorIndex = 8      'подсветка НОВОЙ ячейки
  Cells(2, 3) = Target(1).Offset(0, -1)
  Application.EnableEvents = True
End Sub

проверил. работает.
С уважением, Алексей

machodg

Огромное всем спасибо!
Работает именно как надо.