2017-06-03 49 views
1

我有一个电子表格,其中实现了评分板。 我需要的行为是当具有分数值的单元格在列b附近的单元格上升时,将它的颜色更改为绿色,当单元格分数值下降到靠近它的单元格时,它将颜色更改为红色。VBA从单元格更改前保存值

的单元格范围,其中所述得分变化是E5:E67

简而言之: 当用户输入F列的数,得分提高列E,并且在列b(在同一行)颜色必须变成绿色或红色

我做了这个VBA代码,但没有运气。

Private Sub Worksheet_Change(ByVal Target As Range) 
If Not Intersect(Target, Range("e5:e67")) Is Nothing Then 
If Target.Column = 5 Then 
    thisRow = Target.Row 
    Dim OldValue As Variant 
    Application.EnableEvents = False 
    Application.Undo 
    OldValue = Target.Value 
    Application.Undo 
    Application.EnableEvents = True 
If OldValue < Target.Value Then 
    Range("b" & thisRow).Interior.ColorIndex = 4 
ElseIf OldValue > Target.Value Then 
    Range("b" & thisRow).Interior.ColorIndex = 3 
End If 
End If 
End If 
End Sub 

这里是我的排名表的屏幕截图:enter image description here

+0

当我在单元格中输入一些F5 E5上的得分提高,但B5单元格不改变颜色为绿色。 –

+0

啊好的。在通过公式更改值的目标上未触发更改事件。你需要使用'Worksheet_Calculate'事件。 –

+0

在单元格e5中,我有一个公式,当用户在单元格f5中输入一个数字时,它的值增加10个点。如果用户输入1个单元格e5增长10个点,如果用户输入2个单元格e5增长20个点。 –

回答

0

尝试拦截Worksheet_Calculate事件。您需要将旧值保存在static本地阵列中,我称之为oldVal

Private Sub Worksheet_Calculate() 
    Static oldVal 
    If IsEmpty(oldVal) Then 
    oldVal = Application.Transpose(Range("e5:e67").Value2) 
    ReDim Preserve oldVal(5 To 67) 
    Exit Sub 
    End If 
    Dim i As Long 
    For i = LBound(oldVal) To UBound(oldVal) 
    If oldVal(i) > Cells(i, "E").Value2 Then Cells(i, "B").Interior.ColorIndex = 3 
    If oldVal(i) < Cells(i, "E").Value2 Then Cells(i, "B").Interior.ColorIndex = 4 
    oldVal(i) = Cells(i, "E").Value2 
    Next 
End Sub 
+1

非常感谢您的帮助,根据您的示例,我能够实现我需要的完整代码,现在我的vba宏运行良好。我会标记你的答案是正确的。 –

+0

@AndréCastro欢迎您。 –

0
Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim i As Integer 
If Not Intersect(Target, Range("e6:e67")) Is Nothing Then 
    If Target.Offset(-1) < Target Then 
     i = 4 
    Else 
     i = 3 
    End If 
    Range("b" & Target.Row).Interior.ColorIndex = i 
End If 
End Sub 
相关问题