今日学习目标
- 理解Sub过程和Function函数的区别
- 学会定义和调用Sub过程
- 学会定义和调用Function函数
- 掌握参数传递
知识点
1. VBA函数和过程的区别
Sub过程执行操作,不返回值;Function函数执行操作后返回一个值。要"算出一个结果"就写Function,只是"做一件事"就写Sub。Function还能在单元格里当公式用(如 =计算面积(5, 3))。
2. Sub过程的定义与调用
vbaSub 过程名(参数列表)
' 代码
End Sub调用写 Call 过程名(参数) 或 过程名 参数。宏本质上就是无参数的Sub,按F5即可运行。
3. Function函数的定义与调用
vbaFunction 函数名(参数列表) As 返回类型
' 代码
函数名 = 返回值
End Function关键是给函数名赋值,它决定返回值;漏了不报错,但永远返回0或空串。调用时用变量接住结果。
4. 参数传递:ByVal与ByRef
ByVal:把值的副本交给过程,内部修改不影响原变量ByRef(默认):把变量本身交出去,内部修改会带回去
设 num1 = 10:ByVal过程里 x = x + 10 后 num1 仍是10,ByRef后变成20。工具函数建议显式ByVal。
今日代码
vbaSub 调用过程示例()
Call 显示欢迎信息
End Sub
Sub 显示欢迎信息()
MsgBox "欢迎学习VBA!", vbInformation
End Sub
Function 计算面积(长 As Double, 宽 As Double) As Double
计算面积 = 长 * 宽
End Function
Sub 调用函数示例()
Dim area As Double
area = 计算面积(5, 3)
MsgBox "面积: " & area
End Subarea = 计算面积(5, 3) 是函数的标准用法:右边算出15,赋给左边变量。
实战场景
背景:财务审核报销单,单笔超1000元需主管审批,该判断在多张报表反复出现,写成Function处处可复用:
vbaFunction 需要审批(金额 As Double) As Boolean
需要审批 = 金额 > 1000
End Function
Sub 检查报销单()
If 需要审批(1500) Then
MsgBox "该笔报销需提交主管审批"
Else
MsgBox "该笔报销可直接通过"
End If
End Sub运行后弹出"该笔报销需提交主管审批"。在工作表输入 =需要审批(B2) 它就是现成公式——业务规则沉淀成可复用的资产。
练习题
- 创建一个计算周长的函数
- 创建带默认参数的过程
- 创建一个求最大值函数
参考解答
1. Function计算周长(长 As Double, 宽 As Double) As Double,然后返回2 * (长 + 宽)。 2. Sub 欢迎(Optional name As String = "游客"),使用Optional关键字和默认值。 3. Function求最大值(a As Integer, b As Integer) As Integer,使用If判断返回较大值。
延伸练习
- 把Day03的闰年判断改写成
Function 是闰年(y As Long) As Boolean并在单元格验证。 - 写
Sub 交换(ByRef a As Long, ByRef b As Long)交换两个变量的值。
常见错误与排查
| 报错/现象 | 原因 | 解决方法 |
|---|---|---|
| 函数永远返回0或空串 | 忘了给函数名赋值 | Function内补上 函数名 = 返回值 |
Compile error: Expected: = |
把Function当语句单独调用 | 用 x = 计算面积(5, 3) 接住返回值 |
Compile error: Expected: end of statement |
不用Call时给多参数过程加了括号 | 写 Call 过程名(a, b) 或 过程名 a, b |
学习总结
Sub做事,Function算数;Function必须给函数名赋值。参数默认ByRef,工具函数建议显式ByVal。
由在线工具箱(www.vba.net)整理制作