在最近使用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次(它还包括超时等额外功能......)所以我不想通过复制粘贴重复整个等待循环。
答案 0 :(得分:4)
不确定这有多少适用于VBA,但MSDN表示如果输出值没有&#34;地址&#34,则调用代码可以强制ByVal
调用;,ie不是变量,而是评估,函数调用或立即常量等的结果。
假设cCountOfPrintjobs
是对象Property Get
的{{1}}。这意味着实际上有一个函数可以检查对象的内部,计算出有多少打印作业,并返回该值。该值返回&#34;在堆栈&#34;上,它没有固定的&#34;地址&#34;由您的代码进行轮询。为了避免读取无效/未设置的内存区域,VBA会将调用更改为PdfCreator
,因此您的代码会挂起,因为没有任何内容可以更改参数值。
稍后编辑
z̫͋已经在评论部分给出了答案......