设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
楼主: roych
打印 上一主题 下一主题

[模块/函数] 【新手入门】之五:公共变量与传址过程、传值过程

[复制链接]
11#
发表于 2012-9-25 00:39:31 | 只看该作者
我们一般会在下面第二个容易掉进陷井!

Sub testFuns()
    Dim lngRet As Long, varLong As Long
    varLong = 1
    fun1 varLong
    Debug.Print varLong

    varLong = 1
    fun1 (varLong)
    Debug.Print varLong

    varLong = 1
    Call fun1(varLong)
    Debug.Print varLong
   
    varLong = 1
    Call fun1((varLong))
    Debug.Print varLong
   
    varLong = 1
    Call fun1(lng:=varLong)
    Debug.Print varLong

    varLong = 1
    Call fun1(lng:=(varLong))
    Debug.Print varLong
End Sub

Function fun1(ByRef lng As Long) As Integer
    lng = 1000
End Function

输出得到:

1000
1
1000
1
1000
1

应该都看出来了吧,答案:
不管[Sub][Function],如果对参数变量加了括号,即使过程参数是传址,也会将参数作为传值(参数复本传入过程)
如果还不理解,将fun1改为两个参数(其他稍作修改)再运行,你就会彻底明白

Function fun1(ByRef lng As Long,lng2 As Long) As Integer
    lng = 1000
    lng2=2000
End Function
12#
发表于 2012-9-25 09:43:28 | 只看该作者
真的新手肯定早吓跑了.

点击这里给我发消息

13#
发表于 2012-9-25 10:04:24 | 只看该作者
lynnwang 发表于 2012-9-25 00:39
不管[Sub][Function],如果对参数变量加了括号,即使过程参数是传址,也会将参数作为传值(参数复本传入过程)


为什么?

点击这里给我发消息

14#
发表于 2012-9-25 10:21:50 | 只看该作者
推演
参数定义
function x(var as integer)  = function x(byref var as integer)

变量和表达式
传递参数时
  1. dim k
  2. dim a as integer
  3. k = x(a)    ' 传址,即传的变量的地址,函数内部可以影响 a 的值
复制代码
如果抛弃函数的返回值,VBA 要求如此书写
  1. x a    ' 同样传址,函数内部可以影响 a 的值
复制代码
(a) = (a + 0) ' 就 a 数值类型而言
因此 (a) 是表达式,它返回的另一个地址空间中的值,而不是 a 变量地址空间中的值

故:
  1. k = x((a)) ' 此时传递的不是 a 的地址,而是表达式 (a) 的地址,此时,函数内部影响的是表达式 (a) 地址空间中的,而不是 a 的值
复制代码
如果抛弃函数返回值,VBA 应该这样写
  1. x (a)
复制代码
15#
发表于 2012-9-25 22:08:37 | 只看该作者
还是老朱,牛叉,见多识广,分析到点了。

()=传值=值的复本
16#
发表于 2012-9-26 04:01:05 | 只看该作者
学习。
17#
发表于 2012-10-6 22:09:55 | 只看该作者
18#
发表于 2012-10-13 12:46:17 | 只看该作者
好好学习.
19#
发表于 2013-3-28 20:49:51 | 只看该作者
系统性学完。
20#
发表于 2013-6-27 18:40:32 | 只看该作者
学习学习,谢谢分享!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-4-26 22:49 , Processed in 0.107161 second(s), 31 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表