Excel 如果单元格中输入的值与上一个值不同,则执行代码

Excel 如果单元格中输入的值与上一个值不同,则执行代码,excel,vba,Excel,Vba,我将数据验证列为某些单元格的列表(可能的值为“已注册”、“等待列表”、“已取消”)。如果这些单元格的值发生变化,我需要执行一些代码,前提是新值与现有值不同。问题是,如何让Excel将单元格的上一个值与当前值进行比较 我尝试了这个解决方案(),但没有成功。我错过了什么?下面是一些示例代码。当前,即使输入相同的值,它也会更改单元格颜色 Private Sub Worksheet_Change(ByVal Target As Range) Dim previous_value As String

我将数据验证列为某些单元格的列表(可能的值为“已注册”、“等待列表”、“已取消”)。如果这些单元格的值发生变化,我需要执行一些代码,前提是新值与现有值不同。问题是,如何让Excel将单元格的上一个值与当前值进行比较

我尝试了这个解决方案(),但没有成功。我错过了什么?下面是一些示例代码。当前,即使输入相同的值,它也会更改单元格颜色

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

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

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

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

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

这是最后的代码。感谢@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

这是最后的代码。感谢@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

我检查了你列出的另一个答案与你的相比。你需要把变量放在宏的外部,但要放在工作表中,这样才能将它们存储起来进行比较。您需要将变量放在宏的外部,但要放在工作表中,这样才能将它们存储起来进行比较。您好@pgcodereder!我似乎无法使您的解决方案适应我试图实现的目标。1) 我试图阻止用户错误地从下拉列表中选择相同的值2),但如果他们选择了其他两个可能的值之一,则需要运行其他一些代码。此解决方案仅完成第1项。当我试图在Select case语句的每个案例中使用它时,它都不起作用。我也不能使用Else If语句(If target.value=“waitlisted等),因为我不知道我需要检查3个可能值中的哪2个。我不知道这是否有意义。嗨@pgcodereder!我似乎无法根据我试图实现的目标调整您的解决方案。1)我试图防止用户从下拉列表中错误地选择相同的值2)但是如果他们选择了另外两个可能值中的一个,则le值,需要运行一些其他代码。此解决方案仅完成第1项。当我尝试在Select case语句的每个案例中使用它时,它不起作用。我也不能使用Else If语句(If target.value=“waitlisted等),因为我不知道需要检查3个可能值中的哪2个。我不知道这是否有道理。