VBScript:被调用者拒绝的Excel应用程序对象状态栏调用

时间:2014-09-05 14:17:26

标签: excel vba excel-vba vbscript

当我尝试获取Excel的状态栏字符串时,我有一个VBScript错误。请参阅以下代码中的注释。我尝试将objExcel.DisplayStatusBar = True放在错误的行上方,但随后该行出错。这告诉我一些关于objExcel出错的事情(?)。如果我在错误的行之前放入一个msgbox,它会挂起整个vbs(预期的)。这个vbs在早上运行,所以当我看到msgbox弹出窗口并单击OK时,除了由于msgbox而挂起的vbs之外,所有系统都已经完成。我在msgbox上单击OK,我没有收到任何错误。我等待定时循环的原因是因为宏CreateModel有一些Application.OnTime调用它回到CreateModel,这是超出这个问题的原因所必需的。 VBScript并不“知道”我有OnTime调用,所以如果我不“等待”,它将继续执行其余的vbs代码,并因其他原因搞砸了。所以我必须等待并使用状态栏来了解所有内容何时完成。我不能做一个纯粹的定时等待,因为CreateModel及其相关的OnTime调用的处理时间变化很大。

有点令人困惑。如果您有任何调试建议和/或解决方案,请寻找。

编辑:如果有人知道如何为行sStatus = objExcel.StatusBar创建错误“被调用者拒绝的调用”,那将有助于我调试它。

EDIT2:这是错误的图片。该脚本是.vbs文件。我不得不为我的客户保护道路:

error picture

的VBScript:

Dim objExcel, wMn, r, wT
Set objExcel = CreateObject("Excel.Application")

Set wMn = objExcel.Workbooks.Open("Z:\path\Model_*.xlsm")
objExcel.Application.Visible = True


objExcel.Run "'Z:\path\" & wMn.Name & "'!CreateModel"

'wait until model is finished
'have to do this because Application.OnTime is called in CreateModel and vbs doesn't wait 
Dim sStatus
Dim dteWait
Do 

    dteWait = DateAdd("s", 600, Now()) '60 = 60 secs, 600 = 10 mins
    Do Until (Now() > dteWait)
    Loop 

    'objExcel.DisplayStatusBar = True  '<-- if I include this line I get the same error, but for this line
    'msgbox objExcel.StatusBar '<-- when I include this line no error occurs, see notes at top
    sStatus = objExcel.StatusBar    '<-- main error/issue

Loop While not sStatus = "Model Finished"

'more code below, but omitted for clarity

2 个答案:

答案 0 :(得分:1)

我会指定一个单元格,给它一个命名范围值(&#34; macroDoneCheck&#34;,例如),并让宏加载一个&#34;完成&#34;您可以在VBS中查看的值。在VBS中等待/检查此单元格值的循环类似于:

Do

  WScript.Sleep(30000) 'wait 30 seconds
  isDone = objExcel.Range("macroDoneCheck")

Loop While not isDone  = "Complete"

或类似的东西。您可能还需要指定工作表,例如:

  isDone = objExcel.Sheets("Sheet1").Range("macroDoneCheck")

答案 1 :(得分:1)

我记得n8。有最佳答案,因为这是一个更好的方法,但这个答案是较少的工作,它运作良好。

从我原来的代码/问题中,像这样包装sStatus = objExcel.StatusBar:

on error resume next
sStatus = objExcel.StatusBar    
on error goto 0

再一次,只是答案n8的替代方案。提供。它起作用是因为出于某种原因访问状态栏而CreateModel仍在运行时产生和错误,但在我的情况下,while循环继续循环,因为while条件尚未满足。我知道while条件最终会得到满足,即使访问状态栏在某些时候会产生错误,因为当我使用msgbox挂起vbs时(请参阅原始问题中的代码中的注释)如果我让它一切都没有问题挂得够久。这可能是其他人可能没有遇到的特定问题,因此请将其视为值得的。