VBA在单元格更改前保存其值

VBA在单元格更改前保存其值,vba,excel,Vba,Excel,我有一个电子表格,在那里我实现了一个记分板。 我需要的行为是,当具有分数值的单元格上升时,它附近的单元格,在b列上,将其颜色更改为绿色,当单元格分数值下降时,它附近的单元格将其颜色更改为红色 得分变化的单元格范围为e5:e67 简而言之: 当用户在f列中输入一个数字时,e列中的分数升高,b列(同一行)中的颜色必须变为绿色或红色 我做了这个VBA代码,但运气不好 Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersec

我有一个电子表格,在那里我实现了一个记分板。 我需要的行为是,当具有分数值的单元格上升时,它附近的单元格,在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
Private子工作表\u更改(ByVal目标作为范围)
如果不相交(目标,范围(“e5:e67”))则为零
如果Target.Column=5,则
thisRow=Target.Row
将值作为变量
Application.EnableEvents=False
应用程序。撤消
OldValue=Target.Value
应用程序。撤消
Application.EnableEvents=True
如果OldValueTarget.Value然后
范围(“b”和thisRow)。Interior.ColorIndex=3
如果结束
如果结束
如果结束
端接头

下面是我的排名表的屏幕截图:

通过截取
工作表\u Calculate
事件来尝试。您需要将旧值保存在我称之为
oldVal
static
本地数组中

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
Private子工作表_Calculate()
静态oldVal
如果我是空的,那么
oldVal=Application.Transpose(范围(“e5:e67”).Value2)
ReDim保留旧值(5到67)
出口接头
如果结束
我想我会坚持多久
对于i=LBound(oldVal)到UBound(oldVal)
如果oldVal(i)>单元格(i,“E”).Value2,则单元格(i,“B”).Interior.ColorIndex=3
如果oldVal(i)
尝试拦截
工作表\u Calculate
事件。您需要将旧值保存在我称之为
oldVal
static
本地数组中

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
Private子工作表_Calculate()
静态oldVal
如果我是空的,那么
oldVal=Application.Transpose(范围(“e5:e67”).Value2)
ReDim保留旧值(5到67)
出口接头
如果结束
我想我会坚持多久
对于i=LBound(oldVal)到UBound(oldVal)
如果oldVal(i)>单元格(i,“E”).Value2,则单元格(i,“B”).Interior.ColorIndex=3
如果oldVal(i)
专用子工作表\u更改(ByVal目标作为范围)
作为整数的Dim i
如果不相交(目标,范围(“e6:e67”))则为零
如果Target.Offset(-1)
专用子工作表\u更改(ByVal目标作为范围)
作为整数的Dim i
如果不相交(目标,范围(“e6:e67”))则为零
如果Target.Offset(-1)
当我在单元格f5上输入一个数字时,e5上的分数会升高,但单元格b5的颜色不会变为绿色。啊,好的。通过公式更改值的目标不会触发更改事件。您需要使用
工作表\u Calculate
事件。在单元格e5中,我有一个公式,当用户在单元格f5中输入一个数字时,它的on值会增加10个点。如果用户输入1个单元格e5增加10分,如果用户输入2个单元格e5增加20分。非常感谢您的帮助,这是一个有价值的添加。当我在单元格f5上输入一个数字时,e5上的分数会增加,但单元格b5的颜色不会变为绿色。啊,好的。通过公式更改值的目标不会触发更改事件。您需要使用
工作表\u Calculate
事件。在单元格e5中,我有一个公式,当用户在单元格f5中输入一个数字时,它的on值会增加10个点。如果用户输入1单元格e5增长10点,如果用户输入2单元格e5增长20点。非常感谢您的帮助,这是一个有价值的添加。非常感谢您的帮助,基于您的示例,我能够实现我需要的完整代码,现在我的vba宏运行良好。我会将您的答案标记为正确。非常感谢您的帮助,基于您的示例,我能够实现所需的完整代码,现在我的vba宏运行良好。我会认为你的答案是正确的。