【问题标题】:Flashing green when cell value increases, red when decreases单元格值增加时闪烁绿色,减少时闪烁红色
【发布时间】:2013-03-04 04:52:44
【问题描述】:

我的 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

感谢您的帮助

【问题讨论】:

  • 下面没有提到的东西,如果你不想有以前的值的辅助列,你可以在Worksheet_Change事件中使用Application.Undo来获取一个单元格的以前的值,然后.Redo,然后比较两者。如果Worksheet_Change 范围大于一个单元格(即粘贴操作)或导致我的宏更改单元格,请小心,在这种情况下,撤消历史记录通常会被禁用。

标签: excel colors cells vba


【解决方案1】:

正如 John Bustos 所说,您需要另一列包含单元格的 previous value。这个值是必要的,以便进行比较以辨别目标现在是更高还是更低。

为了实现flash,您需要在代码中设置暂停而不冻结主UI。此代码未经过测试或保证按您的意愿工作,但它应该作为一个很好的起点。

代码

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) 并双击 Sheet 1,然后粘贴上面的代码。现在,当您更改目标范围B1:B27 内的值时,您会注意到一个值被放置在E 列中。您可以在上面的代码中更改这一点,方法是将Cells(Target.Row, 5).Value 中的5 替换为您想要的任何列。

现在随着值的增加或减少,单元格会闪烁以反映变化。

Pause 函数在 this SO Post 上找到。

【讨论】:

  • 可以用Application.OnTime代替Pause注册一个闹钟来恢复原来的单元格背景色吗?
【解决方案2】:

...你不能真的让它闪烁,但你可以改变阴影...

我会这样做的方式是,在工作簿中未使用的某个地方,创建一组单元格来存储单元格旧值(您可以在Worksheet_Change 事件中设置这些单元格),然后就可以了为您的单元格创建条件格式规则以将您的单元格的值与辅助单元格的值进行比较 - 如果较大,阴影 = 绿色,如果较小,则 sahding = 红色。

希望这是有道理的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    • 1970-01-01
    • 1970-01-01
    • 2011-11-04
    相关资源
    最近更新 更多