如何对照原始值测试单元格的编辑值?

时间:2019-01-30 14:12:25

标签: excel vba

我正在处理一个电子表格,其中向用户提供了默认值。我将这些格式格式化为纯格式(白色背景/黑色文本)。

我设置了一个宏,用于在编辑值后将单元格设置为突出显示的格式(黄色背景/粗体)。

我试图在输入每个单元格时捕获其原始值(或Value2?),以便如果用户更改该值,它将使用条件格式宏突出显示该单元格,如果他们还原,则会设置BUT原来突出显示的内容的价值消失了。

例如,我有一个“名字”列,其中包含“斯蒂芬”单元格。如果用户编辑该单元格以说“ Joe”,它将突出显示以表明它已被编辑,不再是默认值。如果用户随后将单元格编辑为再次说“ Stephen”,则新值将与未经编辑的原始值匹配,并且将删除条件格式(突出显示)。

我已经阅读了一些教程here,但是未进行修改以满足我的需求的教程会引发错误。

我尝试将值设置为变量,但似乎无济于事。

Dim myCellValue As Variant
myCellSetValue.Value = Range.Value2

这是我现在拥有的宏。一旦单击它,它就会更改每个单元格的格式,而不管其编辑如何。

Private Sub Worksheet_Change(ByVal Target As Range)
    Target.Interior.ColorIndex = 36
    Target.Font.FontStyle = "Bold"
End Sub

我需要
1.仅在值更改时应用此格式
2.如果单元格的值与原始值匹配,则删除此格式

还可以将单元格“一键还原”为原始值吗?

2 个答案:

答案 0 :(得分:1)

像这样的基础

Public varWas As Variant
Public varTo As Variant

Private Sub Worksheet_Change(ByVal Target As Range)
    varTo = Target.Value
    If varTo = varWas Then
        Target.Interior.Color = vbWhite
        Target.Font.Bold = False
    Else
        Target.Interior.Color = vbRed
        Target.Font.Bold = True
    End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    varWas = Target.Value
End Sub

****更新****

在标准模块中,创建以下内容

Public arrContentsAtStart As Variant
Public rngChecked As Range

Public Sub setup()
    Set rngChecked = ActiveSheet.UsedRange
    arrContentsAtStart = ActiveSheet.UsedRange.Value
End Sub

然后在工作表模块中添加以下内容,您将需要在打开的工作簿上运行设置,我想,这取决于您何时获取“原样”数据。

Private Sub Worksheet_Change(ByVal Target As Range)

    If Not Intersect(Target, rngChecked) Is Nothing Then

        If Target.Value <> arrContentsAtStart(Target.Row, Target.Column) Then

            '   Value change format accordingly
            Target.Font.Bold = True

        ElseIf Target.Value = arrContentsAtStart(Target.Row, Target.Column) Then

            '   Reverted back to original value format accordingly

            Target.Font.Bold = False

        End If

    End If

End Sub

答案 1 :(得分:0)

我们可以将 XFD 列用作 A 列中原始值的“内存”。

首先 A 列中输入所有原始值。

第二将其输入标准模块并运行它:

Public A As Range
Public XFD As Range
Public setup As String

Public Sub Initialize()
    Application.EnableEvents = False
        Set A = Range("A:A")
        Set XFD = Range("XFD:XFD")
        A.Copy XFD
        setup = "done"
    Application.EnableEvents = True
End Sub

第三,将其输入到工作表代码区域:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Intersekt As Range, r As Range

    If setup <> "done" Then Exit Sub
    Set Intersekt = Intersect(A, Target)
    If Intersekt Is Nothing Then Exit Sub

    For Each r In Intersekt
        If r.Value = XFD(r.Row) Then
            r.ClearFormats
        Else
            r.Interior.Color = 65535
            r.Font.Bold = True
        End If
    Next r

End Sub