系统:Windows 7
软件:Excel 2010
使用场景or困惑
- 最近偶然发现一个问题,一个参数传递到子Sub过程后,在子Sub中进行完一波操作后,改变了该参数的值,返回到主过程中,该参数的对应值也变了
- 这是为啥?不是默认按值传递参数吗,难道是按地址,还是按啥?一大波问号向我袭来
- 其实一直以为默认是按值进行传递参数的(不知道这个默认从哪里来的),尴尬,原来不是,心疼以前写的代码一秒,多么幸运刚好没有影响,要不就崩了
示例:调换两个变量对应的值,通过两种传递参数的方式(按值,按地址),看看效果
实现结果
思考:实验设计
- 主过程中有两个变量(
x=1 ,y=2
),有两个子过程,都是为了实现数值互换,一个是按值传递,一个是按地址传递 - 进入子过程前输出一次x,y值,进入子过程后再分别输出一次,效果如上图
- 核心概念:按值传递,在参数前加上 ByVal ;按地址传递,是默认的方式,啥也不用加,或者也可以加上 ByRef
代码
主过程main
Sub main()
x = 1
y = 2
Debug.Print ("转换之前")
Debug.Print ("x=" & x)
Debug.Print ("y=" & y)
Call 按值传递_转换顺序(x, y)
Debug.Print ("")
Debug.Print ("按值传递")
Debug.Print ("x=" & x)
Debug.Print ("y=" & y)
Call 按地址传递_转换顺序(x, y)
Debug.Print ("")
Debug.Print ("按地址传递")
Debug.Print ("x=" & x)
Debug.Print ("y=" & y)
End Sub
代码截图
子过程1:按值传递
Sub 按值传递_转换顺序(ByVal a, ByVal b)
'换顺序
c = a
a = b
b = c
End Sub
代码截图
子过程2:按地址传递
Sub 按地址传递_转换顺序(a, b)
'换顺序
c = a
a = b
b = c
End Sub
代码截图
代码解读
- 两个子过程,内部代码没有任何区别,只是在参数定义上有一点区别(ByVal)
- 从效果上看,默认情况是按地址(ByRef)传递的,详细可以看看Sub的帮助文件
- 按值传递相当于复制一份原参数的值,对原参数没有任何影响;按地址传递,可以理解成直接对原参数进行操作
Sub的帮助文件
参数说明
Ps:那么一些特殊的变量类型,例如字典是不是也是按照这个标准去执行,大家不妨去试一下
更多精彩,请关注微信公众号
扫描二维码,关注本公众号
网友评论