VBA 过程和函数:传递参数教程和实例
VBA 中,调用子过程或函数时,我们可以为它们传递参数。提供的参数可以在子过程或函数内部使用,让程序更动态和灵活。传递参数的前提是,先在子过程或函数定义阶段设置参数,后在调用时按正确的方式提供实际参数值。
本篇教程主要介绍传递参数的基础部分,主要内容包括:
- 带参数的子过程和函数的定义方法。
- 调用子过程和函数时,参数的书写方式。
- 可选参数的语法和实际用法。
关于子过程和函数、它们的区别以及如何调用,请看前几篇内容。
在子过程和函数中,传递参数的用法基本相同,本篇以子过程为例介绍参数的使用,函数中用法参考子过程。
带参数的子过程定义方法
子过程可以接受一个或多个参数,参数可以是常量、变量、表达式,并且每个参数指定其名称和数据类型。
看实际的例子,以下代码定义了带两个参数的一个过程,过程名是 CustomLog
,参数分别是 num
和 base
。此过程的用途是计算任意底数的对数,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
除了按顺序书写参数外,也可以按任意顺序书写参数,但是这时需要给出参数名。带参数名的传递参数语法如下:
[参数名]:=[实际参数值]
参数名后写冒号等号(:=),再写需传递的参数值。看实际的例子,以下三种方式是等效的。
'主入口
Sub Main()
CustomLog 100, 10 '方式一
CustomLog num:=100, base:=10 '方式二
CustomLog base:=10, num:=100 '方式三
End Sub
可选参数的用法
实际开发中,有时子过程的参数可能不是必须的,我们希望根据参数有无情况,执行不同的操作。针对这种情况,VBA 提供了可选参数机制。
可选参数语法
可选参数在定义子过程时需要指定,方法是在参数名前添加 Optional
关键词。
Optional [参数名] As [数据类型]
还是以 CustomLog
子过程为例,我们把底数 base
设为可选参数。
'声明一个带可选参数的子过程
Sub CustomLog(num As Double, Optional base As Integer)
'子过程代码
End Sub
调用时,VBA 会提示可选参数,参数放置在中括号中。
设置可选参数的默认值
可选参数定以后,如果在子过程中使用,需要判断参数有无提供。否则未提供而直接使用时,程序会出错。
针对这种情况,VBA 提供了默认值机制,即可选参数未提供时,使用预算设置好的默认值。
可选参数默认值,在定义过程时就设置,语法如下:
Optional [参数名] As [数据类型] = [默认值]
还是以 CustomLog
子过程为例,我们把底数 base
设为可选参数,并且默认值设为 10。
'声明一个带可选参数的子过程
Sub CustomLog(num As Double, Optional base As Integer = 10)
Debug.Print Log(num) / Log(base)
End Sub
调用时,如果提供了 base 底数,则以提供的底数计算;如果未提供 base 底数,则以默认值 10 计算。
'主入口
Sub Main()
CustomLog 100, 100 '返回 1
CustomLog 100 '返回 2
End Sub
可选参数的位置
当子过程有多个参数时,其中的可选参数需写在参数列表的末尾,否则 VBA 提示错误。
可选参数错误顺序:
可选参数的正确顺序:
总结
VBA 过程和函数均可以接受一个或多个参数。当调用它们时,需要注意传入的参数的书写顺序:不写参数名时,按照定义的顺序传递;写参数名时,对书写顺序没有要求。此外,过程和函数可以设置某一个参数是可选的,类似 VLOOKUP 函数的第四个参数,是否精确查找。当设置成可选时,还可以指定可选参数的默认值。
为什么我的vba模块里明明有代码,运行时宏窗口里却没有可选的宏?
就是在vba代码模式下点绿色三角号后,弹出宏窗口,但里面无宏可选。
正常情况下应该是直接就运行了,不弹出宏窗口的。
以下几种情况不显示宏,检查一下:
1、代码是函数;
2、代码在工作表、工作簿的模块内(应在标准模块中);
3、过程是有参数的过程;
4、模块顶部有 option private module 修饰语句。
这一部分没看懂,相比前面的跳跃性比较强。
这部分确实比较难理解。自己动手写几个过程尝试一下,实战有助于理解
老师,数组专题啥时候开讲
数组也快了,很快很快
emm,最后一段,是不是应该说非可选参数需要在前面即可,Optional 无论几个只要在后边就好。
可以这么理解
Public Function DA(ByRef W01 As Double, ByRef H01 As Double, ByRef W11 As Double, ByRef H11 As Doubl… 阅读更多 »
这个程序的稍显复杂,目标不是很明确,具体可以微信(office-guy)交流一下。
你好,CUSTOMLOG 是什么函数,我在百度上搜不到这哥VB函数
这个是使用VBA写的自定义函数,不是Excel自带函数
CustomLog 100 ‘返回 2
是不是应该返回10
底数默认是10,10² = 100,返回2