从 4 张工作表到一套可回滚的检验流程:用 AI 学习 Excel VBA 的一次完整实践

3 次浏览

AI 对 Excel VBA 最有价值的帮助,不是“替你写完所有代码”,而是把需求澄清、代码生成、运行验证和迭代修改连成一个更短的学习闭环。

从 4 张工作表到一套可回滚的检验流程:用 AI 学习 Excel VBA 的一次完整实践

很多人学习 VBA 时,会从录制宏、单元格读写和循环开始。这些内容当然重要,但真正进入业务场景后,困难通常不在某一行语法,而在于如何同时处理数据结构、业务规则、窗体状态、异常恢复和结果验证。

本文用一个真实的“来料检验窗体与质量台账联动”案例,说明如何借助 AI 快速理解并完成一项相对复杂的 Excel VBA 任务。重点不是展示某个模型有多强,而是拆解一套可以复用的方法。

一、为什么这个任务不只是“做一个窗体”

这个工作簿包含 4 张互相关联的工作表:

工作表 主要职责 VBA 需要处理的内容
到货批次 保存批次基础信息和当前检验状态 只读取待检批次,提交后更新状态、结论、缺陷数、检验员和时间
检验规则 保存判定阈值与流程参数 按优先级读取规则,不能把阈值写死在代码里
检验台账 保存每次完成的检验记录 防止重复批次,提交时只新增一条记录
供应商看板 汇总检验、合格、让步、退货和待检数量 写回后刷新公式,并核对供应商指标变化

表面上看,用户只是在窗体里选择批次、输入缺陷数并点击提交;但后台至少要保证以下约束:

  1. 只有“待检”批次可以提交;
  2. 致命、主要、次要缺陷必须是非负整数;
  3. 缺陷总数不能超过抽检数量;
  4. 同一个批次不能重复写入台账;
  5. 试算只显示结果,不能修改工作表;
  6. 用户完成复核并二次确认后,才允许写回;
  7. 任意一步失败时,已经改动的内容要恢复;
  8. 保存并重新打开工作簿后,状态仍然一致。

这类任务适合用来学习 VBA,因为它把“语法练习”推进到了“业务系统设计”。

二、先定义数据和规则,再让 AI 写代码

如果只对 AI 说“帮我做一个来料检验窗体”,得到的代码往往能运行,却很难可靠地落地。更有效的做法,是先把工作簿当成一个小型信息系统,明确数据来源、状态变化和不可破坏的约束。

本案例的判定规则如下:

优先级 规则 ID 条件 结论
1 CRI-RETURN 致命缺陷 ≥ 1 退货
2 MAJ-RETURN 致命缺陷为 0,主要缺陷 ≥ 2 退货
3 MIN-CONCESSION 前两条未命中,次要缺陷 ≥ 4 让步接收
4 DEFAULT-PASS 以上规则均未命中 合格

阈值和结论全部来自“检验规则”表。这样,业务人员修改表格里的规则后,VBA 无需重新改代码。

在向 AI 描述需求时,最好同时给出:

  • 每张表的名称、表头和示例数据;
  • 哪些字段是输入,哪些字段由公式或 VBA 生成;
  • 规则的优先级和边界条件;
  • 提交前后的状态变化;
  • 出错时应该保持什么结果;
  • 可直接执行的验收样例。

这一步本身就是学习。为了让 AI 正确生成程序,使用者必须先把业务过程表达成可以验证的逻辑。

三、把窗体与业务逻辑分开

本案例最终采用了较清晰的分层:

UserForm(界面交互)
        ↓ 调用
m来料检验(读取、校验、判定、写回、回滚)
        ↓ 访问
到货批次 / 检验规则 / 检验台账 / 供应商看板

m来料检验自检(自动构造用例并检查四张表的一致性)

窗体只负责选择、输入、按钮事件和结果展示。所有业务规则都放在标准模块中。这样做有三个直接好处:

  • 修改窗体布局时,不会碰到核心业务代码;
  • 规则可以脱离界面单独测试;
  • 出现问题时,能更快判断是控件事件还是数据处理错误。

语音或自然语言描述可以先自动生成窗体,生成后的 UserForm 仍然可以在 VBA 编辑器中手动调整控件位置、字体、颜色和事件细节。真正需要长期维护的是控件调用的公共过程,而不是界面本身。

从 4 张工作表到一套可回滚的检验流程:用 AI 学习 Excel VBA 的一次完整实践

来料检验窗体:选择批次后自动带出信息,并先试算判定

四、不要依赖固定列号:按表头建立映射

初学 VBA 时常见的写法是直接使用 Cells(row, 12)。它简单,但只要有人在表格中插入一列,代码就可能把检验状态写到错误位置。

本案例先定位表头行,再建立“表头名称 → 列号”的字典。下面是经过简化的核心思路:

Private Function 取列字典(ByVal ws As Worksheet, _
                            ByVal headerRow As Long) As Object
    Dim map As Object, lastCol As Long, c As Long
    Set map = CreateObject("Scripting.Dictionary")

    lastCol = ws.Cells(headerRow, ws.Columns.Count).End(xlToLeft).Column
    For c = 1 To lastCol
        If Len(Trim$(CStr(ws.Cells(headerRow, c).Value))) > 0 Then
            map(Trim$(CStr(ws.Cells(headerRow, c).Value))) = c
        End If
    Next c

    Set 取列字典 = map
End Function

后续代码可以写成:

ws.Cells(targetRow, cols("检验状态")).Value = "已检"
ws.Cells(targetRow, cols("检验结论")).Value = preview.结论

这类结构化写法比记住某个列号更重要。AI 可以快速生成字典、查找和异常提示,但使用者需要明确告诉它:表头是稳定接口,列的位置不是。

五、让规则表驱动判定,而不是堆叠 If

如果把所有阈值都写进 If…ElseIf,规则一旦调整,就必须打开 VBA 编辑器修改代码。这里采用的思路是:读取“检验规则”表,按优先级排序,然后逐条匹配。

For Each rule In 已排序规则
    Select Case rule.缺陷类型
        Case "致命缺陷": currentCount = criticalCount
        Case "主要缺陷": currentCount = majorCount
        Case "次要缺陷": currentCount = minorCount
        Case "无命中":   defaultRule = rule
    End Select

    If rule.阈值 > 0 And currentCount >= rule.阈值 Then
        result.命中规则 = rule.规则ID
        result.结论 = rule.结论
        Exit Function
    End If
Next

result.命中规则 = defaultRule.规则ID
result.结论 = defaultRule.结论

从学习角度看,这里涉及数组或集合、排序、用户自定义类型、函数返回值和配置驱动设计。AI 能把这些知识点放进同一个可运行案例中,比彼此孤立地练习语法更容易理解。

六、二次确认本质上是一个小型状态机

窗体不是点击一次按钮就立即写表,而是分成两个阶段:

  1. 试算阶段:读取当前输入,做完整校验,计算命中规则和结论,只把预览保存在内存中;
  2. 提交阶段:确认输入没有变化,要求勾选“我已复核”,再弹出最终确认框,随后才写回工作表。

代码中可以用一个布尔状态和一份预览缓存表达这个过程:

Private 首次确认完成 As Boolean
Private 缓存预览 As 检验预览

' 试算成功
缓存预览 = 当前预览
首次确认完成 = True

' 提交前
If Not 首次确认完成 Then Err.Raise 5, , "请先试算判定"
If Not 已勾选复核 Then Err.Raise 5, , "请确认已复核"

如果用户修改批次或缺陷数,应立即让原预览失效,要求重新试算。这个细节可以防止“页面上看到的是旧结论,提交的却是新输入”。

七、Excel 里也可以实现“事务式写回”

一次提交要同时修改三处:

  • 更新“到货批次”的状态和检验结果;
  • 向“检验台账”追加一条记录;
  • 刷新“供应商看板”的统计结果。

Excel 本身没有数据库事务,因此这里实现的是工作表级的事务式行为:写入前保存目标区域的值和公式快照;全部完成后再保存工作簿;任何一步出错,就按相反顺序恢复快照。

On Error GoTo Rollback

批次快照 = 读取批次行(...)
台账快照 = 读取目标台账行(...)
看板快照 = 读取供应商看板行(...)

更新批次状态
追加检验台账
刷新供应商看板

If 自动保存 Then ThisWorkbook.Save
Exit Sub

Rollback:
    恢复批次行 批次快照
    恢复台账行 台账快照
    恢复看板值和公式 看板快照
    Err.Raise Err.Number, Err.Source, Err.Description

需要特别注意两点。

第一,提交前必须再次检查批次仍为待检,并确认台账中没有同号记录。因为从试算到提交之间,数据可能已被其他操作修改。

第二,看板原有公式应尽量保留。如果检测到公式存在,只触发重新计算;只有公式缺失时,才使用 VBA 计算作为兜底。否则一次自动化可能悄悄破坏工作簿原有的计算模型。

八、用验收用例约束 AI,而不是凭“看起来能跑”判断

这个项目准备了三类典型结果:

批次 缺陷输入 预期结论 主要验证点
IQC26083003 未命中退货或让步阈值 合格 默认规则、台账新增、看板已检增加
IQC26083004 次要缺陷达到阈值 让步接收 规则优先级、让步批次统计
IQC26083005 命中退货条件 退货 退货数、退货率和风险等级刷新

同时还加入了异常用例,例如:

  • 缺陷合计 99,大于抽检数量 32,必须拦截;
  • 输入 1.5,必须提示只接受非负整数;
  • 输入 -1,必须拒绝;
  • 未选择检验员,不能提交;
  • 连续重复提交同一批次,台账不能出现第二条记录;
  • 重新打开窗体后,已检批次不能再出现在待检列表中。

最终自动验收覆盖 96 项断言。提交三批测试数据后,待检批次由 7 条减少到 3 条,台账由 5 条增加到 9 条;供应商 S001、S003、S004 的已检、待检和退货指标也按同一批次号同步变化。

从 4 张工作表到一套可回滚的检验流程:用 AI 学习 Excel VBA 的一次完整实践

自动写回后,供应商看板的同号指标变化

断言数量本身并不代表质量,但它迫使需求变成可以判断“通过或失败”的条件。对 AI 生成的 VBA 来说,这是最有效的约束方式之一。

九、AI 真正加速了哪些学习环节

结合这个案例,AI 的价值主要体现在五个环节。

1. 快速建立代码骨架

AI 可以根据工作表结构生成窗体事件、公共模块、表头映射、输入校验和错误处理的初版,让学习者先看到完整程序如何组织,再针对不理解的部分逐段追问。

2. 把业务语言翻译成程序条件

“致命缺陷优先”“试算不落表”“同批次不可重复”这些业务表达,可以被转换成条件分支、状态变量和唯一性检查。这个翻译过程能帮助学习者理解程序为什么要这样写。

3. 解释和重构已有代码

面对一个较长的 VBA 模块,可以让 AI 按“入口过程—数据读取—规则判断—写回—异常处理”的顺序解释,也可以要求它识别硬编码列号、重复逻辑、隐式类型和未恢复的应用状态。

4. 自动生成测试矩阵

人容易只测试正常路径,AI 更适合批量补充边界值和异常路径,例如空值、小数、负数、超上限、重复提交、状态已变化、规则表缺列等。

5. 缩短修改后的回归周期

当规则或窗体发生变化时,重新运行自检模块,可以迅速判断四张表的联动是否仍然成立。学习不再停留在“我改了一行,好像没报错”,而是进入“我改了一行,原有行为仍通过验证”。

十、哪些事情不能完全交给 AI

AI 可以生成代码,但以下判断仍应由使用者负责:

  • 业务规则是否准确,尤其是优先级和例外条件;
  • 哪些数据允许被覆盖,哪些公式必须保留;
  • 自动保存和批量写入是否符合真实操作流程;
  • 异常恢复是否覆盖了所有被修改的区域;
  • 测试数据能否代表实际风险;
  • 宏安全、文件备份和多人协作方式是否可接受。

还要保留一个基本习惯:每次让 AI 修改代码前先保存可恢复版本,修改后先在测试副本运行,再进入正式工作簿。VBA 对桌面文件有直接写入能力,验证成本不能省略。

十一、一份可复用的提问模板

下面这套结构可以用于大多数 Excel VBA 自动化任务:

请先读取并分析当前工作簿,不要立即写代码。

1. 列出所有相关工作表、表头、公式区域和主键字段;
2. 用步骤说明用户从输入到提交的完整流程;
3. 列出业务规则、优先级、边界条件和禁止操作;
4. 将窗体交互与业务逻辑分开,公共逻辑放在标准模块;
5. 按表头名称定位列,不使用固定列号;
6. 提交前再次校验状态和重复记录;
7. 多表写回前保存快照,出错时恢复值与公式;
8. 为正常、边界、重复提交和重开读取生成自动测试;
9. 先给出设计说明和验收清单,我确认后再生成 VBA。

如果使用语音输入,可以先口述业务目标和操作顺序,再补充准确的表名、字段名和验收数据。语音描述可以自动生成窗体;窗体生成后,再在 VBA 编辑器里手动编辑和微调。

结语

用 AI 学习 Excel VBA,不应只追求更快地产生代码。更值得练习的是一套完整过程:

读懂现有表格 → 明确数据契约 → 拆分界面与业务 → 生成可运行代码 → 用边界用例验证 → 在失败中定位并修改。

当任务同时包含窗体、多表联动、规则配置、重复拦截、异常回滚和重开验证时,VBA 已经不是简单宏,而是一套运行在 Excel 内部的小型业务程序。AI 可以显著缩短探索时间,但系统是否可靠,最终仍取决于需求是否清楚、代码是否可维护、结果是否经过验证。

案例数据摘要:4 张业务表、12 个到货批次、4 条优先级规则、3 类自动验收批次、96 项断言。本文代码为便于阅读做了节选和简化,完整实现以当前项目中的 VBA 模块为准。

从 4 张工作表到一套可回滚的检验流程:用 AI 学习 Excel VBA 的一次完整实践插图3

工具名称:VBAYYDS语音编程助手
适合人群:常用Excel且希望自动化操作但不想深学VBA的职场人
体验方式:下载地址vbayyds.com
✨ 让Excel听懂你的需求,或许只需要一次尝试。
✨ 你的时间,值得用在更值得的事情上。
官网下载地址 vbayyds.com
淘宝搜索 vbayyds
购买方式 加微信EXCEL880B
从 4 张工作表到一套可回滚的检验流程:用 AI 学习 Excel VBA 的一次完整实践插图4