我開發了一個Excel實時數據源(RTD)來監視股票價格。
我想找到一種方法來改變價格變化的單元格的顏色。
例如,當價格變化時(它通過RTD公式包含的新價格發生變化),最初綠色的單元格會變爲紅色,然後在新價格到達時變回綠色,等等......Excel:或者更改單元格顏色作爲單元格值更改
回答
也許這可以讓你開始? 當實時數據刷新時,引發一個事件。 概念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
謝謝,我會給它一個鏡頭,並讓你張貼。我希望它不會超載性能:-) – 2011-12-20 11:26:00
我不知道如何將您的主張概括爲「N」個單元格,因爲我有一整張RTD單元格。理想情況下,我想檢測任何單元格上的更改,而不僅僅是一個特定的單元格 – 2011-12-20 12:02:11
也許你可以使用(隱藏)工作表讓你在更新前複製舊值,然後使用條件格式顯示更改。 – Arnoldiusss 2011-12-20 13:36:09
該解決方案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
前面的答案都假設實時數據饋送觸發工作表事件。我在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
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
我一直在尋找相同。我的方案就像在從列表中選擇值時更改單元格的顏色。每個列表項對應一種顏色。
什麼最終爲我工作是:
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
爲什麼不使用條件格式?這意味着你不依賴於用戶啓用宏。 – Reafidy 2011-12-19 23:41:23
嘗試進一步具體地使用條件格式:我認爲這是一個不行,因爲它是基於價值的(大,小,平等等),我發現沒有辦法去做我想要的,因爲我只是想跟蹤「任何「改變的細胞。 – 2011-12-20 11:29:12