san*_*ica 4 excel vba arguments const excel-vba
我的意思是将参数传递给VBA Sub
,确保它不被修改.我会用C做的void mysub( const int i );
.
如果有的话,在VBA中推荐(即最简单,最便携等)的方法是什么?
问题是关于下面的第3项.有一个公认的答案,但问题是对替代品的开放(可能没有最后的说法).
编辑 澄清功能VBA与C的等效性,根据答案和评论需要:
通过引用传递.
在VBA中,Sub mysub(i as Integer)
(默认值或者Sub mysub(ByRef i as Integer)
),它通过引用获取参数而没有来自调用者(使用者Call mysub(j)
)的"请求权限",
在C中没有完全等价.在C中,最接近的是void mysub(int * i);
.但是在C语言中,我们必须通过调用来补充这一点mysub(&j);
,也就是说,调用者也可以使用它.
所述Sub
可修改"的变量"的值(i
在VBA; *i
在C)内被叫Sub
.如果是,它会自动修改调用者中的值.
通过价值传递.
在VBA,Sub mysub(ByVal i as Integer)
,其通过值取参数从呼叫者(谁使用Call mysub(j)
,甚至不知道是否mysub
需要ByVal
或ByRef
),对应于
在C,void mysub(int i);
.
所述Sub
可修改"的变量"的值(i
在VBA或C)内的所谓Sub
.如果是,则不会影响调用者的值.
通过价值传递,符合条件const
.
在C中void mysub(const int i);
.
在Sub
无法修改"的变量"的值(i
在C)内被叫Sub
.当然,调用者的值也没有任何变化.
试试这个:
Sub mysub(ByVal i As Integer)
End Sub
Run Code Online (Sandbox Code Playgroud)
http://msdn.microsoft.com/en-us/library/office/aa164263(v=office.10).aspx
重要文本: 定义过程时,有两个关于如何将参数传递给它的选择:通过引用或按值.当变量通过引用传递给过程时,VBA实际上将内存中变量的地址传递给过程,然后过程可以直接修改它.当执行返回到调用过程时,该变量包含修改后的值.当参数按值传递时,VBA会将变量的副本传递给过程.然后,该过程修改副本,变量的原始值保持不变; 当执行返回到调用过程时,该变量包含与传递之前相同的值.
编辑:
我现在明白你想要阻止在被调用的子例程中修改变量,而不是调用子调用.它不可能按照你的建议.VBA只有byval和byref来传递参数.你可以尝试这样的东西(这不是完整的证据):
在名为ConstInteger的类模块中:
Private i As Variant
Public Property Get Value() As Integer
Value = i
End Property
Public Property Let Value(Value As Integer)
If IsEmpty(i) Then i = Value
End Property
Run Code Online (Sandbox Code Playgroud)
测试:
Sub Caller()
Dim clsInt As New ConstInteger
clsInt.Value = 1
Call Called(clsInt)
End Sub
Sub Called(clsInt As ConstInteger)
Debug.Print clsInt.Value
clsInt.Value = 2
Debug.Print clsInt.Value
End Sub
Run Code Online (Sandbox Code Playgroud)