本节摘要:VBA 是 Office 全家通用的编程语言。本节面向零基础读者给出最小语法集——变量与类型、分支、循环、过程封装,并用一个华彩的真实小工具(订单号生成器)把语法点串成完整可抄的代码。
宏走到边界处(5.1 末尾那三个信号),就该写代码了。好消息有三个:VBA 出自 Basic 家族,关键字接近自然英语;它和 Excel 的 VBA 是同一门语言,学会了到处通用;Access 环境里你要操作的对象模型高度收敛,常用方法两只手数得过来。坏消息只有一个:第一次运行报错时的挫败感,人人平等。这一节按"环境 → 最小语法 → 完整实例 → 读错本领"的顺序推进。
按下 Alt 加 F11 键打开 VBA 编辑器(简称 VBE),这是另一个独立窗口,左边工程资源管理器里能看到你库里的窗体报表,双击某个窗体进入它的代码页。三件初次配置建议一次做完:
VBE 初次配置清单 1 工具选项 要求变量声明 打勾 效果 每个模块顶部自动出现 Option Explicit 行 2 视图 立即窗口 呼出 这是你的草稿纸 单行代码当场执行看结果 3 认识 F8 键 单步执行 逐行走代码 是未来调试的主力键
第一条最重要:强制声明让拼错的变量名当场报错而不是静默新建一个空变量——VBA 老手与新手的一半差距就在这条习惯上。立即窗口的日常用法随手演示:输入 ? Date() 回车,立刻看到今天日期;问号是打印的意思。
块一:变量与类型。 声明格式 Dim 数量 As Long。常用类型一张表记牢:
| 类型 | 装什么 | 例 |
|---|---|---|
| Long | 整数计数 | 数量、ID |
| Double / Currency | 小数金额 | 合计额 |
| String | 文本 | 客户名称 |
| Date | 日期时间 | 截止日 |
| Boolean | 真假开关 | 是否审核 |
| Variant | 万能但少用 | 兜底 |
内存里的规则只有一条值得提前知道:类型错了不是编译错误而是运行时炸弹,Long 装不下小数、String 装不进日期都会当场翻脸——所以装箱环节要心里有数。
块二:分支。 两段式 If 和多岔口 Select Case:
If 库存数量 >= 本单需求 Then 可发货 = True Else MsgBox "库存不足 当前有 " & 库存数量 & " 件" End If Select Case 状态值 Case "待确认" 提示 = "等待主管确认" Case "已发货" 提示 = "运输中 请耐心" Case Else 提示 = "状态异常 请联系管理员" End Select
& 号负责字符串拼接,MsgBox 是弹窗函数——第一个常打交道的内置成员。
块三:循环。 两兄弟覆盖九成场景:
' For 已知次数 循环 Dim i As Long For i = 1 To 12 Debug.Print i & "月汇总处理" Next i ' Do While 满足条件才继续 适合边读边判断 Do While Not rst.EOF ' EOF 到达文件尾 则停 Debug.Print rst!货品名称 ' 感叹号取字段 一步到位 rst.MoveNext ' 移动到下一条 忘写就是死循环之最 Loop
第二段提前出现了 Recordset 的影子(下一节主角),这里只记住节奏:进入前 Open、逐条处理、每轮 MoveNext、结尾 Close。
块四:过程与函数。 把成段逻辑装进盒子里复用:
Sub 问好(姓名 As String) ' Sub 干活 不返回值 MsgBox "你好 " & 姓名 End Sub Function 下单月份(某日期 As Date) As Integer ' Function 返回值 下单月份 = Month(某日期) End Function ' 调用方 直接当命令用 或嵌进表达式 下单月份 #2026-08-15# ' 得 8
参数传进来、结果吐出去,盒子装好了主流程就清爽了。华彩后面所有模块都是这个套路的放大重演。
来一段真实工位的完整代码。需求:录单时自动产生今日流水号 HD20260827001 格式——HD 前缀加八位年月日加三位当日序号,每天归零:
Public Function 生成单号() As String Dim 前缀 As String, 日序号 As Long Dim 最大旧号 As Variant On Error GoTo 错误兜底 ' 错误跳转到标签 是 VBA 标准护网 前缀 = "HD" & Format(Date, "yyyymmdd") ' 找今天已经最大的号 DMax 取最大值 一行顶一段遍历 最大旧号 = DMax("业务单号", "订单", "业务单号 Like '" & 前缀 & "*'") If IsNull(最大旧号) Then 日序号 = 1 ' 今天第一单 Else ' 从右侧截出三位转成数字加一 再格式化补足三位 日序号 = Val(Right(最大旧号, 3)) + 1 End If 生成单号 = 前缀 & Format(日序号, "000") Exit Function 错误兜底: 生成单号 = "" ' 返回空 上层就知道失败了 MsgBox "单号生成失败 原因 " & Err.Description End Function
这段不足二十行的函数浓缩了五个惯用法,划重点:

最后练排错眼力。VBA 报错框给三样东西:编号、一句英文或机翻描述、按钮组。最常见的四位常客先认识:
错误急救卡 类型不匹配 13 类型表复习 装箱错位 未设置对象变量 91 少了一句 Set 打头的赋值 找不到项目 3078 表名或查询名敲错 先对照字典 参数不足 3061 SQL 字符串拼接丢了逗号或漏了字段名
两个调试动作比读十篇文档有用:一是按 F8 单步执行,看着变量悬窗里的值一步步变化,凶手自然现身;二是把可疑表达式粘进立即窗口加问号当场求值,比如 ? Left("abc", 2) 直接得 ab——立即窗口就是程序员的实体实验室。
代码能跑之后,马上要立的是风格。我们的约定只有三条:过程名与变量名一律用业务词汇(生成单号、日序号),杜绝 a、tmp1 这类占位符;每个模块顶部统一保留 Option Explicit(强制声明的开关要靠它逐模块锁死);缩进用 VBE 自带的 Tab 且提交前跑一次"调试菜单里的编译"——编译通过说明没有拼写级低错,是零成本的体检。风格不是洁癖,是把"读代码的成本"压到最低的公共投资。
补一句给零基础者的宽心话:本章全部例子的语法量,抵不上任何一门主流语言的十分之一——变量、分支、循环、过程四件套在任何语言里都是同一套思想,区别只在拼法。真正的门槛从来不是语法而是开始写的第一晚:报错十次、修好第十一次的那个晚上过去后,你就是会写程序的人了。
语法在身,下一节进入 Access 编程的正主:用对象模型正式读写数据库。