如何将 VBA 类变量传递给模块函数 ByRef?

How Can I Pass a VBA Class Variable to a Module Function ByRef?

提问人:mikebinz 提问时间:5/8/2023 更新时间:5/8/2023 访问量:177

问:

可以将 VBA 类对象传递给模块函数,然后该函数可以修改类对象的变量。

但是,我找不到传递单个类变量来执行相同的操作,即修改单个类变量

在Excel中说明;

'Create a Class Module (named Class1) with One Variable;

 Public c1Long As Long

'Copy the following into a Code Module;

Public Cls1 As Class1

Function SetCls1LongTo2(ioCls1 As Class1)
    ioCls1.c1Long = 2
End Function

Function SetCls1LongTo3(ByRef ioLong As Long)
    Debug.Print "iPar=" & ioLong
    ioLong = 3
    Debug.Print "oPar=" & ioLong
End Function

现在从即时窗口运行以下命令;

Set Cls1=New Class1
Call SetCls1LongTo2(Cls1)
? Cls1.c1Long                       '2 as expected
Call SetCls1LongTo3(Cls1.c1Long)    'the Debug.Prints are "iPar=2" and "oPar=3" as expected
? Cls1.c1Long                       'still 2? 

SetCls1LongTo3() 中的“ByRef”应该是多余的,我已经尝试过没有; 我还尝试在 Cls1 中声明 c1Long 的 Let 和 Get 属性,结果都相同

就好像整个类对象可以通过引用传递,但单个类变量只能通过值传递?

任何人都可以解释这种行为,并希望也能提供解决方案吗?

Excel VBA 变量 按引用传递

评论

1赞 Lord-JulianXLII 5/8/2023
在大多数编程语言中,甚至没有通过引用传递“原始”/“值”类型的选项。有一些解决方法,例如将它们放入长度为 1 的数组中(但通常不鼓励这样做)。通过 Ref 传递这些类型(并更改它们)会使函数不纯净,从而降低可读性和单元测试能力。- 所以我的问题基本上是:为什么你需要一个对象属性来传递ByRef。什么需要这个(并且不能以另一种方式解决 - 比如只是传递对象)
0赞 DecimalTurn 5/9/2023
起初,我以为它与即时窗口 (IW) 有关,但如果您将建议的 IW 代码放在模块中,也会发生这种情况。似乎与通常的全局或模块级变量的访问方式不同:负责检索类/对象内部的内部 VBA 管道会传递它,而不管子/函数如何请求它。Member variablesvalue typeByVal
0赞 mikebinz 5/9/2023
是的,L-J,根据我的帖子,传递整个类对象是有效的,但如果我想做的只是更改其中一个变量,这似乎是非常低效的
0赞 Tim Williams 5/9/2023
您不是在传递整个对象,而只是传递指向它的指针。
0赞 mikebinz 5/10/2023
谢谢 Tim,也许是这样,但是传递整个对象会使函数特定于该类(例如 SetCls1LongTo2 中的 Class1),而 SetCls1LongTo3 作用于任何长变量 - 除非它是类变量

答: 暂无答案