VBA:Sub的const参数 - 避免修改由value传递的参数的值

san*_*ica 4 excel vba arguments const excel-vba

我的意思是将参数传递给VBA Sub,确保它不被修改.我会用C做的void mysub( const int i );.

如果有的话,在VBA中推荐(即最简单,最便携等)的方法是什么?

问题是关于下面的第3项.有一个公认的答案,但问题是对替代品的开放(可能没有最后的说法).

编辑 澄清功能VBA与C的等效性,根据答案和评论需要:

  1. 通过引用传递.
    在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.如果是,它会自动修改调用者中的值.

  2. 通过价值传递.
    在VBA,Sub mysub(ByVal i as Integer),其通过值取参数从呼叫者(谁使用Call mysub(j),甚至不知道是否mysub需要ByValByRef),对应于
    在C,void mysub(int i);.
    所述Sub可修改"的变量"的值(i在VBA或C)内的所谓Sub.如果是,则不会影响调用者的值.

  3. 通过价值传递,符合条件const.
    在Cvoid mysub(const int i);.
    Sub无法修改"的变量"的值(i在C)内被叫Sub.当然,调用者的值也没有任何变化.

Rea*_*idy 5

试试这个:

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)