2011-12-19 146 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