Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 7446|回复: 14

[分享] 【烟花原创】VBA零基础之第23篇 细说参数(三)

[复制链接]
发表于 2013-11-16 19:08 | 显示全部楼层 |阅读模式
本帖最后由 hwc2ycy 于 2013-12-4 09:07 编辑

今天我们聊聊在过程中参数的两种传递方式。

按值传递:ByVal
将参数值而不是将地址传递给过程的方式,这就使在过程中访问的只是变量的复本
  在过程中修改参数值的时候,其实修改的只是变量的复本的值,从而不会改变变量的真正值。
这里说到的地址,真正值,复本,可能把大家给绕晕了,看个例子。
  Sub Main()
      Dim a As Long
      Dim b As Long
      a= 1: b = 2
      MsgBox prompt:="a=" & a & ",b=" & b,Title:="调用过程前"
      Call ByVal1(a, b)
      MsgBox prompt:="a=" & a & ",b=" & b,Title:="调用过程后"
  End Sub

  Sub ByVal1(ByVal a As Long, ByVal b AsLong)
      MsgBox prompt:="修改a的值=100b的值等于100", Title:="按值传递"
      a= 100
      b= 100
  End Sub
 
 在sub过程Main里声明了ab两个长整型变量,a赋值1b赋值2
 在调用Sub过程ByVal1之前,先通过消息框显示ab的当前值。
 在sub过程ByVal1的声明里,通过使用ByVal 关键字,两个参数都是按值传递。
 在ByVal1过程内修改参数的变量值前先照例通过消息框显示参数变量的值。
 修改完后参数变量的值后,返回到Main过程里继续执行CALL下面的语句。

 这里的难点,就在于理解按值传递时,实际上传递的只是一个复本。
 理论是枯燥的,但是通过代码,大家兴许可以明白些。
 在被调用的过程中,参数变量的值该过程中修改后,在过程结束返回后,相关的变量值没有改变。
按地址传递:ByRef
参数地址而不是将值传递给过程的方式,在过程中访问到实际的变量。
  所以在过程中对参数变量的赋值,都会变量的真正值。
  除非另作说明,否则按地址传递参数。

我们看个例子。
  Sub Main()
      Dim a As Long
      Dim b As Long
      a= 1: b = 2
      MsgBox prompt:="a=" & a & ",b=" & b,Title:="调用过程前"
      Call ByRef1(a, b)
      MsgBox prompt:="a=" & a & ",b=" & b,Title:="调用过程后"
  End Sub

  Sub ByRef1(ByRef a As Long, ByRef b AsLong)
      MsgBox prompt:="修改a的值=100b的值等于100", Title:="按地址传递"
      a= 100
      b= 100
 End Sub

  由于不做说明的情况下,均是按址传递,所以上面的声明Sub ByRef1(ByRef a As Long, ByRef b As Long)也可以改成Sub ByRef1(aAs Long, b As Long)
  另外,在按址传递参数的方式下,传递一个常量值作为参数,即使修改了参数变量的值,也是不会保留的。
  例如 Call ByRef1(1,2)

额外知识点:
 A用户定义类型不能以ByVal的方式传递。

 B.数组中个别的元素可以按ByVal传递,但整个数组必须以ByRef传递
  可以传递括号中的数组参数,或是将它放在 Variant 之中,再将此 Variant 传递至ByVal 参数。
  示例:
  Sub test()
      Dim a As Variant
      Dim b()
      b= Range("a1:c3").Value
      a= b
      Call arr(a)
 End Sub

 Sub arr(ByVal a)
    a(1, 1) = 1
     a(2, 1) = "a"
     a(3, 1) = True
 End Sub
发表于 2013-11-16 19:12 | 显示全部楼层
回复

使用道具 举报

发表于 2013-11-16 19:18 | 显示全部楼层
回复

使用道具 举报

发表于 2013-11-22 16:40 | 显示全部楼层
{:1112:}
回复

使用道具 举报

发表于 2013-12-16 08:54 | 显示全部楼层
老师辛苦了
回复

使用道具 举报

发表于 2014-3-17 14:09 | 显示全部楼层
这章完全看晕过去了,要消化一阵了再来了~~~~
回复

使用道具 举报

发表于 2014-4-3 17:01 | 显示全部楼层
表示看不懂呢~
回复

使用道具 举报

发表于 2014-4-13 22:59 | 显示全部楼层
过来学习了
回复

使用道具 举报

发表于 2014-4-25 16:40 | 显示全部楼层
学习一下 谢谢
回复

使用道具 举报

发表于 2014-6-15 23:24 | 显示全部楼层
有些晕了的,谢谢老师分享,标记,二十三
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-2 08:01 , Processed in 0.414028 second(s), 6 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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