突出显示发生变化的细胞

问题描述 投票:0回答:2

我想用黄色突出显示 Excel 工作表中发生变化的任何单元格。目前,我有以下代码:

Private Sub Worksheet_Change(ByVal Target As Range)
Target.Interior.ColorIndex = 6
End Sub

这很好用并达到了预期目的,但有一个明显的问题。我无法还原更改(ctrl + z 不起作用),如果我将单元格更改回其原始内容,单元格将保持黄色,因为它被识别为更改,导致无限循环。我可以手动选择“无填充”来移除黄色填充,但我希望这是自动的。万一我在工作表中犯了一个错误并想回到单元格的原始内容,我希望单元格没有填充而无需手动填充。

有什么办法解决这个问题吗?

非常感谢任何帮助,谢谢!

excel vba excel-formula excel-2010
2个回答
1
投票

这可能更适合您的使用,分 3 个步骤使用

Worksheet_SelectionChange()
而不是
Worksheet_Change()

  1. 在一个VBA公共模块中,例如Module1,我们定义一个全局变量来保存旧的target:
选项显式
公共 goldTarget 作为范围
  1. 在 ThisWorkbook 私有模块中,我们添加这个以在退出 Excel 时删除高亮,并在打开 Excel 文档后立即高亮 ActiveCell。
选项显式

私有子 Workbook_Open()
  ActiveCell.Interior.ColorIndex = 6
  设置 gOldTarget = ActiveCell
结束子

私有子工作簿_BeforeClose(取消为布尔值)
  '
  ' 恢复旧单元格:
  '
  If (Not gOldTarget Is Nothing) 那么
    gOldTarget.Interior.ColorIndex = xlColorIndexNone
  万一

结束子
  1. 在最后一步,我们在 Worksheet 私有模块中添加代码,根据需要动态突出显示 ActiveCell:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  '
  ' 突出显示当前单元格:
  '
  Target.Interior.ColorIndex = 6
  '
  ' 恢复旧单元格:
  '
  If (Not gOldTarget Is Nothing) 那么
    gOldTarget.Interior.ColorIndex = xlColorIndexNone
  万一
  
  设置 gOldTarget = 目标
结束子

使用 Worksheet_SelectionChange(),它突出显示具有焦点的当前单元格。当您退出单元格时,高亮会被抑制。


0
投票

全局变量在编程中是不受欢迎的,但这是一个你可以利用它的领域:

(i) 在工作表模块的开头声明变量,例如

Public prevTarget As String

(ii) 在即时窗口中手动初始化它,或者在

Workbook_Open()
过程中以编程方式初始化它,例如

Sheet1.prevTarget="A1"

(iii) 更新您的 Worksheet_Change() 程序

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count <> 1 Then Exit Sub
    Range(prevTarget).Interior.ColorIndex = xlNone
    Target.Interior.ColorIndex = 6
    prevTarget = Target.Address
End Sub

编辑添加包含历史的代码

(i) 在工作表模块的开头声明 2 个公共变量,例如

Public prevTarget As String, logCount As Long

(ii) 在插入的模块开始时声明第三个公共变量,例如

Public history() As String

(iii) 更新 Worksheet_Change() 过程如下

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count <> 1 Then Exit Sub
    Application.EnableEvents = False
    Application.ScreenUpdating = False
    logCount = logCount + 1
    ReDim Preserve history(1 To 2, 1 To logCount)
    Dim newVal As String
    newVal = Target.Formula
    Application.Undo
    history(1, logCount) = Target.Address
    history(2, logCount) = Target.Formula
    Target.Formula = newVal
    Target.Offset(1, 0).Select  'replicate the effect of cursor movement on Enter (prevented by call to Undo method)
    Application.EnableEvents = True
    Range(prevTarget).Interior.ColorIndex = xlColorIndexNone
    Target.Interior.ColorIndex = 6
    prevTarget = Target.Address
    Application.ScreenUpdating = True
End Sub

并且,无论何时你想查看这段历史,你都可以使用这个执行

Sub historyLog()
    ActiveCell.Resize(UBound(history, 2), 2).Value2 = Application.Transpose(history)
End Sub

如果您快速连续进行大量更改,那么您会注意到数据输入现在是“粘性”的,但这是不可避免的,因为需要调用

Application.Undo()
方法,这是维护更改历史记录所必需的。

© www.soinside.com 2019 - 2024. All rights reserved.