调用过程和函数(VBA)

写在前面

很久以前感触于网上讲述VBA的强大,也学习了一点知识,主要从和Python的比较中学习。当然现在不用VBA了,一般用Python或者SQL。

地址传参 ByRef 和值传参 ByVal

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Function demo() As String ' 声明函数返回值类型

Dim x As Integer

x = 8

res = test_param(x) ' 用了括号就必须把返回值赋值给一个变量

MsgBox x ' 返回10,地址传参,这个和大部分的语言都不同

End Function

Function test_param(x As Integer) As String ' 由MsgBox x 可知,VB中缺省用地址传参

x = x + 2

test_param = 0
End Function

过程

call

1
2
3
4
5
6
7
8
9
10
11
12
Sub demo()
Dim x As Integer

x = 6
Call change(x) ' 调用过程用了call,必须用括号

MsgBox x
End Sub

Sub change(ByRef x As Integer) ' 引用,类似python中传入list效果
x = x + 2
End Sub

不加括号

1
2
3
4
5
6
7
8
9
10
11
12
Sub demo()
Dim x As Integer

x = 6
change x ' 没有用call,括号必须省略

MsgBox x
End Sub

Sub change(ByRef x As Integer) ' 引用,类似python中传入list效果
x = x + 2
End Sub

函数

传入的参数可以不定义类型,默认为变体型

1
2
3
4
Function demo(x) ' 传入variant,返回variant

'some code
End Function

Named Arguments

调用函数的时候传参的顺序可以随意打乱,前提是传参是写上参数的名字

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Function demo()
Dim res As Variant

res = my_sum(100, 2)
MsgBox res

res = my_sum(step_len:=3, end_num:=50) ' 可以不按照参数的定义顺序输入,和python很像
MsgBox res

End Function


Function my_sum(ByVal end_num, ByVal step_len)

Dim i As Integer
Dim sum As Integer

For i = 1 To end_num Step step_len
sum = sum + i
Next

my_sum = sum

End Function

不需要返回值,默认参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Function demo() As String ' 声明函数返回值类型

my_sum 20 ' 不需要返回值,不加括号,且不给任何变量赋值

End Function


Function my_sum(Optional end_num As Integer = 10) As Integer ' 默认参数
Dim sum As Integer
sum = 0

For i = 1 To end_num
sum = sum + i
Next

MsgBox end_num

my_sum = sum ' 函数的返回值,类似于return
End Function

括号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Function demo() As String ' 声明函数返回值类型

res = my_sum(20) ' 保留返回值需要加括号
MsgBox res

End Function


Function my_sum(Optional end_num As Integer = 10) As Integer ' 默认参数
Dim sum As Integer
sum = 0

For i = 1 To end_num
sum = sum + i
Next

my_sum = sum ' 函数的返回值,类似于return
End Function

中断函数

不会产生效果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Function demo() As String ' 声明函数返回值类型

Dim x As Integer

x = 5 ' 试试 x = 6

res = test_param(x) ' 用了括号就必须把返回值赋值给一个变量

MsgBox res '均返回1

End Function

Function test_param(x As Integer) As String ' 由MsgBox x 可知,VB中缺省用地址传参

If x >= 6 Then
test_param = 0 ' 这样并不会产生其他语言的return 0 的效果
Else
x = x + 2
End If

test_param = 1
End Function

exit function

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Function demo() As String ' 声明函数返回值类型

Dim x As Integer

x = 6

res = test_param(x) ' 用了括号就必须把返回值赋值给一个变量

MsgBox res ' 返回1

End Function

Function test_param(x As Integer) As String ' 由MsgBox x 可知,VB中缺省用地址传参

If x >= 6 Then
test_param = 0 ' 这样并不会产生其他语言的return 0 的效果
Exit Function '加上这条语句,才能中断函数
Else
x = x + 2
End If

test_param = 1
End Function
您的支持将鼓励我继续创作!