
在 VBA 编程中,向子过程(Sub)或函数(Function)传递参数,是实现代码复用与逻辑动态化的关键手段。通过参数,外部数据可被引入过程内部参与运算或操作,从而提升程序的适应性和可维护性。但需注意:只有在定义阶段明确声明了参数,调用时才能传入对应值;否则将引发编译错误。
本文聚焦于参数传递的核心基础,涵盖以下要点:
- 如何为子过程和函数定义带参结构;
- 调用时参数的书写规范与灵活写法;
- 可选参数(Optional Parameter)的声明方式及其默认值设定。
有关子过程与函数的基本概念、差异对比及基础调用方法,可参考本系列前期内容。
由于子过程与函数在参数使用机制上高度一致,本文以子过程为示例展开讲解,函数中的参数用法可完全参照执行。
子过程支持接收一个或多个输入参数,这些参数可以是常量、变量、表达式等,且每个参数均需指定名称与对应的数据类型。
来看一个具体案例:下面定义了一个名为 CustomLog 的子过程,它接收两个参数——num(待求对数的数值)和 base(对数底数),用于计算任意底数下的对数值。
'声明一个带参数的子过程
Sub CustomLog(num As Double, base As Integer)
Debug.Print Log(num) / Log(base)
End Sub完成该定义后,在其他位置调用此过程时,VBA 编辑器会自动提示所需参数及其类型,便于开发者准确传参。
调用带参数的子过程
调用含参子过程最常用的方式,是严格按定义顺序依次提供参数值,各参数之间用英文逗号分隔。
沿用上述例子,在主过程中调用 CustomLog:
'主入口
Sub Main()
CustomLog 100, 10
End Sub此外,VBA 还支持按名称传递参数(Named Arguments),此时参数顺序不再受限,只需显式写出参数名并赋值即可。其语法格式为:
[参数名] := [实际值]
其中 := 是“命名赋值”操作符,不可省略或替换为 =。以下是三种等效的调用写法:
'主入口
Sub Main()
CustomLog 100, 10 '方式一:位置传参
CustomLog num:=100, base:=10 '方式二:命名传参(正序)
CustomLog base:=10, num:=100 '方式三:命名传参(逆序)
End Sub可选参数的用法
在实际开发中,并非所有参数都必须每次提供。例如某些功能具有“默认行为”,仅在需要定制时才额外指定参数。为此,VBA 提供了可选参数(Optional Parameter)机制。
可选参数的声明语法
在定义子过程时,只需在某参数前添加 Optional 关键字,即可将其设为可选:
Optional [参数名] As [数据类型]
仍以 CustomLog 为例,我们将底数 base 改为可选参数:
'声明一个带可选参数的子过程
Sub CustomLog(num As Double, Optional base As Integer)
'子过程代码
End Sub此时调用该过程时,VBA 将在智能提示中标注 base 为可选项,通常显示为 [base]。
为可选参数设置默认值
若未传入可选参数而在过程中直接使用,可能导致运行时错误(如类型不匹配或除零异常)。因此,推荐为可选参数预设一个合理的默认值。
设置默认值的语法如下:
Optional [参数名] As [数据类型] = [默认值]
更新后的 CustomLog 示例:
'声明一个带可选参数的子过程(含默认值)
Sub CustomLog(num As Double, Optional base As Integer = 10)
Debug.Print Log(num) / Log(base)
End Sub如此设计后:
- 若调用时传入
base(如CustomLog 100, 100),则按传入值计算; - 若未传入
base(如CustomLog 100),则自动采用默认值10进行计算。
'主入口
Sub Main()
CustomLog 100, 100 '结果为 1(log₁₀₀100 = 1)
CustomLog 100 '结果为 2(log₁₀100 = 2)
End Sub可选参数的位置限制
当子过程包含多个参数时,所有可选参数必须置于参数列表的末尾。若将必选参数放在可选参数之后,VBA 将报错:“Expected: list separator or )”。
错误示例(非法):
Sub BadExample(Optional base As Integer, num As Double) '❌ 错误:可选参数不能在前
正确示例(合法):
Sub GoodExample(num As Double, Optional base As Integer) '✅ 正确:可选参数在后
总结
VBA 中的过程与函数均可接收一个或多个参数,增强其通用性与灵活性。调用时应注意:
- 不使用参数名时,必须严格遵循定义顺序;
- 使用参数名时,顺序自由,但需确保参数名拼写准确;
- 可通过
Optional关键字将参数设为可选,并配合默认值避免空参风险; - 所有可选参数须统一放在参数列表尾部,这是 VBA 的强制语法要求。
这种参数机制,与 Excel 内置函数(如 VLOOKUP 的第四个参数 range_lookup)的设计思想一致,体现了“必要参数优先、可选配置补充”的良好编程实践。

















