过程(sub)
无参数过程
Sub SayHello()Msgbox "Hello World"
End Sub
有参数过程
'声明一个过程
Sub SayHello(name As String)Msgbox "Hello" & name
End Sub'在另一个过程,调用上述过程,调用时,提供一个实际的 name 参数
Sub MyCode()SayHello "World 2"
End Sub
调用子过程
'主入口
Sub Main()Dim name As StringDim title As Stringname = "Zhang san"title = "CEO"WriteInfo name & "," & title
End Sub'子过程,在工作表A1单元格填写信息
Sub WriteInfo(info As String)Range("A1") = info
End Sub
从代码可读性的角度来看,这里推荐使用关键词
Call
调用子过程
点击查看代码
Sub Main()Call MySub
End SubSub MySub()'代码
End Sub
函数(Function)
VBA 函数与 VBA 过程很相似,除了使用的关键词外,主要区别是,函数可以返回值。
无参数函数
实例:
Function RandomLogic() As BooleanRandomLogic = Rnd() > 0.5
End Function
语法:
Function [函数名]() As [返回值类型]语句...[函数名] = [返回值]
End Function
有参数函数
实例:
Function Add2Number(num1 As Double, num2 As Double) As DoubleAdd2Number = num1 + num2
End Function
语法:
Function [函数名]([变量名1] As [数据类型1],...[变量名n] As [数据类型n]) As [返回值类型]语句...[函数名] = [返回值]
End Function
调用函数
调用有返回值的函数时,一般有两种情形:
- 一是,使用一个变量存储函数返回的值
- 二是,函数返回的值参与其他计算
实例:
Sub Main()'使用变量存储函数返回的值Dim result1 As Doubleresult1 = Add(12, 345)'函数返回值继续参与计算Dim result2 As Doubleresult2 = RandNum + Add(12, 345)
End Sub'函数:返回一个随机值
Function RandNum()RandNum = Rnd * 100
End Function
'函数:返回两数的和
Function Add(num1 As Double, num2 As Double) As DoubleAdd = num1 + num2
End Function
过程sub和函数的不同:函数可以有返回值(函数可以不返回值,这种情况其作用与子过程相同。因此建议,不需要返回值时,直接使用子过程代替函数。)
ByVal传值和ByRef传地址
VBA 中定义过程或函数时,如果需要传递变量,需指定参数的传递类型,包括以下 2 类:
ByVal
:传递参数的值
ByRef
:传递参数的引用
两种传递类型的说明和区别如下:
ByVal
:传递变量时,复制一份该变量,传入过程或函数。在过程和函数内部对该变量进行修改,只对该副本有效,对上一级过程(父过程)的变量没有影响。ByRef
:传递变量时,将该变量的引用地址传入过程或函数。传入引用地址意味着,在过程或函数内部对其修改时,也会影响上一级过程(父过程)中的变量的值。
ByVal 实例
Sub Test()Dim msg As Stringmsg = "main"TestSub1 msgMsgbox msgEnd Sub'ByVal 传递类型
Sub TestSub1(ByVal msg As String)msg = "val"
End Sub
ByRef 实例
Sub Test()Dim msg As Stringmsg = "main"TestSub2 msgMsgBox msgEnd Sub'ByRef 传递类型
Sub TestSub2(ByRef msg As String)msg = "ref"
End Sub
默认情况下,当省略传递类型时,默认值是 ByRef,因此以下两种写法是等效的。
'指定 ByRef 传递类型
Sub TestSub1(ByRef msg As String)End Sub'省略传递类型
Sub TestSub1(msg As String)End Sub
变量作用域
- 过程作用域
- 模块作用域
- 工程作用域
1、过程作用域
在过程或函数内部声明的变量,只有在当前过程或函数内被使用。
2、模块作用域
一个模块中,在任何一个过程和函数外面,使用关键词 Private 或 Dim 声明的变量,称之为模块变量,其作用域是当前模块。例如,
Dim guest As StringSub Test()Dim message As Stringguest = "张三"message = "你好"MsgBox message & "! " & guestEnd Sub
3、工程作用域
Excel VBA 中,一个 Excel 工作簿是一个 VBA 工程。与之对应,工程作用域表示变量在当前工程中的模块、Excel 对象、用户窗体、类模块中均可以被使用。
工程级别变量,在所在模块顶部声明 Option Private Module 修饰语句前提下,在过程或函数外面,使用关键词 Public 声明的变量,其作用域是当前工程。例如,
Option Private ModulePublic guest As StringSub Test()Dim message As Stringguest = "张三"message = "你好"MsgBox message & "! " & guestEnd Sub