今日学习目标

  • 理解Sub过程和Function函数的区别
  • 学会定义和调用Sub过程
  • 学会定义和调用Function函数
  • 掌握参数传递

知识点

1. VBA函数和过程的区别

Sub过程执行操作,不返回值;Function函数执行操作后返回一个值。要"算出一个结果"就写Function,只是"做一件事"就写Sub。Function还能在单元格里当公式用(如 =计算面积(5, 3))。

2. Sub过程的定义与调用

vba
Sub 过程名(参数列表) ' 代码 End Sub

调用写 Call 过程名(参数) 或 过程名 参数。宏本质上就是无参数的Sub,按F5即可运行。

3. Function函数的定义与调用

vba
Function 函数名(参数列表) As 返回类型 ' 代码 函数名 = 返回值 End Function

关键是给函数名赋值,它决定返回值;漏了不报错,但永远返回0或空串。调用时用变量接住结果。

4. 参数传递:ByVal与ByRef

  • ByVal:把值的副本交给过程,内部修改不影响原变量
  • ByRef(默认):把变量本身交出去,内部修改会带回去

设 num1 = 10:ByVal过程里 x = x + 10 后 num1 仍是10,ByRef后变成20。工具函数建议显式ByVal。

今日代码

vba
Sub 调用过程示例() 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 Sub

area = 计算面积(5, 3) 是函数的标准用法:右边算出15,赋给左边变量。

实战场景

背景:财务审核报销单,单笔超1000元需主管审批,该判断在多张报表反复出现,写成Function处处可复用:

vba
Function 需要审批(金额 As Double) As Boolean 需要审批 = 金额 > 1000 End Function Sub 检查报销单() If 需要审批(1500) Then MsgBox "该笔报销需提交主管审批" Else MsgBox "该笔报销可直接通过" End If End Sub

运行后弹出"该笔报销需提交主管审批"。在工作表输入 =需要审批(B2) 它就是现成公式——业务规则沉淀成可复用的资产。

练习题

  1. 创建一个计算周长的函数
  2. 创建带默认参数的过程
  3. 创建一个求最大值函数

参考解答

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判断返回较大值。

延伸练习

  1. 把Day03的闰年判断改写成 Function 是闰年(y As Long) As Boolean 并在单元格验证。
  2. 写 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)整理制作