VBA在更改之前从单元格中保存值

时间:2017-06-03 21:52:00

标签: excel vba excel-vba

我有一个电子表格,我实施了一个记分板。 我需要的行为是当具有得分值的单元格升高其附近的单元格时,在列b上,将其颜色改变为绿色,当单元格得分值下降时,其附近的单元格将其改变为'颜色为红色。

分数变化的细胞范围是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

2 个答案:

答案 0 :(得分: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 :(得分: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