optional [byval byref] [paramarray] 变量名() as 数据类型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了optional [byval byref] [paramarray] 变量名() as 数据类型相关的知识,希望对你有一定的参考价值。

上列语句的用法 及作用,请高手举例说明,谢谢
不明白,你能分开说不?
optional byval byref 各举一例 可以吗?真是麻烦你了

Optional 指的是可选参数
ByVal 指的是传递来的参数的值不会被改变(按值传递)
ByRef 住的是传递来的参数可能会被程序改变(按地址传递)
ParamArray指的是可选的数组

使用说明:
如果使用了 ParamArray,则任何参数都不能使用 Optional 声明。
如果使用了Optional ,则 arglist 中的后续参数都必须是可选的,而且必须都使用 Optional 关键字声明。
ParamArray 关键字不能与 ByVal,ByRef,或 Optional 一起使用。
上面的语句可以接
Function
Sub
Property

例如
Function Test (Optional Arg as Long = 5) '在可选参数没有被赋值的情况下,传递5
Function Test (ByVal Arg as Long ) 表示赋给Arg的变量不会被 改变
Function Test(ByRef Arg as Long) 表示赋给Arg的变量有可能会被过程改变

提示
Function 可以给程序一个返回值。(自身能够成为一个变量传递值)
Sub 自身不可以做为一个变量传递值

示例:
Function MyFunction(Arg1 as long) as Long
Sub MySub(Arg)
参考技术A Private Sub Form_Load()
Call mysub("测试") '调用过程~带参数
Call mysub '调用过程不带参数
End Sub

Sub mysub(Optional ByVal test As String = "123") 'Optional用来声明可选参数
MsgBox test
End Sub

optional 这个是声明是否是可选参数
后面这2个 byval byref 是代表参数的传递方式 byval 是按值传递 byref按地址传递

不管是否使用optional 都会用上 byval byref其中一个

VBA中ByVal和 ByRef有啥区别?

ByRef:

按地址传递(ByRef),是指主程序直接将数据交给子过程(过程中定义传递方式),在过程中修改、调试、返回给主程序,主程序输出的是修改后的值。

例如:如果我在参数中设为ByRef,那么ByRef的这个变量我可以改变它的值


ByVal:


按值传递(Byval),是指将主程序的值(副本一份)给子过程,过程对副本操作,主程序输出的仍是原值。若想输出值传递后的值,可在子过程中设置输出。

例如:如果我在参数中设为ByRef,那么ByRef的这个变量我不可以改变它的值,改变的只是它的副本,没有任何意义


下面是一个实例:


Sub Test(ByRef a As Integer, ByVal b As Integer) 
'注意,此处a是按地址传递,b是按值传递
a = 3
b = 4
End Sub

'这里是主程序
Sub Main()
Dim a As Integer
Dim b As Integer
a = 1
b = 2
Test(a, b)
MsgBox ("a=" & a & ";b=" & b)
End Sub

以上代码运行之后的结果是

a=3;b=2

这说明,ByRef 可以改变传入的值,而ByVal不行

参考技术A ByVal表示该参数按值传递。ByRef表示该参数按地址传递。ByRef 是 Visual Basic 的缺省选项。按值:一种将参数值而不是将地址传递给过程的方式,这就使过程访问到变量的复本。结果,过程不可改变变量的真正值。按地址:一种将参数地址而不是将值传递给过程的方式,这就使过程访问到实际的变量。结果,过程可改变变量的真正值。除非另作说明,否则按地址传递参数。简明一点说:以ByVal传递给过程,过程里有代码对这个变量做了更改,在过程结束返回后这个变量还是调用过程前的值,不会变化。以ByRef传递给过 程,过程里有代码对这个变量做了更改,在过程结束返回后这个变量的值就是过程里改成的那个值。下面举个例子:(1)ByVal示例Sub TmpByVal()Dim a As Stringa = "2"Call FunByVal(a)MsgBox CStr(a)End SubFunction FunByVal(ByVal a)a = "3"End Function(2)ByRef示例Sub TmpByRef()Dim a As Stringa = "2"Call FunByRef(a)总结:vb(vba)中,除非你有足够的理由和有了足够的准备接受传址得来的值,都要使用ByVal来传值,ByRef意味梦魇的开始!但不要因为怕 ByRef就不用,而是要注意出现梦魇时要想到那可能是使用ByRef的结果。本回答被提问者采纳

以上是关于optional [byval byref] [paramarray] 变量名() as 数据类型的主要内容,如果未能解决你的问题,请参考以下文章

ByVal 和 ByRef 的区别?

Objective-C in,out,inout,byref,byval, .. 等等。这些是啥?

VBA中ByVal和 ByRef有啥区别?

C# Core 3.1 ByRef 和 ByVal

JavaScript 传播语法与 jQuery $.extend - ByRef 和 ByVal

为啥 ByRef 不能与 WithEvents 一起使用?