
企业的应收管理,难点往往不在“做一个窗体”,而在于让一次回款登记同时改变台账、流水和预警指标,并且经得住重复提交、超额回款、关闭重开等边界测试。本案例以四张 Excel 工作表为数据基础,用 VBA 构建“查询—校验—预览—确认—写回—刷新”的完整闭环,再用一组可重复执行的测试验证结果。
这不是一段只负责展示界面的宏,而是一套能够说明数据从哪里来、为什么能写、写完如何核对的轻量业务工程。
一、先把业务拆成四张表
工作簿没有额外数据库,所有状态都落在 Excel 中。为了避免界面代码直接到处读写单元格,先固定四张表的职责。
| 工作表 | 职责 | 关键数据 |
|---|---|---|
| 应收台账 | 保存每笔应收的当前状态 | 应收编号、客户、原始应收、累计回款、未收余额、到期日、状态 |
| 账龄规则 | 定义不同逾期天数对应的风险等级 | 起始天数、结束天数、风险标签 |
| 回款记录 | 追加式保存每次回款流水 | 回款编号、应收编号、日期、金额、方式、经办人、备注 |
| 预警看板 | 汇总管理指标 | 未收总额、逾期金额、逾期笔数、严重风险笔数 |
这种拆分有一个重要好处:窗体只是操作入口,业务规则集中在模块里,汇总结果由台账重新计算。以后即使调整窗体布局,也不必重写核心逻辑。
二、窗体不是“填完就写”,而是有状态的工作流

Excel VBA 回款登记窗体:查询、预览影响并确认登记
打开窗体后,用户先输入应收编号并查询。系统显示客户、账龄、当前余额等信息;随后填写回款金额、日期、方式和经办人。点击“预览影响”只计算登记后的余额和状态,不落盘。只有预览成功、再次确认后,才真正写入回款记录并刷新台账与看板。
语音或自然语言描述可以自动生成窗体;生成后的窗体可在 VBA 中手动编辑和微调。在 WorkBuddy 中直接沿用当前默认模型即可,不需要打开模型列表或重新选择模型。真正决定系统是否可靠的,仍然是字段映射、校验顺序、写回策略和验收用例。
这个窗体用一个布尔状态记录“当前输入是否已经预览”。只要用户修改关键输入,就清除该状态,强制重新预览。这样可以避免用户预览 18,000 元后又把金额改成 80,000 元,却直接沿用旧结果提交。
' 节选并简化:关键输入变化后,旧预览立即失效
Private Sub txtAmount_Change()
m_已预览 = False
End Sub
Private Sub btn登记_Click()
If Not m_已预览 Then
MsgBox "请先预览本次回款影响。", vbExclamation
Exit Sub
End If
' 二次确认后再执行一次写入
End Sub
三、把所有拦截放在写入之前
登记函数最重要的原则是“先验证,后写入”。任何一项不成立,都应立刻退出,不能出现流水写了一半、台账还没更新的中间状态。
核心校验包括:
- 回款编号不能为空且不能重复;
- 应收编号必须真实存在;
- 回款金额必须大于 0,且不得超过当前未收余额;
- 回款方式、经办人和回款日期必须有效;
- 预览时读取的应收记录,提交前仍需再次确认。
' 节选并简化:先返回失败原因,不触碰工作表
If Len(Trim$(回款编号)) = 0 Then
失败原因 = "回款编号不能为空"
Exit Function
End If
If 回款编号已存在(回款编号) Then
失败原因 = "回款编号重复"
Exit Function
End If
If 回款金额 <= 0 Or 回款金额 > 未收余额 Then
失败原因 = "回款金额必须大于 0,且不得超过未收余额"
Exit Function
End If
这里的“事务式”是工作表层面的工程策略:校验全部通过后,按固定顺序追加流水、刷新台账、重算看板并保存。它并不等同于数据库事务,但能显著减少 Excel 自动化中常见的半写入问题。
四、余额必须从事实数据推导
回款系统中很容易出现一个隐蔽错误:直接用“当前余额减本次金额”。如果当前余额曾被手工改错,后续每次扣减都会放大错误。本案例改为从原始应收额和累计回款额重新推导余额。
' 节选并简化:不递减旧余额,而是从事实数据重新计算
累计回款 = 汇总指定应收的全部回款(应收编号)
新余额 = Application.Max(0, 原始应收 - 累计回款)
If 新余额 = 0 Then
状态 = "结清"
Else
状态 = "未结清"
End If
预警看板也采用同样思路:每次写回后,从应收台账重新汇总未收总额、逾期金额、逾期笔数和严重风险笔数,而不是对旧指标做加减。数据量较小时,这种“重算换确定性”的策略更容易理解和验收。
五、用一条完整链路证明结果
本次验收选择应收编号 AR260805。登记前,该笔应收未收余额为 18,000 元;登记一笔 18,000 元全额回款后,流水新增、台账结清、看板同步变化。

登记完成后的预警看板:未收和逾期指标同步下降
| 指标 | 登记前 | 登记后 | 变化 |
|---|---|---|---|
| 未收总额 | 960,000 | 942,000 | -18,000 |
| 逾期金额 | 742,000 | 724,000 | -18,000 |
| 逾期笔数 | 17 | 16 | -1 |
| 严重风险笔数 | 7 | 7 | 0 |
对应的回款流水编号为 RCPT26083101,日期为 2026-08-31,方式为银行转账,经办人为王磊。关闭并重新打开工作簿后,该笔应收仍显示“结清”,看板仍保持 942,000、724,000、16、7,说明结果已经持久化,而不是停留在窗体内存中。
六、边界测试比成功弹窗更重要
只看“登记成功”无法说明系统可靠。为此,测试模块先恢复演示数据,再连续执行五项断言。
| 测试场景 | 输入或条件 | 期望结果 | 实际结果 |
|---|---|---|---|
| 超额回款 | 余额 40,000,尝试登记 40,001 | 拒绝写入并提示原因 | 通过 |
| 正常全额回款 | AR260805 登记 18,000 | 新增流水,余额归零 | 通过 |
| 台账状态 | 完成全额回款 | 状态更新为“结清” | 通过 |
| 看板联动 | 完成全额回款 | 未收与逾期指标同步变化 | 通过 |
| 重复编号 | 再次使用 RCPT26083101 | 拒绝重复写入 | 通过 |
测试结果为 5 项通过、0 项失败。自动化测试不是为了替代人工检查,而是把最关键的业务约束变成可以重复执行的证据。以后新增字段或调整窗体时,只要再次运行测试,就能快速发现规则是否被破坏。
七、AI 最适合做什么,不能替你决定什么
在这个案例中,AI 很适合根据自然语言快速生成窗体骨架、字段映射、模块分层、校验分支和测试代码,也适合帮助定位控件命名不一致、数据列错位、旧余额递减等问题。
但以下内容必须由业务人员明确:
- “逾期”按自然日还是工作日计算;
- 全额回款后是否允许反向冲销;
- 回款编号由系统生成还是引用财务系统单号;
- 哪些字段允许人工修改,哪些必须锁定;
- 看板口径是否包含争议款、坏账或未核销款。
更稳妥的协作方式,是把需求写成“字段 + 规则 + 写回顺序 + 验收结果”,而不是只说“帮我做一个回款窗体”。例如:
基于应收台账、账龄规则、回款记录和预警看板四张表,生成 Excel VBA 回款登记窗体。必须支持按应收编号查询、超额拦截、重复编号拦截、影响预览和二次确认;登记成功后追加回款流水,以原始应收减累计回款计算余额,刷新台账状态和看板。验收时证明 18,000 元全额回款使余额归零、状态结清、未收总额和逾期金额各下降 18,000,并通过关闭重开验证。
结语
Excel VBA 仍然适合解决数据规模可控、业务规则明确、用户主要在 Office 内工作的轻量流程。真正有价值的不是“AI 一次写出多少代码”,而是它能否帮助我们更快建立结构清晰、规则可解释、结果可复核的自动化工程。
从一个可编辑窗体开始,把校验前置、把余额改成推导、把看板改成重算、把边界条件写进测试,最终得到的才不只是演示,而是一套可以继续维护和扩展的业务工具。

