可以在VBA中实现真正的ByRef吗?

时间:2014-05-30 10:43:51

标签: vba pass-by-reference

在最近使用PDF打印机进行测试后,我发现VBA的ByRef并没有按预期真正传递对变量的引用:asychnronously变量的值在通过引用传递时永远不会更新。

在以下简化示例中, ByRef Variable参数永远不会更改其值

'--- definition ---

Private Sub WaitUntilEqual(ByRef Variable As Variant, ByVal Value As Variant)
    Dim PollingInterval as Integer = 200
    Do While Variable <> Value 
        TimeSpent = TimeSpent + PollingInterval
        Sleep PollingInterval
    Loop
End Sub

'--- usage (initializations omitted) ---

PdfCreator.cPrint "filename1"
PdfCreator.cPrint "filename2"
PdfCreator.cPrint "filename3"
'at this point, PdfCreator.cCountOfPrintjobs is 0 and needs few seconds to raise to 3
WaitUntilEqual PdfCreator.cCountOfPrintjobs, 3  'this will stick forever - it shouldn't

这是VBA限制吗?这可以被规避吗?

我需要这个方法3-4次(它还包括超时等额外功能......)所以我不想通过复制粘贴重复整个等待循环。

1 个答案:

答案 0 :(得分:4)

不确定这有多少适用于VBA,但MSDN表示如果输出值没有&#34;地址&#34,则调用代码可以强制ByVal调用;,ie不是变量,而是评估,函数调用或立即常量等的结果。

假设cCountOfPrintjobs是对象Property Get的{​​{1}}。这意味着实际上有一个函数可以检查对象的内部,计算出有多少打印作业,并返回该值。该值返回&#34;在堆栈&#34;上,它没有固定的&#34;地址&#34;由您的代码进行轮询。为了避免读取无效/未设置的内存区域,VBA会将调用更改为PdfCreator,因此您的代码会挂起,因为没有任何内容可以更改参数值。

稍后编辑

z̫͋已经在评论部分给出了答案......