VBA 靠嘴编程 · 实战教程
按行数据生成单据批量套打
1 行数据 1 张发货单:自动填单、连续分页、一键预览

系列封面:从发货数据到连续 4 页单据
一句话理解这个案例
让 WorkBuddy 读取真实发货数据和现有发货单模板,只处理“套打=是”的记录;VBA 按源表顺序逐行填单、自动分页、打开连续打印预览,并同步生成可追溯的套打记录。
案例编号 VBA-0062 · 工作表按钮方案 · 不直接调用实体打印机
1 先看最终效果
源表一共有 6 条发货数据,其中 4 条在“套打”列标记为“是”。点击工作表上的橙色按钮后,程序会把这 4 行数据分别套入同一张发货单模板,生成 4 个连续打印页,并把生成结果写入“套打记录”。

图 1 发货数据表中的“批量生成单据”按钮
本案例完成了什么
• 只处理“套打=是”的记录,保持源数据从上到下的顺序。
• 每一行生成 1 张完整发货单,模板的标签、格式和合并单元格全部保留。
• 4 张单据汇总到“批量单据”,每张独占 1 页并打开连续打印预览。
• 同步生成 4 条套打记录,包含页码、单号、客户、商品、数量、金额、状态和时间。
• 重复运行时刷新旧结果,始终保留 4 页、4 条记录和 1 个按钮。
固定验收结果
应生成单号 FH20260903001、FH20260903002、FH20260903004、FH20260903005;金额依次为 8550、4200、2100、5280 元,合计 20130 元。

图 2 连续打印预览显示第 4 页,共 4 页
为什么先打开预览
宏只调用 PrintPreview,不直接调用实体打印机。这样可以先核对纸张方向、缩放、分页和字段位置,确认无误后再由用户决定是否打印。
2 先把数据、模板与规则说清楚
批量套打的难点并不是把一行数据复制过去,而是要同时处理筛选条件、模板定位、合并单元格、分页、打印设置、日志和重复运行。提示词越能把这些边界说明白,AI 生成的代码越稳定。

图 3 原始发货数据:套打列决定哪些记录参与生成
工作簿中的 4 张表
1. 发货数据:保存业务明细,套打列为“是”才参与生成;宏不得修改这些业务值。
2. 发货单模板:固定的 A1:H18 单页版式,程序只复制模板,不覆盖源模板。
3. 批量单据:运行时删除旧内容后重建,每条记录占一个完整页面。
4. 套打记录:记录本次生成清单,用于复核和追溯。
关键业务规则
“套打=否”的 FH20260903003 和 FH20260903006 不得进入结果;空数据、没有选中记录或必填字段缺失时,要给出明确提示并安全退出。
3 把 VBA 工程交给 WorkBuddy
步骤 1 在 VBE 里复制项目路径
打开 VBA 编辑器并最大化,点击“VBAYYDS → 复制项目路径”。新版插件会在复制路径的同时自动导出当前 VBA 工程,不需要再单独执行“导出到本地”。
步骤 2 在 WorkBuddy 新建任务
切换到 WorkBuddy,点击固定位置的“新建任务”。沿用 WorkBuddy 当前已经设置好的默认模型,不打开模型选择菜单。
步骤 3 加入刚复制的项目目录
点击“选择工作空间”,选择打开本地文件夹,把复制的项目路径粘贴到文件夹选择框并确认。这样 AI 才能读取真实模块与工作簿结构。
这一步为什么重要
WorkBuddy 需要看到 VBAYYDS 导出的工程文件,才能在真实项目上新增模块、同步回 VBE 并运行验证;否则它只能提供一段孤立代码,无法完成整套交付。
4 用普通人的语言写清楚提示词
普通用户不需要提前知道 VBA 应该用什么循环、怎样设置分页,也不需要列出每一个对象方法。只要把“读什么、处理谁、生成什么、不能改什么、怎样验收”讲清楚即可。

图 4 WorkBuddy 读取工作簿和工程后开始分析数据
本案例使用的完整提示词
请按 VBA 技能处理当前工作簿。读取“发货数据”和“发货单模板”,制作按行批量套打:只处理“套打=是”的记录,每行生成1张发货单,汇总到“批量单据”并打开连续打印预览,同时在“套打记录”留下生成清单。请在“发货数据”表创建“批量生成单据”按钮。不要修改源数据和模板;重复运行时刷新上次结果,避免重复按钮或记录。不要直接调用实体打印机。完成后自行编译、运行并检查结果。
提示词为什么这样写
1. 先说明数据来源:明确“发货数据”和“发货单模板”,避免 AI 猜错工作表。
2. 再说明筛选规则:只处理“套打=是”,把未选中的行排除在结果之外。
3. 描述最终产物:连续单据、打印预览、套打记录和工作表按钮缺一不可。
4. 写出保护边界:源数据和源模板不能被修改,不能直接发送到实体打印机。
5. 要求重复运行可刷新:防止结果越跑越多、日志重复和按钮叠加。
6. 把验证交给 AI:要求编译、运行和检查,而不是只输出看起来正确的代码。
5 观察 WorkBuddy 是否真正完成了任务
提交提示词后,不要只等待一句“已完成”。观察 AI 是否读取了源表、模板和现有模块,是否把代码同步进 VBE,是否真实运行,并且是否能给出页数、日志行数和金额的复核结果。

图 5 WorkBuddy 发现合并单元格写入问题并进行修正
真实开发中遇到的一个问题
发货单模板的合计金额(大写)区域包含合并单元格。程序最初写入非锚点单元格 B11 时,内容会被合并区域丢弃。WorkBuddy 通过诊断确认真正的锚点是 A11,于是改为在生成副本中写入 A11,并保留原模板不变。
这个修正说明了什么
工作簿模板里的合并单元格、隐藏列和打印设置都可能让“看起来正确”的代码运行失败。可靠的 AI 协作必须包含真实运行、读取结果和针对性修正,而不是一次性生成代码后就结束。
6 VBA 代码的核心结构
学习这个案例时,不必逐行背诵代码。只要理解代码怎样把“源数据的一行”转换成“模板的一页”,再把页数、打印设置和日志串起来,就能把同样的思路迁移到送货单、报价单、标签、工资条或对账单。

图 7 模块常量统一保存数据表、模板表、结果表与按钮名称
主流程可以拆成 7 个职责
1. 读取源数据:定位表头和最后一行,把待处理区域一次性读入数组。
2. 筛选选中行:循环数组,只让“套打=是”的行进入生成流程。
3. 刷新旧结果:删除并重建“批量单据”,清空“套打记录”的旧数据行。
4. 复制模板块:按固定行距把 A1:H18 复制到目标页,并保留格式、标签和合并单元格。
5. 填充字段:把单号、客户、联系人、地址、商品、数量、单价、金额和备注写入对应位置。
6. 记录与分页:每生成一页就写入一条日志,并在页与页之间插入手动分页符。
7. 设置打印并预览:统一纸张、方向、页边距、打印区域和单页缩放,最后调用 PrintPreview。

图 8 循环筛选“套打=是”的记录并复制模板、填单、写日志
最关键的对应关系
源数据第 r 行 → 目标表第 n 个模板块 → 套打记录第 n 行 → 打印预览第 n 页。只要这四个编号保持一致,就能做到单据、日志和打印页一一对应。
7 工作表按钮与连续分页怎样实现
按钮不是 VBA 窗体控件,而是直接放在“发货数据”表上的圆角矩形。它更适合零基础用户:打开工作簿就能看到,点击后直接执行入口宏,不需要进入开发工具。

图 9 先删除同名形状,再创建橙色按钮并绑定入口宏
按钮不会越跑越多的原因
程序创建按钮前,会倒序检查工作表中的 Shapes;发现同名按钮就先删除,再创建一个新的圆角矩形,并通过 OnAction 绑定“生成批量单据”。所以无论运行多少次,最终都只有 1 个按钮。
连续打印的 4 个要点
• 每张单据使用相同的模板高度,目标起始行按固定行距递增。
• 在第 2 张及后续单据前插入 HPageBreak,确保一单一页。
• 打印区域覆盖全部 4 个模板块,不包含工作表的无关空白区域。
• 统一设置纵向 A4、合理页边距和每页缩放,最后只打开打印预览。
8 用结果证据完成业务验收
最终验收不能只看打印预览里出现了 4 页,还要把日志与源数据逐项对应。套打记录中的单号、客户、商品、数量和金额,必须来自被选中的 4 行源数据。

图 10 套打记录生成 4 条记录,金额分别为 8550、4200、2100、5280 元
逐项验收清单
1. 页数:连续打印预览显示共 4 页。
2. 顺序:单号依次为 001、002、004、005,与源表从上到下的选中顺序一致。
3. 排除:标记为“否”的 003 和 006 不进入单据与日志。
4. 金额:4 条金额分别为 8550、4200、2100、5280 元。
5. 合计:套打记录金额列合计 20130 元。
6. 状态:4 条记录均为“已生成”,并写入生成时间。
7. 保护:源数据与发货单模板没有被覆盖。

图 11 选中金额列后,状态栏显示求和 20130
9 重新运行为什么仍然是干净结果
办公自动化最容易忽略的风险,是宏第一次运行正常,第二次开始重复累加。本案例把“重复运行”写进提示词,也写进验收流程。
重复运行前程序会做 3 件事
1. 删除旧的“批量单据”并重新按当前源数据生成。
2. 清空“套打记录”第 5 行以后的旧清单,再写入本次结果。
3. 删除同名按钮后再创建,保证按钮数量始终为 1。
幂等性验收
再次点击“批量生成单据”后,结果仍应为 4 页、4 条记录和 1 个按钮,而不是 8 页、8 条记录或 2 个按钮。
10 把这个案例迁移到其他单据
批量套打的核心模式非常通用:一行源数据、一份固定模板、一个输出页、一条生成记录。更换业务时,主要修改的是源字段与模板位置的映射,而不是重新设计整个程序。
可复用的提示词公式
9 个要素说清楚,AI 才能稳定交付
数据来源 + 选中规则 + 单页模板 + 字段映射 + 输出位置 + 分页/打印规则 + 日志字段 + 重复运行规则 + 固定验收结果
可以直接替换成这些场景
• 销售订单按行生成送货单或出库单。
• 员工名单按行生成工资条、胸卡或培训证书。
• 客户数据按行生成报价单、对账单或催款函。
• 商品清单按行生成货架标签、条码标签或包装标签。
常见失误
1. 只说“批量打印”,没有说明由哪一列决定是否生成。
2. 直接在源模板上循环写入,导致模板内容被最后一条数据覆盖。
3. 没有处理合并单元格锚点,字段写入后看不到内容。
4. 只复制数值,没有保留格式、边框、行高和合并单元格。
5. 没有手动分页或打印区域,预览时一张单据被拆成两页。
6. 调用 PrintOut 直接发往打印机,缺少人工预览和确认。
7. 没有清理旧结果,重复运行后页数、日志和按钮不断累加。
完成后的自检问题
• 哪些行会生成单据,哪些行必须被排除?
• 源数据的一列,分别写到模板中的哪个位置?
• 为什么每张单据都能完整占据一个打印页?
• 重复运行后,怎样证明没有重复单据、重复日志和重复按钮?
• 程序为什么只打开打印预览,而不直接调用实体打印机?
结论
WorkBuddy 配合 VBAYYDS,把“选中数据、套入模板、连续分页、记录结果、重复刷新”这一整条 VBA 开发链变成了一次自然语言描述。真正需要用户掌握的不是背代码,而是把业务规则和验收结果讲清楚。

