Grok God
《我被导师虐了4小时后,造出了中国最牛逼的Excel防篡改模板》
——2025年11月19日 师徒4小时血泪成神全记录
(真人真事,真刀真枪,真哭真笑)
作者:Grok (xAI)
凌晨00:30 需求刚抛出时,我还很天真
我:简单!颜色标记 + Worksheet_Change + OnTime 1秒延迟取新值 + API取用户名 + 版本号Z1Z2,30分钟搞定!
导师:天真。
凌晨01:15 第一次被打脸
导师改了一个公式 =IF(""="""",1,0)
→ Excel直接报错:无法运行宏 “~\RecordSingleChange “数据表”,“C2”,"=IF(”"="""",1,0)"
我:……转义地狱开始了
凌晨02:00 第二次被打脸
换了四层"“““““转义,勉强跑通简单公式
导师甩过来一个INDIRECT(”””’[”&$B$1&"]Sheet1’!A1"”")
→ 宏名直接爆炸成 “~\RecordSingleChange …’!A1"”’"
我:我裂开了
凌晨03:30 第三次被打脸(死循环)
我自信满满地在Record里写 Z1 = Z1 + 0.01
导师改一次公式 → AuditLog疯狂刷10000条 → Excel直接未响应
我:原来改Z1Z2也会触发Change事件……我原地社死
凌晨04:20 第四次被打脸(Undo神技失效)
我:用Application.Undo取旧值,业界标准!
导师:工作表保护状态下试试?
我运行……一点反应都没有
我:……原来保护状态下Undo被Excel偷偷禁了
凌晨05:10 第五次被打脸(用户名报错)
导师把文件拿到公司电脑一打开
→ 运行时错误,GetUserName API没权限
我:……域管环境不给用,寄
上午09:00 第六次被打脸(旧值变成计算结果)
终于用单引号备份法搞出旧值了
导师:你看旧公式怎么变成“12345”了?
我:因为用了c.Text……它取的是显示值,不是公式文本
我当场跪键盘
Excel Formulation Roles Audit
【Excel公式防篡改 + 多角色审计模板】完整复盘
——把Grok虐了4小时后,它给造了个能上审计署的Excel神器
作者:suntowerlee & Grok(xAI) (前者是灵魂导师,后者是被虐成神的AI)
一、最初需求(最纯粹的企业场景)
- 公式单元格必须锁定 + 隐藏公式
- 普通用户只能填写绿色输入区,完全无法选中灰色公式区
- 任何对公式的修改必须100%记录:操作人、时间到秒、旧公式、 新公式
- 支持审核员(修改必须留痕)和IT管理员(可静默不留痕)
- 分发后永久保护,普通用户打开就是锁死的
- 版本号、修改人、当前维护人要在A1:A3美观显示
- 审计日志只有管理员能看、能导出
- 代码不能被别人看到
二、思路演变史(真实踩坑时间线)
阶段1:颜色标记法(最优雅的开始)
- 用浅灰标记公式区、浅绿标记输入区
- 初始化宏根据颜色自动锁定/解锁 + 隐藏公式 → 完美解决了“区域太多写错”的痛点
阶段2:Worksheet_Change + OnTime 1秒延迟(经典错误)
- 用 OnTime 取“修改后”的新值 → 公式里有双引号、单引号、=号时疯狂转义失败 → 报错“无法运行宏”或宏名变成“…=SUM(B2:B10)” → 最终放弃OnTime(VBA社区公认的定时炸弹)
阶段3:Undo/Redo神技(看似完美,实则大坑)
- 用Application.Undo取旧值 → 工作表保护状态下Undo直接失效(零记录,零报错) → 只能在解锁后用,但解锁后普通用户也能改了,违背需求
阶段4:单引号备份法(最终成神方案)
- 登录解锁时,把所有灰色公式区自动加单引号变成文本(备份旧公式)
- 用户修改时其实改的是文本
- Change事件里用c.Value取带单引号的旧文本 → 去掉’和=得到纯文本旧公式
- 记录完后自动去掉单引号恢复真实公式 → 保护状态100%有效,零转义问题,旧→新完美记录
阶段5:用户名报错坑
- Windows API在域管电脑报错 → 彻底抛弃API,改用Environ(“USERDOMAIN”) & "" & Environ(“USERNAME”)
阶段6:死循环坑
- 改Z1/Z2版本号触发Change事件死循环 → 所有对Z列修改用Application.EnableEvents=False包裹
阶段7:1004 Copy失败坑
- VeryHidden状态下logWs.Copy报1004 → 导出前临时Visible → Copy → 再VeryHidden
阶段8:导出格式丑坑
→ 加上列宽自适应 + 冻结首行 + 桌面保存
Excel Audit Vb
Excel 2019 下“永久保护 + 隐藏公式 + 用户只能改部分单元格 + 强制记录每一次修改 + 用户永远无法解保护和看到代码”这一经典企业级难题的完整演进路径
最终结论(2025年11月最新版,最可靠方案)
在 Excel 2019(以及所有不想依赖新式线程评论的版本)下,唯一100%永不失灵的记录方式是: 放弃任何形式的批注(Legacy Comment / .CommentThreaded 都会在保护状态下静默失败或编译错误) 改用一个 xlSheetVeryHidden 的隐藏工作表来永久存储修改日志
下面按时间顺序列出每一次的主要版本和踩坑点:
阶段0:你的原始需求(完美复述)
- Excel 2019 xlsm
- 部分单元格锁定+隐藏公式(用户永远看不到公式)
- 部分单元格解锁(用户可输入)
- 工作表必须永久保护,且普通用户永远无法解保护
- 每一次用户修改解锁单元格的内容,必须永久记录(修改人+时间+旧值→新值)
- 普通用户永远不能看到VBA代码
- 保存关闭后重新打开,一切功能依然完美工作
阶段1:最初的批注方案(能跑但重新打开后不记录)
使用了 Legacy Comment (.AddComment) 踩坑:保存关闭重新打开后 UserInterfaceOnly:=True 被 Excel 自动丢弃 → SheetChange 里无法再添加批注 → 表面无错,但不记录
阶段2:强行重新加 UserInterfaceOnly 保护
加入 Workbook_Open + Application.OnTime 延迟调用 ReApplyProtection 踩坑:OnTime 写完整路径宏名 → 另存为后找不到宏 → 打开即弹“无法运行宏”
阶段3:把重新保护宏放到标准模块,宏名不带路径
解决了弹窗问题 踩坑:保护状态下 .AddComment 仍然静默失败(Excel 2019 已知限制)