目录
-
第一部分:VBA 入门
(图片来源网络,侵删)- 什么是 VBA?
- 为什么要在 Access 中使用 VBA?
- 如何打开 VBA 编辑器?
- 你的第一个 VBA 程序 ("Hello, World!")
- VBA 编辑器简介
- 如何运行和调试代码?
-
第二部分:VBA 基础语法
- 变量与常量
- 数据类型
- 运算符
- 条件语句
- 循环语句
- 过程与函数
-
第三部分:操作 Access 对象
- 理解 Access 对象模型
- 操作
DoCmd对象 (打开/关闭窗体/报表,执行宏等) - 操作
DAO或ADO对象 (操作数据表) - 操作窗体和控件
- 处理事件
-
第四部分:实战案例
- 案例1:创建一个登录验证窗体
- 案例2:动态生成报表数据
- 案例3:批量数据导入与处理
- 案例4:创建一个通用的消息提示框函数
-
第五部分:高级主题与最佳实践
(图片来源网络,侵删)- 错误处理
- 代码优化与性能
- 用户自定义函数
- 将数据库打包为 ACCDE 文件
第一部分:VBA 入门
什么是 VBA?
VBA 全称是 Visual Basic for Applications,是一种内嵌在 Microsoft Office 应用程序(如 Access, Excel, Word)中的编程语言,它允许你编写自定义的指令来自动化任务、扩展功能,并创建复杂的交互式应用程序。
VBA 就是让 Access “听懂”你的话,并按你的指令去执行操作。
为什么要在 Access 中使用 VBA?
- 自动化重复性任务:比如每月生成相同的报表、批量更新数据等,可以一键完成,节省大量时间。
- 增强用户体验:可以创建更智能、更友好的用户界面,例如动态显示/隐藏控件、数据验证、自定义导航等。
- 实现复杂逻辑:当 Access 的内置功能无法满足你的业务需求时,VBA 可以实现任何你能想到的逻辑。
- 集成外部数据:可以通过 VBA 连接其他数据库、文本文件、甚至网站 API。
如何打开 VBA 编辑器?
在 Access 数据库中,打开 VBA 编辑器有几种方法:
- 快捷键:按
Alt + F11。 - 功能区:点击“创建”选项卡,在最右侧找到“宏与代码”组,点击“Visual Basic”按钮。
打开后,你会看到一个类似下图的环境:

你的第一个 VBA 程序 ("Hello, World!")
- 在 VBA 编辑器中,点击菜单栏的
插入->模块,一个空白的代码窗口会出现在右侧。 - 在代码窗口中输入以下代码:
Sub SayHello()
MsgBox "Hello, World! 欢迎来到 Access VBA 世界!"
End Sub
- 将光标放在
Sub SayHello()和End Sub之间,按F5键,或者点击工具栏上的“运行”按钮(绿色三角形)。
你会看到一个弹窗,显示 "Hello, World!",恭喜你,你已经成功运行了你的第一个 VBA 程序!
- 代码解释:
Sub SayHello(): 定义一个名为SayHello的“子过程”(Subroutine),这是 VBA 中执行一系列操作的容器。MsgBox: 一个内置函数,用于显示一个消息框。End Sub: 标记子过程的结束。
VBA 编辑器简介
熟悉编辑器能让你事半功倍:
- 工程资源管理器:左侧窗口,显示你的数据库中所有的对象,如窗体、报表、模块等。
- 属性窗口:可以查看和修改选中对象(如窗体、控件、模块)的属性。
- 代码窗口:中间的主要区域,用于编写和编辑代码。
- 立即窗口:调试时非常有用,可以在里面直接执行单行代码并查看结果,按
Ctrl + G可以调出。
如何运行和调试代码?
- 运行:
F5: 运行当前过程。F8: 逐语句调试,每次只执行一行代码,非常有助于理解代码执行流程和查找错误。Shift + F8: 逐过程调试,将一个过程调用视为一步。
- 断点:在代码行号左侧单击,可以设置一个断点,程序运行到断点时会暂停,方便你检查变量的值。
- 监视窗口:可以添加变量,实时观察其值的变化。
第二部分:VBA 基础语法
变量与常量
变量是存储数据的容器,它的值可以在程序运行时改变。
' 声明一个变量 Dim myName As String Dim myAge As Integer ' 给变量赋值 myName = "张三" myAge = 30
常量也是存储数据的容器,但它的值在程序运行期间是固定不变的。
' 声明一个常量 Const PI As Double = 3.14159
数据类型
为变量选择正确的数据类型很重要,这关系到内存占用和程序性能。
| 数据类型 | 存储大小 | 描述 |
|---|---|---|
String |
1 字符/字节 | 字符串,如 "你好" |
Integer |
2 字节 | -32,768 到 32,767 之间的整数 |
Long |
4 字节 | -2,147,483,648 到 2,147,483,647 之间的整数 |
Double |
8 字节 | 双精度浮点数,用于小数,如 3.14 |
Date |
8 字节 | 日期和时间,如 #2025/10/27# |
Boolean |
2 字节 | 逻辑值,True 或 False |
Object |
4 字节 | 对象,如窗体、控件 |
运算符
- 算术运算符: (加), (减), (乘), (除),
\(整除),Mod(取余) - 比较运算符: (等于),
<>(不等于),>(大于),<(小于),>=(大于等于),<=(小于等于) - 逻辑运算符:
And(与),Or(或),Not(非)
条件语句
根据条件的真假来执行不同的代码块。
- If...Then...Else
Dim score As Integer
score = 85
If score >= 60 Then
MsgBox "及格了!"
Else
MsgBox "不及格!"
End If
- Select Case (适用于多条件选择)
Dim grade As String
grade = "A"
Select Case grade
Case "A"
MsgBox "优秀"
Case "B"
MsgBox "良好"
Case "C"
MsgBox "及格"
Case Else
MsgBox "不及格"
End Select
循环语句
重复执行一段代码。
- For...Next (用于已知循环次数)
' 从 1 循环到 5
Dim i As Integer
For i = 1 To 5
MsgBox "这是第 " & i & " 次循环"
Next i
- Do...Loop (用于未知循环次数,根据条件判断)
' 当条件为真时循环
Dim counter As Integer
counter = 0
Do While counter < 5
counter = counter + 1
MsgBox "计数器: " & counter
Loop
' 至少执行一次,然后判断条件
Dim anotherCounter As Integer
anotherCounter = 0
Do
anotherCounter = anotherCounter + 1
MsgBox "计数器: " & anotherCounter
Loop Until anotherCounter >= 5
过程与函数
-
Sub (子过程):执行一系列操作,但不返回值。
Sub ShowMessage() MsgBox "这是一个子过程" End Sub -
Function (函数):执行一系列操作,并返回一个值。
Function AddTwoNumbers(num1 As Integer, num2 As Integer) As Integer ' 计算结果并赋值给函数名 AddTwoNumbers = num1 + num2 End Function ' 如何调用函数 Dim result As Integer result = AddTwoNumbers(5, 10) ' result 的值将是 15
第三部分:操作 Access 对象
这是 VBA 的核心价值所在,VBA 通过访问 Access 的对象模型来与数据库交互。
理解 Access 对象模型
想象一个家族树:
- Application: 最顶层的对象,代表整个 Access 应用程序。
- CurrentDb: 代表当前打开的数据库。
- Container/Document: 代表数据库中的对象集合,如所有表、所有窗体。
- Form/Report: 代表一个具体的窗体或报表。
- Control: 代表窗体或报表上的一个控件,如文本框、按钮。
- Recordset: 代表一个数据记录集,通常用于查询和操作数据。
操作 DoCmd 对象
DoCmd 是一个强大的对象,用于执行 Access 的命令,就像你在界面上点击按钮一样。
' 打开一个名为 "客户信息" 的窗体 DoCmd.OpenForm "客户信息" ' 以“数据表”视图打开窗体 DoCmd.OpenForm "客户信息", acFormDS ' 关闭当前窗体 DoCmd.Close acForm, Me.Name ' Me.Name 指代当前窗体 ' 执行一个名为 "备份数据" 的宏 DoCmd.RunMacro "备份数据"
操作 DAO 或 ADO 对象 (操作数据表)
这是最常用的数据操作方式,我们以 DAO (Data Access Objects) 为例,因为它与 Access 结合更紧密。
步骤:
-
引用库: 在 VBA 编辑器中,点击
工具->引用,确保勾选了 "Microsoft DAO 3.6 Object Library"。 -
声明变量:
Dim db As DAO.Database Dim rs As DAO.Recordset Dim strSql As String
-
打开数据库和记录集:
Set db = CurrentDb ' 获取当前数据库 ' 定义 SQL 查询语句 strSql = "SELECT * FROM 员工 WHERE 部门 = '销售部'" ' 打开记录集 Set rs = db.OpenRecordset(strSql, dbOpenSnapshot)
-
遍历和操作记录:
' 检查是否有记录 If Not rs.EOF Then ' EOF (End of File) 表示记录集末尾 ' 移动到第一条记录 rs.MoveFirst ' 遍历所有记录 Do While Not rs.EOF Debug.Print rs("姓名") & " 的职位是: " & rs("职位") ' 在立即窗口打印 ' 修改字段值 rs.Edit rs("工资") = rs("工资") * 1.1 ' 工资增加10% rs.Update ' 移动到下一条记录 rs.MoveNext Loop Else MsgBox "没有找到符合条件的员工。" End If -
关闭和释放对象:
rs.Close Set rs = Nothing db.Close Set db = Nothing
操作窗体和控件
在窗体的 VBA 代码中,Me 关键字代表当前窗体对象。
' 假设窗体上有一个名为 "txtUserName" 的文本框 ' 禁用文本框 Me.txtUserName.Enabled = False ' 设置文本框的值 Me.txtUserName.Value = "请输入您的姓名" ' 获取文本框的值 Dim userName As String userName = Me.txtUserName.Value ' 可选:使用 .Value 可以省略 userName = Me.txtUserName ' 刷新窗体数据 Me.Requery
处理事件
VBA 最强大的功能之一就是响应用户操作。
-
如何添加事件代码:
- 打开窗体设计视图。
- 选中一个控件(比如一个按钮)。
- 在属性窗口中,选择“事件”选项卡。
- 找到“单击”事件,点击右侧的“...”按钮,选择“代码生成器”。
- Access 会自动为你创建一个事件过程框架。
-
示例:按钮的“单击”事件
' 这是自动生成的代码框架
Private Sub cmdLogin_Click()
' 在这里编写按钮被点击后要执行的代码
Dim userName As String
Dim password As String
' 从文本框获取用户名和密码
userName = Me.txtUserName.Value
password = Me.txtPassword.Value
' 简单验证
If userName = "admin" And password = "123456" Then
MsgBox "登录成功!"
' 打开主窗体
DoCmd.OpenForm "主菜单"
' 关闭当前登录窗体
DoCmd.Close acForm, Me.Name
Else
MsgBox "用户名或密码错误!"
End If
End Sub
第四部分:实战案例
案例1:创建一个登录验证窗体
目标:创建一个登录窗体,只有输入正确的用户名和密码才能进入系统。
- 创建表:创建一个“用户”表,包含
ID,用户名,密码等字段。 - 创建窗体:创建一个名为“frmLogin”的窗体,添加两个文本框(
txtUserName,txtPassword)和一个按钮(cmdLogin)。 - 编写代码:
- 为“密码”文本框的“输入时”事件添加代码,以显示密码字符()。
Private Sub txtPassword_KeyPress(KeyAscii As Integer) ' 按任意键时,将 KeyAscii 值改为 42,即星号 * KeyAscii = 42 End Sub - 为“登录”按钮的“单击”事件添加代码(见上一节)。
- 为“取消”按钮添加代码:
Private Sub cmdCancel_Click() ' 关闭当前窗体,并停止应用程序 DoCmd.Close acForm, Me.Name Application.Quit End Sub
- 为“密码”文本框的“输入时”事件添加代码,以显示密码字符()。
案例2:动态生成报表数据
目标:根据用户选择的部门,动态生成该部门的员工报表。
-
创建查询:创建一个名为“qry员工按部门”的查询,选择所有员工字段,并添加一个“部门”字段作为筛选条件。
-
创建报表:基于“qry员工按部门”查询创建一个报表。
-
创建窗体:创建一个窗体,添加一个下拉框(
cboDepartment),用于选择部门,和一个按钮(cmdPreview)。 -
为下拉框添加选项:在窗体的“加载”事件中,用代码填充下拉框的列表项。
Private Sub Form_Load() ' 假设 "部门" 表有一个 "部门名称" 字段 Me.cboDepartment.RowSource = "SELECT 部门名称 FROM 部门 ORDER BY 部门名称;" Me.cboDepartment = Null ' 默认不选择 End Sub -
为“预览”按钮添加代码:
Private Sub cmdPreview_Click() Dim selectedDept As String selectedDept = Me.cboDepartment.Value If IsNull(selectedDept) Then MsgBox "请先选择一个部门!" Exit Sub End If ' 设置查询的筛选条件 ' 这里的代码会修改查询的 SQL 语句 Dim db As DAO.Database Dim qdf As DAO.QueryDef Set db = CurrentDb Set qdf = db.QueryDefs("qry员工按部门") ' 构建新的 WHERE 子句 qdf.SQL = "SELECT * FROM 员工 WHERE 部门 = '" & selectedDept & "';" ' 打开报表 DoCmd.OpenReport "rpt员工报表", acViewPreview ' 恢复查询的原始状态(可选,但推荐) qdf.SQL = "SELECT * FROM 员工;" ' 或者从别处保存原始SQL End Sub
第五部分:高级主题与最佳实践
错误处理
代码总会出错,使用错误处理可以让程序在出错时不会崩溃,而是给出友好的提示。
使用 On Error GoTo 结构:
Sub SafeOpenForm()
On Error GoTo ErrorHandler ' 如果发生错误,跳转到 ErrorHandler 标签
' 可能会出错的代码
DoCmd.OpenForm "一个不存在的窗体"
' 如果执行到这里,说明没有错误
Exit Sub ' 退出过程,避免执行下面的错误处理代码
ErrorHandler:
' 错误处理代码
MsgBox "发生了一个错误: " & Err.Description, vbCritical, "错误"
' 可以在这里记录错误日志等
End Sub
代码优化与性能
- 声明变量:始终使用
Dim声明变量,并指定数据类型。 - 减少数据库往返:尽量在 VBA 中完成复杂的逻辑计算,而不是在数据库中执行大量查询。
- 使用 With 语句:当多次操作同一个对象时,
With语句可以使代码更简洁、高效。With Me.txtUserName .Value = "张三" .Enabled = True .SetFocus End With - 关闭对象:使用完
Recordset,Database等对象后,一定要用.Close和Set ... = Nothing释放资源。
用户自定义函数
将常用的代码块封装成函数,可以在整个数据库中重复使用。
' 创建一个函数,计算两个日期之间的工作日数
Public Function Workdays(startDate As Date, endDate As Date) As Integer
Dim i As Date
Dim count As Integer
count = 0
For i = startDate To endDate
' Weekday 函数返回 1 (周日) 到 7 (周六)
If Weekday(i, vbMonday) <= 5 Then ' 周一到周五
count = count + 1
End If
Next i
Workdays = count
End Function
' 如何调用
Dim days As Integer
days = Workdays #2025/10/1#, #2025/10/31#
MsgBox "10月份共有 " & days & " 个工作日。"
将数据库打包为 ACCDE 文件
当你完成开发后,可以将 .accdb 文件编译为 .accde 文件。
- 目的:
- 编译代码:所有 VBA 代码会被编译成机器码,提高运行速度。
- 保护源代码:用户无法查看或修改你的 VBA 代码,保护了你的知识产权。
- 方法:在 Access 中,点击
文件->信息->用 ACCDE 另存为。
学习资源推荐
- Microsoft 官方文档:最权威、最准确的信息来源。
- MSDN Access VBA 参考:详细的函数和对象说明。
- UtterAccess 论坛:全球最大的 Access 社区之一,可以找到大量问答和示例。
- YouTube/Bilibili:搜索 "Access VBA Tutorial",有很多优秀的视频教程。
- 书籍:《Access 2025 VBA 编程宝典》等经典书籍。
最后的小建议:
VBA 学习最好的方法就是 多写、多练、多尝试,从小的功能开始,逐步构建你的应用程序,遇到问题时,学会使用调试工具 (F8) 和立即窗口 (Ctrl+G) 来分析代码,你会发现很多问题都能迎刃而解。
祝你学习顺利!
