美文网首页
原来你是这样的过程,恕我愚昧这么久

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

作者: Data_Python_VBA | 来源:发表于2018-06-24 18:32 被阅读0次

    微信公众号原文

    系统:Windows 7
    软件:Excel 2010

    使用场景or困惑

    • 最近偶然发现一个问题,一个参数传递到子Sub过程后,在子Sub中进行完一波操作后,改变了该参数的值,返回到主过程中,该参数的对应值也变了
    • 这是为啥?不是默认按值传递参数吗,难道是按地址,还是按啥?一大波问号向我袭来
    • 其实一直以为默认是按值进行传递参数的(不知道这个默认从哪里来的),尴尬,原来不是,心疼以前写的代码一秒,多么幸运刚好没有影响,要不就崩了

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

    实现结果

    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

    相关文章

      网友评论

          本文标题:原来你是这样的过程,恕我愚昧这么久

          本文链接:https://www.haomeiwen.com/subject/fclsyftx.html