杰瑞科技汇

Access VBA教程从哪开始学?

目录

  1. 第一部分:VBA 入门

    Access VBA教程从哪开始学?-图1
    (图片来源网络,侵删)
    • 什么是 VBA?
    • 为什么要在 Access 中使用 VBA?
    • 如何打开 VBA 编辑器?
    • 你的第一个 VBA 程序 ("Hello, World!")
    • VBA 编辑器简介
    • 如何运行和调试代码?
  2. 第二部分:VBA 基础语法

    • 变量与常量
    • 数据类型
    • 运算符
    • 条件语句
    • 循环语句
    • 过程与函数
  3. 第三部分:操作 Access 对象

    • 理解 Access 对象模型
    • 操作 DoCmd 对象 (打开/关闭窗体/报表,执行宏等)
    • 操作 DAOADO 对象 (操作数据表)
    • 操作窗体和控件
    • 处理事件
  4. 第四部分:实战案例

    • 案例1:创建一个登录验证窗体
    • 案例2:动态生成报表数据
    • 案例3:批量数据导入与处理
    • 案例4:创建一个通用的消息提示框函数
  5. 第五部分:高级主题与最佳实践

    Access VBA教程从哪开始学?-图2
    (图片来源网络,侵删)
    • 错误处理
    • 代码优化与性能
    • 用户自定义函数
    • 将数据库打包为 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”按钮。

打开后,你会看到一个类似下图的环境:

Access VBA教程从哪开始学?-图3
(图片来源网络,侵删)

你的第一个 VBA 程序 ("Hello, World!")

  1. 在 VBA 编辑器中,点击菜单栏的 插入 -> 模块,一个空白的代码窗口会出现在右侧。
  2. 在代码窗口中输入以下代码:
Sub SayHello()
    MsgBox "Hello, World! 欢迎来到 Access VBA 世界!"
End Sub
  1. 将光标放在 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 "备份数据"

操作 DAOADO 对象 (操作数据表)

这是最常用的数据操作方式,我们以 DAO (Data Access Objects) 为例,因为它与 Access 结合更紧密。

步骤:

  1. 引用库: 在 VBA 编辑器中,点击 工具 -> 引用,确保勾选了 "Microsoft DAO 3.6 Object Library"。

  2. 声明变量:

    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim strSql As String
  3. 打开数据库和记录集:

    Set db = CurrentDb ' 获取当前数据库
    ' 定义 SQL 查询语句
    strSql = "SELECT * FROM 员工 WHERE 部门 = '销售部'"
    ' 打开记录集
    Set rs = db.OpenRecordset(strSql, dbOpenSnapshot)
  4. 遍历和操作记录:

    ' 检查是否有记录
    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
  5. 关闭和释放对象:

    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 最强大的功能之一就是响应用户操作。

  • 如何添加事件代码

    1. 打开窗体设计视图。
    2. 选中一个控件(比如一个按钮)。
    3. 在属性窗口中,选择“事件”选项卡。
    4. 找到“单击”事件,点击右侧的“...”按钮,选择“代码生成器”。
    5. 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:创建一个登录验证窗体

目标:创建一个登录窗体,只有输入正确的用户名和密码才能进入系统。

  1. 创建表:创建一个“用户”表,包含 ID, 用户名, 密码 等字段。
  2. 创建窗体:创建一个名为“frmLogin”的窗体,添加两个文本框(txtUserName, txtPassword)和一个按钮(cmdLogin)。
  3. 编写代码
    • 为“密码”文本框的“输入时”事件添加代码,以显示密码字符()。
      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:动态生成报表数据

目标:根据用户选择的部门,动态生成该部门的员工报表。

  1. 创建查询:创建一个名为“qry员工按部门”的查询,选择所有员工字段,并添加一个“部门”字段作为筛选条件。

  2. 创建报表:基于“qry员工按部门”查询创建一个报表。

  3. 创建窗体:创建一个窗体,添加一个下拉框(cboDepartment),用于选择部门,和一个按钮(cmdPreview)。

  4. 为下拉框添加选项:在窗体的“加载”事件中,用代码填充下拉框的列表项。

    Private Sub Form_Load()
        ' 假设 "部门" 表有一个 "部门名称" 字段
        Me.cboDepartment.RowSource = "SELECT 部门名称 FROM 部门 ORDER BY 部门名称;"
        Me.cboDepartment = Null ' 默认不选择
    End Sub
  5. 为“预览”按钮添加代码

    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 等对象后,一定要用 .CloseSet ... = 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 文件。

  • 目的
    1. 编译代码:所有 VBA 代码会被编译成机器码,提高运行速度。
    2. 保护源代码:用户无法查看或修改你的 VBA 代码,保护了你的知识产权。
  • 方法:在 Access 中,点击 文件 -> 信息 -> 用 ACCDE 另存为

学习资源推荐

  • Microsoft 官方文档:最权威、最准确的信息来源。
  • MSDN Access VBA 参考:详细的函数和对象说明。
  • UtterAccess 论坛:全球最大的 Access 社区之一,可以找到大量问答和示例。
  • YouTube/Bilibili:搜索 "Access VBA Tutorial",有很多优秀的视频教程。
  • 书籍:《Access 2025 VBA 编程宝典》等经典书籍。

最后的小建议: VBA 学习最好的方法就是 多写、多练、多尝试,从小的功能开始,逐步构建你的应用程序,遇到问题时,学会使用调试工具 (F8) 和立即窗口 (Ctrl+G) 来分析代码,你会发现很多问题都能迎刃而解。

祝你学习顺利!

分享:
扫描分享到社交APP
上一篇
下一篇