VBA智能记录指定列更新时间戳

实例需求:某公司产品统计表如下所示,为了便于追溯变更,如果用户修改了"厂家指导价"或者"供货价",那么"修改时间列"需要记录当前的时间。

这个需要似乎也并不复杂,使用Worksheet_Change事件判断变化发生的列,然后再时间戳即可。但是每个公司都有一些奇葩的用户(领导 ),他们会用尽毕生精力来折腾这个表,为了满足这些奇葩需求,此功能需要支持如下场景:

  • 用户可以在任意位置插入\删除列
  • 用户可以在表格之上或者左侧插入任意多行

效果如下。

实例代码如下:

vb 复制代码
Private Sub Worksheet_Change(ByVal Target As Range)
    Const KEY_COL = "厂家指导价|供货价"
    Const UPDATE_COL = "修改时间"
    Const TAB_NAME = "Tab_Product"
    With Target
        If .CountLarge > 1 Then Exit Sub
        Dim oTab As ListObject: Set oTab = .ListObject
        If oTab Is Nothing Then Exit Sub
        If UCase(oTab.Name) <> UCase(TAB_NAME) Then Exit Sub
        Dim r As Range: Set r = Application.Intersect(oTab.HeaderRowRange, Target)
        If Not r Is Nothing Then Exit Sub
        Set r = Application.Intersect(oTab.HeaderRowRange, .EntireColumn)
        If InStr(1, KEY_COL, r.Value) > 0 Then
            Dim updateCell As Range, iCol
            iCol = Application.Match(UPDATE_COL, oTab.HeaderRowRange, 0)
            If IsError(iCol) Then Exit Sub
            Set updateCell = Application.Intersect(oTab.ListColumns(iCol).Range, .EntireRow)
            Application.EnableEvents = False
            updateCell.Value = Format(Now(), "yyyy/MM/dd hh:mm:ss")
            Application.EnableEvents = True
        End If
    End With
End Sub

【代码解析】

第2行代码定义常量为监控列的标题行名称,以竖线分隔。

第3行代码定义常量为时间戳所在列标题名称。

第4行代码定义常量为表格(ListObject对象)名称。

第6行代码如果多个单元格发生变化,则终止代码执行。

第7行代码获取Target单元格所在的表格,如果对象不存在,说明Target不在表格中,则第8行代码终止代码执行。

如果Target在表格中,第9行代码判断表格名称是否为指导名称,如果不满足条件,则终止代码执行。

第10行代码获取Target和表格标题行的交叉区域,即判断Target是位于标题行中。

如果Target位于标题行中,第11行代码终止代码执行,即无需更新时间戳。

第12行代码获取Target所在列的标题行名称。

第13行代码判断标题行名称存在与监控列表中。

第14行代码调用工作表函数Match在表格标题行中查找时间戳列名称。

第15行代码如果返回结果为错误值(说明表格中不存在时间戳列),则终止代码执行。

第17行代码获取Target所在行和时间戳列的交叉位置单元格。

第18行代码禁用系统事件事件处理功能。

第19行代码更新时间戳。

第20行代码恢复系统事件处理功能。

相关推荐
闲人编程12 天前
时序数据库InfluxDB应用
数据库·struts·时序数据库·innodb·时间戳·存储引擎·时间维度
带娃的IT创业者16 天前
解密OpenClaw系列11-OpenClaw自动更新系统
开发语言·软件工程·自动更新·软件发布·ai智能体·openclaw·桌面智能体
带娃的IT创业者17 天前
解密OpenClaw系列10-OpenClawSparkle框架集成
软件工程·agent·策略模式·自动更新·ai智能体·智能体开发·openclaw
雪碧聊技术1 个月前
9.大模型如何实现会话记忆隔离?
大模型·时间戳·会话记忆隔离·会话id
Crazy Struggle3 个月前
基于 JSON 配置的 .NET 桌面应用自动更新方案
.net·winform·自动更新
一个平凡而乐于分享的小比特3 个月前
UCOSIII笔记(十四)时间戳
笔记·时间戳·ucosiii
課代表4 个月前
bat 批处理文件重命名加时间戳
时间·重命名·bat·时间戳·命令·批处理·字符串截取
骄傲的心别枯萎5 个月前
项目1:FFMPEG推流器讲解(五):FFMPEG时间戳、时间基、时间转换的讲解
ffmpeg·音视频·视频编解码·时间戳·rv1126
大白猴7 个月前
大白话解析 Solidity 中的防重放参数
区块链·智能合约·solidity·时间戳·重放攻击·nonce·防重放参数
Crazy Struggle7 个月前
告别手动更新!WinForm 应用轻松集成自动升级功能 (HHUpdateApp)
c#·winform·自动更新