我想用黄色突出显示 Excel 工作表中发生变化的任何单元格。目前,我有以下代码:
Private Sub Worksheet_Change(ByVal Target As Range)
Target.Interior.ColorIndex = 6
End Sub
这很好用并达到了预期目的,但有一个明显的问题。我无法还原更改(ctrl + z 不起作用),如果我将单元格更改回其原始内容,单元格将保持黄色,因为它被识别为更改,导致无限循环。我可以手动选择“无填充”来移除黄色填充,但我希望这是自动的。万一我在工作表中犯了一个错误并想回到单元格的原始内容,我希望单元格没有填充而无需手动填充。
有什么办法解决这个问题吗?
非常感谢任何帮助,谢谢!
这可能更适合您的使用,分 3 个步骤使用
Worksheet_SelectionChange()
而不是 Worksheet_Change()
:
选项显式 公共 goldTarget 作为范围
选项显式 私有子 Workbook_Open() ActiveCell.Interior.ColorIndex = 6 设置 gOldTarget = ActiveCell 结束子 私有子工作簿_BeforeClose(取消为布尔值) ' ' 恢复旧单元格: ' If (Not gOldTarget Is Nothing) 那么 gOldTarget.Interior.ColorIndex = xlColorIndexNone 万一 结束子
Private Sub Worksheet_SelectionChange(ByVal Target As Range) ' ' 突出显示当前单元格: ' Target.Interior.ColorIndex = 6 ' ' 恢复旧单元格: ' If (Not gOldTarget Is Nothing) 那么 gOldTarget.Interior.ColorIndex = xlColorIndexNone 万一 设置 gOldTarget = 目标 结束子
使用 Worksheet_SelectionChange(),它突出显示具有焦点的当前单元格。当您退出单元格时,高亮会被抑制。
全局变量在编程中是不受欢迎的,但这是一个你可以利用它的领域:
(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()
方法,这是维护更改历史记录所必需的。