在 VBA 编程中,Sub(子过程)和 Function(函数过程)是构建代码的两大基石。理解二者的区别并正确使用,是让代码既好用又好维护的关键。简单来说,Sub 负责执行动作,Function 负责计算并返回结果。
一、 Sub 过程:只做不说的“执行者”
Sub 是一系列 VBA 语句的集合,它像一个具体的动作指令,告诉 Excel 去执行某项操作(比如复制数据、设置格式、打开弹窗),但它执行完后不会给你一个可以放进单元格里的返回值。
1. 语法结构
定义一个 Sub 需要使用 Sub 关键字开头,以 End Sub 结尾。
Sub 过程名称()
' 这里写具体要执行的代码
' 代码块...
End Sub
2. 实操:创建一个自动调整格式的 Sub
我们要写一个过程,将选中的单元格背景设为黄色,字体设为红色,并弹窗提示。
- 按下
Alt + F11打开 VBA 编辑器。 - 在左侧工程窗口中,右键点击 你的工作簿名称。
- 选择 插入 -> 模块。
- 在右侧空白代码窗口中,输入 以下代码:
Sub 标记重要数据()
' 设置选中区域的背景色为黄色
Selection.Interior.Color = vbYellow
' 设置选中区域的字体颜色为红色
Selection.Font.Color = vbRed
' 弹出一个提示框
MsgBox "格式调整已完成!"
End Sub
- 回到 Excel 界面,选中 一片单元格区域。
- 按下
Alt + F8,选择标记重要数据,然后点击 执行。
观察结果,单元格格式变了,并且弹出了提示框。这就是 Sub 的典型用法:执行动作,不求回报(返回值)。
二、 Function 过程:精于计算的“计算器”
Function(函数)的主要目的是接收数据,进行处理,然后把结果返回给调用者。这与 Excel 自带的 SUM 或 VLOOKUP 函数完全一样。
1. 语法结构
定义 Function 时,必须指定函数的返回值类型(如 Integer, String, Double 等),并在函数体内将计算结果赋值给函数名本身。
Function 函数名称(参数1 As 类型, 参数2 As 类型) As 返回类型
' 处理逻辑...
' 【关键步骤】将最终结果赋值给函数名
函数名称 = 计算结果
End Function
2. 实操:创建一个计算个人所得税的 Function
假设我们需要计算一个简单的税额逻辑(此处仅为演示):应纳税所得额超过 5000 的部分按 10% 纳税。
- 在刚才的模块中,
End Sub下方继续输入 以下代码:
Function 计算税额(收入 As Double) As Double
const 免征额 As Double = 5000
' 如果收入小于免征额
If 收入 <= 免征额 Then
计算税额 = 0
Else
' 计算公式:(收入 - 免征额) * 税率
' 使用数学公式:$T = (I - D) \times R$,其中 T=税额, I=收入, D=免征额, R=税率
计算税额 = (收入 - 免征额) * 0.1
End If
End Function
- 回到 Excel 工作表界面。
- 在任意单元格中输入 公式:
=计算税额(8000)。 - 按下 回车。
单元格会显示 300。这里,Function 就像一个内置公式一样,接收了 8000 这个参数,经过计算,返回了 300 这个值。
三、 Sub 与 Function 的核心区别
为了让你在开发时能迅速做出选择,请参考下表。
| 特性 | Sub 过程 (Sub) | Function 过程 (Function) |
|---|---|---|
| 主要用途 | 执行操作、修改对象、控制流程 | 进行计算、返回特定值 |
| 返回值 | 无,无法直接在单元格公式中调用 | 有,可以在单元格公式或代码中调用 |
| 调用方式 | 只能通过 Call 关键字或直接写过程名调用 |
既可在单元格作为公式使用,也可在代码中调用 |
| 赋值方式 | 不需要给过程名赋值 | 必须将结果赋值给函数名(如 函数名 = 值) |
四、 进阶实战:让 Sub 调用 Function
在实际开发中,我们通常让 Sub 负责“输入和输出”(比如获取用户输入、显示结果),让 Function 负责“核心逻辑计算”。这种分工让代码更清晰。
场景:用户点击按钮 -> 输入工资 -> 计算税额 -> 弹窗显示结果。
操作步骤
- 在 VBA 编辑器中,输入 以下调用代码(之前的
计算税额函数需保留):
Sub 获取工资并算税()
Dim 用户工资 As Double
Dim 最终税额 As Double
' 1. 使用 InputBox 获取用户输入
用户工资 = InputBox("请输入您的税前工资:")
' 2. 调用我们之前写的 Function 进行计算
' 这里 Function 就像一台机器,投入工资,产出税额
最终税额 = 计算税额(用户工资)
' 3. 使用 MsgBox 显示结果,使用 & 符号连接字符串
MsgBox "您的工资为:" & 用户工资 & vbCrLf & "应缴税额为:" & 最终税额
End Sub
- 按下
F5运行获取工资并算税。 - 在弹出的输入框中输入
12000,点击 确定。 - 查看最终弹出的税额结果。
执行流程解析
下面的流程图展示了上述代码中数据是如何流动的。
通过这种组合,你将程序的“界面交互”与“业务逻辑”完全分离开来。如果将来税率变了,你只需要修改 Function 内部的计算公式,而不需要去动 Sub 中的交互代码。

暂无评论,快来抢沙发吧!