本节摘要:宏是 Access 内置的积木式自动化工具,核心是"动作 + 参数"两列清单;它能覆盖打开对象、数据维护、流程控制、用户交互四大类需求,擅长顺序执行而惧怕复杂分支。本节用三个华彩按钮的真实宏做解剖,并给出何时应当换 VBA 的判据。
第 4 章的主控台按钮里已经埋了两种宏(OpenForm 与 OpenReport),但都是最浅的一档。这一节把宏的全貌铺开,让你知道这把无代码工具的刻度到底有多长。
打开宏设计器,你会看到一张表格,每行两个关键格:动作(下拉选择)与参数(随动作变化的填空)。理解宏就是理解这两个格子的组合律。整个宏对象加载的是一串按序执行的动作——宏天生是顺序机器。
动作家族按用途分四类,先混个脸熟:
四大家族 代表动作速览 对象操作 OpenForm OpenReport OpenQuery Close 关闭并刷新 数据处理 RunSQL Requery Refresh GoToRecord 查找记录 流程控制 If Else If 块 StopMacro SetProperty 注释块 用户交互 MessageBox 输入框 SetWarnings 撤销记录 导出格式化
有两个动作需要立刻建立安全意识。其一是 RunSQL:它在宏里直接执行一句 SQL,能跑 UPDATE 和 DELETE——威力与危险并存;其二叫 SetWarnings:用来关闭系统的确认弹窗,批量动作前关掉、跑完必须开回来,忘开 = 用户从此在无提示状态下改库。这两个我统称"电锯类动作",后文有专门的纪律。
老李抱怨过手动点保存容易漏检查。我们做了一个双击保存按钮的嵌入宏:
录入校验宏 动作序列 1 If [数量] Is Null Or [数量] 小于等于 0 MessageBox 数量还没填对哦 请检查数量框 StopMacro 终止往下走 2 If [客户ID] Is Null MessageBox 先选客户 再谈发货 StopMacro 3 GoToControl 移到保存确认位置 4 MessageBox 已通过基础检查 即将写入 带感叹号风格
这里出现了宏最有价值的结构——If 块。条件写在灰色标题行,成立时执行缩进的子动作,配合 StopMacro 实现"任一关不过就地喊停"。注意这个宏干的事和字段有效性规则并不重复:规则守的是单字段的合法性,宏守的是跨字段的业务关联(数量没填但客户已选之类的组合状态)。层次不同,各管一段。
采购小杨每天早上到岗第一件事是看缺什么货。做一个带自动执行的窗体方案:
现有量 < 安全库存);DCount 是几个万能取值函数之一(同门还有 DLookup、DSum),签名简单得感人:给个字段名、表名、可选条件,返回统计值。它们是把"问一句数据库"塞进表达式层的神器,记熟一个 DCount 就能省下十几个专用查询。

宏的天花板在哪里?三个信号出现任意一个就该移交给 VBA:
此外有一条工程习惯值得单独强调:能用嵌入式宏就不要用独立宏对象。嵌入式的跟着控件走,复制窗体自带逻辑,删控件逻辑一起消失,永远不会产生"孤儿宏"——那是接手别人库时最常见的考古现场。
华彩主控台上的"保存并出库"按钮值得逐行解剖,它是最能体现宏思维的样本。按下后依序发生四件事:先一条 If 判断窗体有无未保存改动(判断条件一行 Dirty=True);有则 Requery 刷新库存联动区;然后 MessageBox 弹出"已保存,出库完成";最后 Requery 整个列表区让同事的下单立刻可见。总耗时两分钟的搭建,换来的是录单员不再需要理解"什么时候该点刷新"这类内部概念。
两个组织技巧也随之进场。其一,长宏用子宏(Group)分节:把"校验区""落校区""刷新区"折叠成三组,半年后维护时一眼定位——宏设计器支持折叠条,比一大串平铺动作可读得多。其二,调试靠单步模式:在设计器里选中某行动作点"单步",运行时会一格格停在每步之间展示参数与结果,相当于给宏装了显微镜。这两招都是宏生态里的老手艺,可惜教程很少提。
还有一条值得写进团队约定:任何人不得在共享库里新建"临时试试"的宏对象,试验一律在自己前端的副本里做。宏对象虽然轻量,但它是库里最先被玩乱的部分——五个人各留三个宏一,三个月后导航窗口像废品站。纪律比功能重要,这一章处处都在验证这句话。
讲宏的边界前必须补一位低调成员:数据宏。前面的宏都挂在窗体控件上,而数据宏直接长在表对象上,比如"tblStock 追加记录后"或"修改前"这类表格级事件里写校验与联动。它的独特价值是绕不开——不管数据从哪个窗体进、从查询改、甚至从外部链接写入,表级宏都会拦路盘查。
华彩用它做过一件事:库存表上挂修改前校验,现有量改成负值一律拒绝并提示走红字流水。后来有一次新同事临时用数据表视图直接改数,漏掉了窗体的所有友好校验,最终被这道表级闸门拦下——三层防线的最后一层名副其实。
注意事项只有两条:数据宏不能弹复杂的自定义对话框(提示语能力有限),以及它会在批量动作查询时逐行触发、大数量下有性能开销。所以定位依旧是"守门员"而非"业务引擎",复杂逻辑仍归 VBA 管。
下一节正式进入代码世界。别慌,我们从读懂第一段报错开始。