2011-12-19 144 views
0

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

例如,当价格变化时(它通过RTD公式包含的新价格发生变化),最初绿色的单元格会变为红色,然后在新价格到达时变回绿色,等等......Excel:或者更改单元格颜色作为单元格值更改

+1

为什么不使用条件格式?这意味着你不依赖于用户启用宏。 – Reafidy 2011-12-19 23:41:23

+0

尝试进一步具体地使用条件格式:我认为这是一个不行,因为它是基于价值的(大,小,平等等),我发现没有办法去做我想要的,因为我只是想跟踪“任何“改变的细胞。 – 2011-12-20 11:29:12

回答

3

也许这可以让你开始? 当实时数据刷新时,引发一个事件。 概念SIS的实时数据存储在variabele并检查它是否已经改变

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 
+0

谢谢,我会给它一个镜头,并让你张贴。我希望它不会超载性能:-) – 2011-12-20 11:26:00

+0

我不知道如何将您的主张概括为“N”个单元格,因为我有一整张RTD单元格。理想情况下,我想检测任何单元格上的更改,而不仅仅是一个特定的单元格 – 2011-12-20 12:02:11

+0

也许你可以使用(隐藏)工作表让你在更新前复制旧值,然后使用条件格式显示更改。 – Arnoldiusss 2011-12-20 13:36:09

0

该解决方案reposonds到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 
0

前面的答案都假设实时数据馈送触发工作表事件。我在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 
1
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 
0

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

什么最终为我工作是:

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