如果在单元格中输入的值与先前的值不同,则执行代码

时间:2019-04-12 05:09:25

标签: excel vba

我将数据验证作为某些单元格的列表(可能的值为“已注册”,“等待列表”,“已取消”)。如果这些单元格的值发生变化,则仅在新值与现有值不同的情况下,我才需要执行一些代码。问题是,如何获取Excel以将单元格的先前值与当前值进行比较。

我尝试了此解决方案(How do I get the old value of a changed cell in Excel VBA?),但没有成功。我想念什么?这是一些示例代码。目前,即使我输入相同的值,它也会更改单元格颜色。

Private Sub Worksheet_Change(ByVal Target As Range)

Dim previous_value As String

previous_value = oval

Select Case Target.Value
    Case Is = "enrolled"
        If previous_value = Target.Value Then
        MsgBox "you entered the same value"
        Application.EnableEvents = False
        Application.Undo
        Application.EnableEvents = True

        Else 
        Target.Interior.Color = vbBlue

        End If
    Case Is = "waitlisted"
' (....etc.)
End Select


End Sub

Public Sub Worksheet_SelectionChange(ByVal Target As Range)

Dim oval As String

If Selection.Cells.Count = 1 Then
    oval = Target.Value
End If
End Sub

2 个答案:

答案 0 :(得分:1)

如果使用下面的代码,则可以将最近单击的实例保存在命名范围内,然后根据用户输入的内容进行检查。显然,这在各个工作表代码中都有。

Private anOldValue As Variant

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Cells.Count = 1 Then

    If Target.Value = anOldValue Then

        MsgBox "Same value!"
    End If
End If

End Sub



Private Sub Worksheet_SelectionChange(ByVal Target As Range)

If Target.Cells.Count = 1 Then

    anOldValue = Target.Value

End If

End Sub

答案 1 :(得分:1)

这是最终代码。感谢@PGCodeRider的帮助!

Private anOldValue As Variant

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Cells.Count = 1 Then
    Select Case Target.Value
        Case Is = "enrolled"
            If Target.Value = anOldValue Then
               MsgBox "Student already enrolled!"
            Else 'code that needs to happen when "enrolled" is selected
               Target.Interior.ColorIndex = 10
            End If
        Case Is = "waitlisted"
            If Target.Value = anOldValue Then
                MsgBox "Student already waitlisted!"
            Else  'code that needs to happen when "waitlisted" is selected
               Target.Interior.ColorIndex = 20
            End If

        Case Is = "cancelled"
            If Target.Value = anOldValue Then
                MsgBox "Student already cancelled!"
            Else   'code that needs to happen when "cancelled" is selected
                Target.Interior.ColorIndex = 30

            End If
    End Select
End If

End Sub



Private Sub Worksheet_SelectionChange(ByVal Target As Range)

If Target.Cells.Count = 1 Then

    anOldValue = Target.Value

End If

End Sub