原来你是这样的过程,恕我愚昧这么久

2018-06-24  本文已影响0人  Data_Python_VBA

微信公众号原文

系统:Windows 7
软件:Excel 2010

使用场景or困惑

示例:调换两个变量对应的值,通过两种传递参数的方式(按值,按地址),看看效果

实现结果

1.png

思考:实验设计

  1. 主过程中有两个变量(x=1 ,y=2),有两个子过程,都是为了实现数值互换,一个是按值传递,一个是按地址传递
  2. 进入子过程前输出一次x,y值,进入子过程后再分别输出一次,效果如上图
  3. 核心概念:按值传递,在参数前加上 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

代码截图

2.png

子过程1:按值传递

Sub 按值传递_转换顺序(ByVal a, ByVal b)
    '换顺序
     c = a
     a = b
     b = c
     
End Sub

代码截图

3.png

子过程2:按地址传递

Sub 按地址传递_转换顺序(a, b)
    '换顺序
     c = a
     a = b
     b = c
     
End Sub

代码截图

4.png

代码解读

  1. 两个子过程,内部代码没有任何区别,只是在参数定义上有一点区别(ByVal
  2. 从效果上看,默认情况是按地址(ByRef)传递的,详细可以看看Sub的帮助文件
  3. 按值传递相当于复制一份原参数的值,对原参数没有任何影响;按地址传递,可以理解成直接对原参数进行操作

Sub的帮助文件

5.png

参数说明

6.png

Ps:那么一些特殊的变量类型,例如字典是不是也是按照这个标准去执行,大家不妨去试一下


更多精彩,请关注微信公众号
扫描二维码,关注本公众号

公众号底部二维码.jpg
上一篇下一篇

猜你喜欢

热点阅读