【问题标题】:Excel : Alternatively Change Cell Color as Cell Value ChangesExcel:或者在单元格值更改时更改单元格颜色
【发布时间】:2012-01-23 23:12:36
【问题描述】:

我开发了一个 Excel 实时数据馈送 (RTD) 来监控到达时的股票价格。
我想找到一种方法来随着价格的变化改变单元格的颜色。

例如,一个单元格最初的绿色会在值发生变化时变为红色(通过它包含的 RTD 公式在其上出现新价格),然后在新价格到达时变回绿色,依此类推......

【问题讨论】:

  • 为什么不使用条件格式?这意味着您不依赖用户启用宏。
  • 尝试更具体地使用条件格式:我认为这是不行的,因为它是基于值的(更大、更少、相等等),我发现没有办法做我想做的事因为我只想跟踪单元格上的“任何”变化。

标签: excel vba


【解决方案1】:

也许这可以让你开始? 我假设刷新实时数据时会引发一个事件。 将实时数据存储在变量中并检查它是否已更改的概念 sis

 Dim rtd As String

 Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    With ActiveSheet.Range("A1")
        If .Value <> rtd Then
            Select Case .Interior.ColorIndex
                Case 2
                    .Interior.ColorIndex = 3
                Case 3
                    .Interior.ColorIndex = 4
                Case 4
                    .Interior.ColorIndex = 3
                Case Else
                    .Interior.ColorIndex = 2
            End Select
        Else
            .Interior.ColorIndex = 2

        End If
        rtd = .Value
    End With

End Sub

【讨论】:

  • 谢谢,我会试一试,并及时通知您。我希望它不会超载性能:-)
  • 我不知道如何将您的建议推广到“N”个单元格,因为我有一整张 RTD 单元格。理想情况下,我想检测任何单元格的变化,而不仅仅是一个特定的单元格
  • 也许你可以使用一个(隐藏的)表格来让你在更新之前复制旧值,然后使用条件格式来显示更改。
  • Worksheet_SelectionChange 在选择更改时调用,而不是在值更改时调用。
【解决方案2】:
Sub Worksheet_Change(ByVal ChangedCell As Range)

  ' This routine is called whenever the user changes a cell.
  ' It is not called if a cell is changed by Calculate.

  Dim ColChanged As Integer
  Dim RowChanged As Integer

  ColChanged = ChangedCell.Column
  RowChanged = ChangedCell.Row

  With ActiveSheet
    If .Cells(RowChanged, ColChanged).Interior.ColorIndex = 19 Then
      ' Changed cell is red.  Set it to green.
      .Cells(RowChanged, ColChanged).Interior.ColorIndex = 19
    Else
      ' Changed cell is not red.  Set it to red.
      .Cells(RowChanged, ColChanged).Interior.ColorIndex = 19
    End If
  End With

End Sub

【讨论】:

    【解决方案3】:

    此解决方案响应 Calculation 事件。我不完全确定 RTD 更新是否会触发此问题,因此您需要进行试验。

    将此代码添加到包含您的 RTD 调用的 Worksheet 模块。

    它将上次计算的工作表数据副本保存在内存中,并在每次计算时比较新值。
    它将其作用限制在包含您的公式的单元格中。

    Option Explicit
    
    Dim vData As Variant
    Dim vForm As Variant
    
    Private Sub Worksheet_Calculate()
        Dim vNewData As Variant
        Dim vNewForm As Variant
        Dim i As Long, j As Long
    
        If IsArray(vData) Then
            vNewData = Me.UsedRange
            vNewForm = Me.UsedRange.Formula
            For i = LBound(vData, 1) To UBound(vData, 1)
            For j = LBound(vData, 2) To UBound(vData, 2)
                ' Change this to match your RTD function name
                If vForm(i, j) Like "=YourRTDFunction(*" Then  
                    If vData(i, j) <> vNewData(i, j) Then
                        With Me.Cells(i, j).Interior
                            If .ColorIndex = 3 Then
                                .ColorIndex = 4
                            Else
                                .ColorIndex = 3
                            End If
                        End With
                    End If
                End If
            Next j, i
        End If
        vData = Me.UsedRange
        vForm = Me.UsedRange.Formula
    
    End Sub
    

    【讨论】:

      【解决方案4】:

      前面的两个答案都假设实时数据馈送会触发工作表事件。我在 RTD 文件中找不到任何东西来证实或否认这一假设。但是,如果它确实触发了工作表事件,我会认为 Worksheet_Change 会是最有用的,因为它可以识别已更改的单元格。

      以下可能值得一试。它必须放在相关工作表的代码区域中。

      Option Explicit
      Sub Worksheet_Change(ByVal ChangedCell As Range)
      
        ' This routine is called whenever the user changes a cell.
        ' It is not called if a cell is changed by Calculate.
      
        Dim ColChanged As Integer
        Dim RowChanged As Integer
      
        ColChanged = ChangedCell.Column
        RowChanged = ChangedCell.Row
      
        With ActiveSheet  
          If .Cells(RowChanged, ColChanged).Font.Color = RGB(255, 0, 0) then 
            ' Changed cell is red.  Set it to green.
            .Cells(RowChanged, ColChanged).Font.Color = RGB(0, 255, 0)
          Else
            ' Changed cell is not red.  Set it to red.
            .Cells(RowChanged, ColChanged).Font.Color = RGB(255, 0, 0)
          End If
        End With
      
      End Sub
      

      【讨论】:

        【解决方案5】:

        我也在寻找相同的东西。我的场景就像从列表中选择值时更改单元格的颜色。每个列表项对应一种颜色。

        最终对我有用的是:

        Private Sub Worksheet_Change(ByVal Target As Range)
        
            Set MyPlage = Range("B2:M50")
        
            For Each Cell In MyPlage
        
                Select Case Cell.Value
        
                 Case Is = "Applicable-Incorporated"
        
                    Cell.Font.Color = RGB(0, 128, 0)
                Case Is = "Applicable/Not Incorporated"
                    Cell.Font.Color = RGB(255, 204, 0)
        
                Case Is = "Not Applicable"
                    Cell.Font.Color = RGB(0, 128, 0)
        
                Case Else
                    Cell.EntireRow.Interior.ColorIndex = xlNone
        
                End Select
        
            Next
        
            ActiveWorkbook.Save
        
        End Sub
        

        【讨论】:

          【解决方案6】:

          或者,最简单的是这段代码:

          Private Sub Worksheet_Change(ByVal Target As Range)
              Target.Interior.ColorIndex = 6 ': yellow
          End Sub
          

          【讨论】:

            猜你喜欢
            • 2020-09-25
            • 2013-03-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-11-12
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多