2015-08-20 2 views
2

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

Следующий код делает этот штраф, но не восстанавливает первоначальный цвет фона, когда я перехожу на другую линию:

Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) 

    Static rr 

    If rr <> "" Then 
     With Rows(rr).Interior 
      .ColorIndex = xlNone 
     End With 
    End If 


    r = Selection.Row 
    rr = r 

    With Rows(r).Interior 
     .ColorIndex = 39 
     .Pattern = xlSolid 
    End With 

End Sub 

Пожалуйста, кто может предложить способ я могу изменить код, чтобы восстановить оригинальный фон, когда я двигаться дальше?

ответ

1

Вам необходимо сохранить предыдущий формат где-то, вместо того, чтобы устанавливать .ColorIndex = xlNone, вы восстанавливаете предыдущий формат. Нижеприведенный код работает, вставив формат в последнюю строку листа, а затем вставку Special/Formats для его восстановления. Не очень элегантный, но он работает.

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
     Static lngPrevRow As Long 
     Dim rngActiveCell As Range 

     On Error GoTo errorHandler 

     'prevent this code from triggering itself when it changes the selection 
     Application.EnableEvents = False 

     Application.ScreenUpdating = False 

     'save active cell, as messing about with copy and paste will change the active cell 
     Set rngActiveCell = ActiveCell 

     If lngPrevRow <> 0 Then 
       'paste saved format to previous row 
       ActiveSheet.Rows(ActiveSheet.Rows.Count).Copy 
       ActiveSheet.Rows(lngPrevRow).PasteSpecial xlPasteFormats 

       'save current row's format at end of sheet 
       ActiveSheet.Rows(rngActiveCell.Row).Copy 
       ActiveSheet.Rows(ActiveSheet.Rows.Count).PasteSpecial xlPasteFormats 
       'tidy up 
       Application.CutCopyMode = False 
       Target.Select 
     End If 

     lngPrevRow = rngActiveCell.Row 

     'highlight active row 
     With ActiveSheet.Rows(rngActiveCell.Row).Interior 
       .ColorIndex = 39 
       .Pattern = xlSolid 
     End With 

     Application.ScreenUpdating = True 
     Application.EnableEvents = True 

     Exit Sub 

errorHandler: 
     'other error handling code here... 
     Application.ScreenUpdating = True 
     Application.EnableEvents = True 
End Sub 

Things отметить:

  • всегда объявлять переменные как тип (например As Long) - это предотвращает все виды тонких ошибок
  • настройки Application.ScreenUpdating = False на старте ускоряет вещи и предотвращает мерцание (но не забудьте вернуть его обратно в True)
  • это (как с вашим исходным кодом) не очень хорошо подходит для многострочных выборов. Его можно было бы расширить, чтобы сделать это (например, используя Target.EntireRow вместо ActiveSheet.Rows(rngActiveCell.Row)), но с дополнительной сложностью (вам нужно было бы сохранить количество строк предыдущего выбора и т. Д. И т. Д.).
+0

Привет, спасибо за совет, но то, что вы предложили, по-прежнему не справляется с проблемой потери цветов фона, уже присутствующих в определенных столбцах. Я не уверен, есть ли простой способ восстановить цвета фона, объявив их с самого начала? –

+0

Код копирует существующий фон перед выделением, затем копирует его, поэтому не должно быть никаких обстоятельств, когда он потеряет фон. Действительно ли мой код работает для вас? Есть ли что-то необычное в конкретных столбцах, где оно не работает? – aucuparia

+0

Спасибо за ваш ответ. Я проверил еще раз и понял, что ошибся в своем предыдущем коде. Теперь ваше решение отлично работает, спасибо за вашу помощь. С уважением, Eric –

Смежные вопросы