VBA 过程(Sub) 入门教程和实例

落涛酱_4650

落涛酱_4650

2026-05-25

1103人浏览

原创

vba 过程(sub) 入门教程和实例

在掌握了 Excel VBA 的基本语法、变量定义以及程序控制结构之后,本章《VBA 过程与函数》将带您深入理解 VBA 中另一项关键且不可或缺的核心内容——过程(Sub)。

本文作为该章节的开篇,重点介绍 VBA 过程的基础知识,涵盖过程的编写方式、参数传递机制、执行流程及调用方法等内容。

在 VBA 编程中,过程是代码组织的基本单位,几乎所有逻辑都封装于一个或多个过程中。
实际开发实践中,推荐每个过程仅承担一项明确而具体的任务。因此,一个完整的 VBA 项目往往由多个相互协作的过程组成。这正是引入“过程”这一概念的重要意义所在。

通过合理使用过程,不仅能让代码结构更清晰、逻辑更易读,还能显著提升大型项目的可维护性与可扩展性。

过程的基本语法

VBA 过程以 Sub 关键字起始,以 End Sub 结束,中间包含若干条语句,共同实现某一特定功能。

不带参数的过程

最简形式的过程不接收任何输入参数,其标准语法如下:

Sub [过程名称]()
    语句1
    语句2
    ...
    语句n
End Sub

可见,过程以 Sub 开头,以 End Sub 收尾,并拥有唯一标识的名称,名称后紧跟一对空括号 ()。

举个简单示例:

Sub GreetUser()
    MsgBox "欢迎来到 VBA 世界!"
End Sub

这是一个名为 GreetUser 的过程,仅含一条语句:弹出提示框显示欢迎信息。

带参数的过程

过程也可以设计为接收一个或多个参数,这些参数可以是常量、变量或表达式,且需在定义时指定名称与数据类型(无需使用 Dim 声明)。

带参过程的标准语法如下:

Sub [过程名称]([参数名1] As [类型1], ..., [参数名n] As [类型n])
    语句1
    语句2
    ...
    语句n
End Sub

对比无参过程,区别在于括号内列出了参数列表,格式类似于变量声明,但省略了 Dim。

例如:

'定义一个接受姓名参数的过程
Sub GreetByName(userName As String)
    MsgBox "你好," & userName & "!"
End Sub

'在另一个过程中调用它,并传入具体值
Sub RunDemo()
    GreetByName "李四"
End Sub

运行 RunDemo 时,会向 GreetByName 传入字符串 "李四",最终弹窗显示:“你好,李四!”

子过程(Sub)的调用方式

将大段逻辑拆分为多个独立的过程,有助于提高代码复用率、增强模块化程度,并便于后期调试与维护。VBA 同样支持这种分层调用机制。

通常,一个项目会设定一个主控过程(也称为主过程或父过程),作为整个程序的起点;它再根据需要依次调用其他子过程或函数,完成一系列连贯操作。各子过程一般只负责单一职责,职责分明、边界清晰。

来看一个典型示例:

'主过程:程序入口点
Sub StartProject()
    Dim personName As String
    Dim jobTitle As String

    personName = "王五"
    jobTitle = "技术总监"

    DisplayInfo personName & " —— " & jobTitle
End Sub

'子过程:负责将信息写入单元格
Sub DisplayInfo(content As String)
    Range("A1").Value = content
End Sub

上述代码中,StartProject 是主过程,初始化变量后调用 DisplayInfo 子过程,将拼接好的文本写入工作表 A1 单元格。

接下来我们详细介绍两种常用的子过程调用语法。

直接调用法

直接书写过程名称即可触发调用,适用于所有类型的过程(无论是否带参)。

Sub Main()
    DoSomething
End Sub

Sub DoSomething()
    '执行某些操作
End Sub

若被调用的过程含有参数,则只需按顺序用逗号分隔各实参即可:

Sub Main()
    ProcessData 100, "已完成"
End Sub

Sub ProcessData(count As Integer, status As String)
    '处理数据
End Sub

使用 Call 关键字调用

另一种方式是在过程名前加上 Call 关键字:

Sub Main()
    Call DoSomething
End Sub

Sub DoSomething()
    '执行某些操作
End Sub

当存在参数时,必须将全部参数置于圆括号内:

Sub Main()
    Call ProcessData(100, "已完成")
End Sub

Sub ProcessData(count As Integer, status As String)
    '处理数据
End Sub
提示:从编程规范角度看,Call 并非必需,多数开发者倾向于采用更简洁的直接调用方式,因此建议优先使用第一种方法。

提前终止过程执行

默认情况下,VBA 过程自 Sub 行开始,至 End Sub 行结束。但在某些场景下,我们需要根据条件提前退出当前过程。VBA 提供了两种实现手段:Exit Sub 和 End。

Exit Sub 语句

一旦执行到 Exit Sub,系统立即停止当前过程的后续语句执行,并返回至上一级调用者(即父过程),继续运行剩余代码。

Sub Parent()
    Call Child
    MsgBox "这是父过程的最后一句"
End Sub

Sub Child()
    Exit Sub
    MsgBox "这句话永远不会显示"
End Sub

运行 Parent 后,只会看到弹窗“这是父过程的最后一句”。
值得注意的是:Exit Sub 仅影响当前过程本身,不会中断其上级过程的运行。

End 语句

End 是一种更为激进的终止方式。一旦遇到该语句,VBA 将立即终止当前正在运行的所有过程,包括当前过程及其所有调用链上的父过程。

Sub Parent()
    Call Child
    MsgBox "这行代码不会被执行"
End Sub

Sub Child()
    End
    MsgBox "这行代码也不会被执行"
End Sub

运行 Parent 后,整个 VBA 环境将瞬间退出,没有任何弹窗出现。

警告:End 类似于强制断电,具有极高风险。它会导致:

  • 所有未保存的对象状态丢失;
  • 已打开的用户窗体被强行关闭;
  • 所有事件(如 Worksheet_Change、Workbook_Open 等)均不再触发;
  • 所有对象引用失效;
  • 正在运行的其他宏也会一并终止。
    因此,在正式项目中应尽量避免使用 End。

小结

过程是 VBA 编程体系中的基石,绝大多数代码都依托于过程来组织与执行。它可以不接收参数,也可灵活支持多个强类型参数;可在内部调用其他过程,从而构建出层次分明、职责清晰的程序结构;同时,还支持通过 Exit Sub 或 End 实现不同粒度的提前退出机制。掌握好过程的概念与用法,是迈向高效 VBA 开发的关键一步。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

2026.10.28

60

16

Vite 如何搭配 Vue.js
Vite 如何搭配 Vue.js

Vite搭配Vue.js专题汇集创建Vue 3项目、配置开发环境、路径别名、Vue插件、代理、多环境构建与调试的已审核文章,帮助读者完成从初始化到日常开发的配置。

2026.10.28

40

15

Vite 项目目录怎么看
Vite 项目目录怎么看

Vite项目目录专题汇集入口文件、src源码、public静态资源、路径别名、项目根目录和构建输出目录相关的已审核文章,帮助读者理解各文件夹的用途与引用方式。

2026.10.28

120

10

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

2026.10.22

140

11

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

2026.10.22

120

10

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

2026.10.22

80

15

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

2026.10.22

40

10

PHP时间戳漏洞修复教程
PHP时间戳漏洞修复教程

本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。

2026.10.22

80

25

Golangci-lint配置文件与规则设置
Golangci-lint配置文件与规则设置

本专题聚焦Golangci-lint YAML配置文件,讲清运行参数、规则启停、目录排除、问题过滤及严重级别设置,便于团队统一检查标准。

2026.10.22

40

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习