
一张已经有字段和样例的 Excel 表格,可以成为 AI 制作窗体的起点。本案例让 WorkBuddy 读取报关记录、下拉选项和填写说明,再配合 VBAYYDS语音编程生成 VBA 窗体及代码,实现查旧单、浏览资料、新增和修改保存。
窗体能显示出来,只是第一步。真正需要核对的是:选中的单据是否回填正确,修改时是否写回原行,重复点击保存是否多出一条记录,以及关掉窗体重开后能否读到刚才的数据。
本例最终保留 7 条唯一单据。旧单 DEMO-BG-001 的数量由 240 改为 260,单价仍为 8,总价由 1920 变为 2080。新增 DEMO-BG-007 的数量为 120、单价为 12.5,总价为 1500。这些数值既能在窗体中查看,也能在保存后的工作表中复核。
这是一份外贸资料预录入示范,采用虚构企业、商品与单据,一条记录对应一种商品。它不连接正式申报系统,也不是完整的正式报关模板。学习重点是让 AI 依据已有表格制作可读写的办公窗体。
先把表格变成明确的数据说明

图 1 原始报关记录共有 6 条,单据编号用于识别每一条记录。
工作簿包含 3 张表。让 AI 同时阅读它们,比只给一句“做个报关窗体”更容易得到符合现有业务的结果。
| 工作表 | 在本案例中的职责 |
|---|---|
| 报关记录 | A 到 T 列保存 20 个字段,第 4 行是表头,第 5 行起是数据 |
| 下拉选项 | 提供运抵国、指运港、运输方式、成交方式、币制和单位 6 组选项 |
| 填写说明 | 说明必填项、计算规则、保存行为与验收要求 |
20 个字段包括单据编号、申报日期、境内发货人、境外收货人、合同协议号、运抵国、指运港、运输方式、成交方式、币制、商品名称、规格型号、数量、单位、单价、总价、件数、毛重、净重和备注。
总价是计算结果,窗体中只读;备注允许留空,其余输入必须完整。数量、单价、毛重和净重为正数,件数为正整数,净重不能超过毛重。日期还要通过有效性校验,不能把不存在的日期当成普通文本保存。
当前代码按固定列号读写,而不是自动识别任意表头。复用时应保持这 20 列的顺序;如果要调整列名或顺序,需要同步修改字段映射并重新测试。下拉选项从第 5 行连续读取,遇到空单元格就停止,因此选项中间不宜留空行。
用自然语言给出第一条需求

图 2 WorkBuddy 中的实际首轮提示,包含业务目标、紧凑布局和自动测试要求。
实际提示词
请使用vba相关技能 使用vba窗体完成以下任务。先读这个Excel的报关记录、下拉选项和填写说明,照着表格做一个外贸报关单窗体,能查旧单、浏览资料、填新单和修改保存,金额自动算。字段多,请用紧凑布局,控制窗体高度,别让按钮超出屏幕。用明亮浅色的拂晓蓝主题(sky-dawn)。先把窗体画好并打开设计预览,等我确认后再做功能,最后用VBAYYDS的uitest帮我测试输入和保存。
“请使用vba相关技能”明确了工具和实现方向,避免只得到一张网页样式的界面图。“先读这个Excel的报关记录、下拉选项和填写说明”则把表格本身作为上下文,减少 AI 猜字段、猜规则的空间。
“查旧单、浏览资料、填新单和修改保存”说明了四种实际操作。若只写“录入数据”,AI 很可能只处理新增,而漏掉旧单修改和重复保存。“金额自动算”进一步区分了输入字段与结果字段。
“紧凑布局,控制窗体高度”来自字段较多的现实限制。它不要求零基础用户描述控件坐标,却明确了按钮必须完整可见的结果。先看设计预览、确认后做功能,是把外观确认和业务验收分开;最后一句把输入和保存纳入测试,而不止检查窗体能否打开。
这段需求可以通过语音输入,也可以直接粘贴。需要说清楚的是业务和验收标准,不必先学会控件名或事件过程。语音或自然语言描述可以自动生成窗体;生成后的窗体仍可在 VBA 中手动编辑和微调。
让浏览和编辑有清楚的状态

图 3 最终运行窗体回填 DEMO-BG-007,显示商品、数量、单价和总价等资料。
窗体上方的记录列表显示编号、日期、收货人、商品和总价,查找框按单据编号或境外收货人进行包含匹配。选中记录后,再把对应的完整字段回填到编辑区,避免把 20 列全部挤进列表。
代码用“编辑行”区分新增和编辑:值为 0 时新增;载入旧单后保存原行位置,并锁定编号。点击“新建”会清空旧资料、解除编号锁定,同时把编辑行恢复为 0。查询没有匹配项时也清空编辑区,防止上一张单据残留在屏幕上造成误解。
保存旧单前,程序会按原编号重新定位工作表行,而不是拿筛选后列表中的第几项直接当成表格行号。这样,筛选后的第一项也不会误写到原表第一条记录。
以下是最终代码中的状态切换节选:
清空输入
编辑行 = 0
Tb单据编号.Locked = False
另一处“加载中”标记用于回填过程。程序连续给数量和单价赋值时,先抑制中间计算;回填完成后统一更新总价,避免短暂显示由新旧字段混合算出的金额。
保存代码需要同时照顾公式和重复操作

图 4 最终 VBA 代码从下拉选项表加载组合框内容,选项不直接写死在界面里。
本例把界面事件、字段校验、记录查找和工作表写入写在同一个窗体代码中,再拆成不同过程。对于学习案例,这样便于沿着按钮事件找到实际逻辑;若以后扩展多种单据,可以再把公共读写和校验移到独立模块。
总价在两处计算:窗体用 Excel 的 ROUND 规则显示两位小数,保存时在 P 列写入公式。两处口径一致,避免界面上是一个金额、表格中又是另一个金额。以下为最终保存过程的原码节选:
ws.Cells(r, 16).Formula = "=ROUND(M" & r & "*O" & r & ",2)"
Application.ThisWorkbook.Save
编辑行 = r
Tb单据编号.Locked = True
新增时先检查编号是否存在,再追加一行并继承上一行格式。保存成功后立即把“编辑行”切换到新行,因此再次点击保存会修改同一条记录,不会反复追加。编辑模式则重新找到原编号所在行;如果原记录已经被移除,就提示重新查询。
保存按钮先运行输入校验,再显示确认框。选择取消会直接退出,不写工作表。代码有错误提示,但并没有把多单元格写入包装成数据库事务,也没有在中途失败后自动恢复全部旧值;将来用于重要数据时,仍应增加备份、失败恢复和多人编辑冲突处理。
用真实数据验证窗体读写

图 5 保存后的工作表已有 7 条记录,旧单数量为 260,总价为 2080,P 列仍保留公式。
VBAYYDS 的 uitest 可以对真实 VBA 窗体进行输入、下拉选择和按钮点击。WorkBuddy 据此发起测试,但判断标准仍然来自业务:操作后具体应出现什么值,工作表应改变哪一行,哪些内容必须保持不变。
| 核对项目 | 本例结果 |
|---|---|
| 修改旧单 | DEMO-BG-001 数量 240 变 260,单价 8,总价 1920 变 2080 |
| 新增记录 | DEMO-BG-007 数量 120,单价 12.5,总价 1500 |
| 重复保存 | 仍为 7 条唯一编号,没有额外追加 |
| 取消保存 | 取消确认后不写入工作表 |
| 查询和重开 | 无匹配时清空旧资料;重开后可再次载入 007 |
| 保存文件复核 | 7 条记录的 20 个字段逐项核对,7 个总价公式及结果保持正确 |
测试还覆盖了下拉选择、重复编号和多项非法输入。已有验证不能直接推成“所有情况都通过”:例如下拉框中输入不在选项表里的内容,本例只审阅了拒绝逻辑,没有完成对应的实体输入测试。
001 之外的原有 002 至 006 单据,最终 20 个字段均与预期保持一致。这个检查很重要:目标行改对了,并不自动说明其他行没有被误改。
把同样的方法用到自己的表格

图 6 WorkBuddy 的完成摘要用于归纳功能,实际结果仍以窗体、工作表和保存后的文件核对为准。
AI 在本例中承担了读表、绘制窗体、编写事件代码和发起自动测试。使用者则需要确认字段含义、哪些值可选、什么情况允许覆盖,以及出错后应该保留什么。这些判断越明确,测试越容易给出可检查的答案。
如果要换成采购登记或客户台账,先准备表头和样例数据,在副本上核对新增、修改和重复保存。遇到偏差,直接补充可见错误、正确目标和验收数据。正式外贸业务还需确认实际字段与流程。下面是复用模板,不是本例首次发送的原文。
可复用提示模板
请使用vba相关技能 使用vba窗体完成以下任务。先读这个Excel里的数据表、选项表和填写说明,照着现有字段做一个能浏览、查询、新增和修改保存的窗体。采用紧凑布局,所有按钮完整显示。需要计算的字段自动计算,重复编号和无效输入要提示,取消保存不要改表。先给我看设计预览,确认后完成代码,再用VBAYYDS的uitest测试输入、选择、保存和重开。请用表里的两条具体数据核对结果。

