2013-03-15 2 views
1

У меня есть подача на моем листе excel и требуется, чтобы ячейка мигала зеленым/красным цветом, если значение изменяется вверх или вниз соответствующим образом. Может кто-нибудь помочь в этом? Благодарю.Мигает зеленым цветом, когда значение ячейки увеличивается, красный при уменьшении

Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim KeyCells As Range 

    Set KeyCells = Range("B1:B27") 

    If Not Application.Intersect(KeyCells, Range(Target.Address)) _ 
      Is Nothing Then 

     Target.Interior.ColorIndex = 36 

    End If 
End Sub 

Спасибо за помощь

+0

Что-то не упомянутое ниже, если вы не хотите иметь вторичные столбцы для предыдущих значений, вы можете использовать 'Application.Undo' в событии' Worksheet_Change' для получения предыдущего значения ячейки, а затем '.Redo ', и сравните их. Будьте осторожны, если диапазон «Worksheet_Change» больше, чем одна ячейка (т. Е. Вставить действия) или вызвал изменение макроса моей ячейки, и в этом случае история отмены отменяется. – Alain

ответ

0

... Вы не можете действительно сделать это вспышка, но вы можете изменить затенение ...

То, как я бы это, где-то который используется в рабочей книге, создайте набор ячеек, которые будут хранить старые значения ячеек (вы можете установить эти ячейки в событии Worksheet_Change), то это просто вопрос создания правила условного формата для ваших ячеек, чтобы сравнить значение вашей ячейки с значение хелперной ячейки - если больше, затенение = зеленый, если меньше, sahding = красный.

Надеюсь, что это имеет смысл.

0

Как сказал Джон Бустос, вам нужна другая колонка, в которой находится ячейка previous value. Это значение необходимо для сравнения, чтобы различить, если цель теперь выше или ниже.

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

КОД

Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim KeyCells As Range 
    Set KeyCells = Range("B1:B27") 

    If Not Application.Intersect(KeyCells, Range(Target.Address)) _ 
      Is Nothing Then 
     If Target.Value > Cells(Target.Row, 5).Value Then 
      'flash green 
      Target.Interior.ColorIndex = 10 
      Pause 0.5 
      Target.Interior.ColorIndex = 2 
      Pause 0.5 
      Target.Interior.ColorIndex = 10 
     ElseIf Target.Value < Cells(Target.Row, 5).Value Then 
      'flash red 
      Target.Interior.ColorIndex = 3 
      Pause 0.5 
      Target.Interior.ColorIndex = 2 
      Pause 0.5 
      Target.Interior.ColorIndex = 3 
     End If 
     Cells(Target.Row, 5).Value = Target.Value 
    End If 
End Sub 

'Pauses execution without holding up main UI thread 
Public Function Pause(NumberOfSeconds As Variant) 
    On Error GoTo Error_GoTo 
    Dim PauseTime As Variant 
    Dim Start As Variant 

     PauseTime = NumberOfSeconds 
     Start = Timer 
     Do While Timer < Start + PauseTime 
      DoEvents 
     Loop 

Exit_GoTo: 
     On Error GoTo 0 
     Exit Function 
Error_GoTo: 
     Debug.Print Err.Number, Err.Description, Erl 
     GoTo Exit_GoTo 
End Function 

Откройте редактор Visual Basic (VBE) и дважды щелкните лист 1, а затем вставьте код выше. Теперь вы заметите, как вы измените значения в пределах целевого диапазона B1:B27 значение, которое будет помещено в столбец E. Вы можете изменить это в коде выше, заменив 5 на Cells(Target.Row, 5).Value на любой колонтитул, который вы хотите.

Теперь, когда значения увеличиваются или уменьшаются, ячейка будет мигать, чтобы отразить изменение.

Функция Pause была найдена на this SO Post.

+0

Вместо 'Пауза' вы можете использовать' Application.OnTime' для регистрации сигнала тревоги, чтобы вернуться к исходному цвету фона ячейки? – kevinarpe