【问题标题】:How can I test a cell's edited value against it's original value?如何根据原始值测试单元格的编辑值?
【发布时间】:2019-05-01 11:08:01
【问题描述】:

我正在处理向用户提供默认值的电子表格。我有这些格式(白色背景/黑色文本)。

我设置了一个宏,以便在编辑值时将单元格格式化为突出显示(黄色背景/粗体文本)。

我正在尝试在输入每个单元格时捕获其原始值(或 Value2?),以便如果用户更改值,它将使用我设置的条件格式宏突出显示该单元格,但如果它们恢复原来突出显示的值消失了。

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

我已经阅读了一些教程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. 如果单元格的值与原始值匹配,则删除此格式

另外,有没有办法“一键还原”单元格的原始值?

【问题讨论】:

  • 您需要将原始值单独保存在某个地方,这样比较测试和回归都很容易。
  • 您可以使用所有默认值的隐藏列(或行)来实现此目的。剩下的就是条件格式化,看值是否不等于默认值
  • 在工作表中使用Selection_Change记录你当前的值,然后Change进行检查,所以在Selection_Change中设置varWas,在Change中设置varTo,然后比较两者。
  • @SolarMike 当您在不同的 Sub 中说某个单独的地方时?还是只是在 Sub 之外设置 Dim?

标签: excel vba


【解决方案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

【讨论】:

  • 这很好用,除了它将 varWas 变量设置为最初在单元格中的任何值单击时,我只需要设置和存储变量一次。因此,如果单元格的原始值为“xyz”并且用户将其编辑为“abc”,则它会突出显示,但如果用户将值重置回“xyz”,那么突出显示才会消失。那么有没有办法只在用户第一次点击单元格时设置 varWas 值,而不是每次都设置?
  • 谢谢,这会更好。我现在唯一的问题是尝试在 workbook_open 上运行 setup() 会引发错误。我试过 Private Sub Workbook_Open() Call setup End Sub 并且它在工作表模块的第 2 行抛出错误,可能找不到 rngChecked 变量?当我将设置代码直接放入工作簿打开 Sub 时,结果相同: Private Sub Workbook_Open() Set rngChecked = ActiveSheet.UsedRange arrContentsAtStart = ActiveSheet.UsedRange End Sub
  • 你给了它 20 分钟 :o) 什么错误?也许活动表引用。
【解决方案2】:

我们可以使用列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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-27
    • 2015-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多