ByVal:传递变量时,复制一份该变量,传入过程或函数。在过程和函数内部对该变量进行修改,只对该副本有效,对上一级过程(父过程)的变量没有影响。ByRef:传递变量时,将该变量的引用地址传入过程或函数。传入引用地址意味着,在过程或函数内部对其修改时,也会影响上一级过程(父过程)中的变量
很多时候,我们为了程序的可读性和便于维护,会通过子程序或自定义函数的方式来构建主程序框架,不可避免的就需要使用到参数的传递,ByVal或ByRef。 01举个栗子 我们需要通过子程序Byval传递参数来显示字符串str的值,示例程序如下: Option Explicit Public Sub rocket_DemoByValue() '// 适用于ByVal示例 '// 2024-...
但在需要修改子程序中参数值的情况下,ByVal并不适用,因为修改的是副本而非原始值。2. ByRef的使用: 概念:ByRef传递的是参数的引用,即传递的是值的地址。 特点:在子程序中修改该引用的值,会直接影响到主程序中的原始值。 适用场景:当需要在子程序中修改主程序中的值时,使用ByRef更为合适。...
4、我们知道指针就是地址,对于VB/VBA而言就是Long类型。这是典型的整数数值类型,当ByRef传址时,就是将其Push到栈上,然而这仅是地址,要想参与计算,还得寻址取值。如果ByVal传值,则是直接将数值Push到栈上,然后就可以直接使用了,省去了寻址取值的过程。这么一比较,自然后者更更省指令(少包了一层,更直...
根据以上区别,我们可以总结出使用原则:当数据量大且无需改变原始值时,推荐使用ByRef以节省内存;反之,若需要在子程序中修改参数,则使用ByVal。举例来说,处理大量表格数据时,采用ByRef传递数组以减少内存消耗;而在需要修改单元格内容的场景下,则应使用ByVal确保主程序中的数据更新。综上,ByVal与...
这里的迷糊,仅跟VB/VBA自身的机制有关,因为到系统API调用层面,肯定都是指针了。这里实参的ByVal,其实是和Any形参传址要求是一致的,并不存在矛盾。怎么样,有没有惊喜呢?ByVal/ByRef不仅可修饰形参,更可修饰实参。尤其是ByVal修饰实参时,与形参的Any类型相结合,可以让VB/VBA代码变得异常灵活,也是使用VB/...
简明一点说:以ByVal传递给过程,过程里有代码对这个变量做了更改,在过程结束返回后这个变量还是调用过程前的值,不会变化。以ByRef传递给过 程,过程里有代码对这个变量做了更改,在过程结束返回后这个变量的值就是过程里改成的那个值。 下面举个例子: (1)ByVal示例 Sub TmpByVal() Dim a As String a = "2...
为了程序的可读性和便于维护,使用子程序或自定义函数构建主程序框架时,参数传递是不可避免的。在参数传递中,ByVal和ByRef是两种常见的方式。接下来,我们将通过实例来探讨它们的区别与使用。首先,我们通过一个例子来展示ByVal的使用。假设我们需要通过子程序显示字符串str的值,我们可以使用ByVal来传递...
1 按ByRef传递参数 我们看下面的代码:Function Triple(ByRef x As Integer) As Integer x = x * 3 Triple = x End Function Sub mynzD() 'ByRef and ByVal的比较 Dim x As Integer x = 10 MsgBox Triple(x)MsgBox x End Sub 代码截图:代码解读:我们在大脑中模拟运行一下mynzD过程,第一个弹出的...
byref ,被调用程序 按地址传递,传回主程序的参数,回调时会受影响。 按地址传递(ByRef),是指主程序直接将数据交给子过程(过程中定义传递方式),在过程中修改、调试、返回给主程序,主程序输出的是修改后的值。 VBA默认的是 byref方式 byval ,被调用程序 按值传递,传回主程序的参数,回调时会不受改变。