当.visible=$false时,Powershell Excel刷新失败,并显示“Call Was Rejected by Callee”(调用被被调用者拒绝)

wkftcu5l  于 12个月前  发布在  Shell
关注(0)|答案(3)|浏览(133)

我已经有这个问题很长一段时间了,只是出于懒惰而忽略了它,但我现在需要找到一个解决方案。我有一个脚本,它自动刷新大量的Excel文档。这工作得很好,但是,如果我将存储在网络共享上的工作簿的Visible属性设置为false,它就会失败。
重申一遍,visible属性设置为false时,刷新工作簿文件的效果很好,但保存在\位置上的任何工作簿都会失败,并出现错误“Call was rejected by callee”。visible属性设置为true时,所有刷新都可以正常工作。
下面是我的代码:

#Create Excel COM object and set it up for use.
$excel = new-object -comobject Excel.Application;
$excel.DisplayAlerts = $false;
#If this is set to false, saving the file on a network share will fail. Reason : Unknown.
$excel.Visible = $true;
#Open workbook which should be refreshed. 
$excelworkbook = $excel.workbooks.Open($workbook);
#Refresh WB
$excelworkbook.RefreshAll();
#Save
$excelworkbook.Save();
#Quit Excel
$excel.Quit();
#Destroy COM object. (VERY IMPORTANT!!!!!)
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel);

字符串
我尝试过以下方法:
1.在创建excel对象和设置visible属性之间添加Start-Sleep 30
1.设置显示警报前可见
1.我真的很希望它能成功
有什么想法吗?

dgsult0t

dgsult0t1#

在设置了Visible = $False的情况下,RefreshAll()似乎不会在后台等待刷新成功。
RefreshAll()Save()之间引入一个人工延迟,如下所示:

$excelworkbook.RefreshAll();
Start-Sleep -Seconds 30
$excelworkbook.Save();

字符串
或者,您也可以强制RefreshAll()同步执行,方法是将工作簿中所有查询表的BackgroundQuery = $Falseas suggested in this answer设置为类似的问题:

foreach ($Sheet in $excelworkbook.Worksheets) {
    foreach ($QTable in $Sheet.QueryTables) {
        $QTable.BackgroundQuery = $false
    }
}

cld4siwp

cld4siwp2#

我会添加一个DoEvents块:

[System.Windows.Forms.Application]::DoEvents()

字符串
这将允许队列循环通过你告诉Excel做的任何事情,然后返回到脚本执行。另一件事是设置UserControl = false,这样Excel就不会 * 简单地 * 隐藏,而是明显地超出了用户对事件的响应能力。
最后,在您设置其他属性之后,可能会有一些关于设置Visible的事情-可能是Excel通过切换其他一些事情来响应Visible事件的情况(不记得了,但我的大脑后面的东西说这是这种情况,或者曾经是)。

xcitsw88

xcitsw883#

在我的例子中,我使用Powershell打开一个Excel文件,运行一个宏,然后我想检查数据并在需要时编辑它。之后我保存了文件。我的问题是,我在单元格中键入一些内容后没有按Enter键,所以显然它仍然在执行一个进程,抛出了那个异常。我使用try catch块解决了这个问题,用弹出消息完成单元格编辑,然后再次执行.SaveAs()。

相关问题