我已经有这个问题很长一段时间了,只是出于懒惰而忽略了它,但我现在需要找到一个解决方案。我有一个脚本,它自动刷新大量的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.我真的很希望它能成功
有什么想法吗?
3条答案
按热度按时间dgsult0t1#
在设置了
Visible = $False
的情况下,RefreshAll()
似乎不会在后台等待刷新成功。在
RefreshAll()
和Save()
之间引入一个人工延迟,如下所示:字符串
或者,您也可以强制
RefreshAll()
同步执行,方法是将工作簿中所有查询表的BackgroundQuery = $False
,as suggested in this answer设置为类似的问题:型
cld4siwp2#
我会添加一个
DoEvents
块:字符串
这将允许队列循环通过你告诉Excel做的任何事情,然后返回到脚本执行。另一件事是设置
UserControl = false
,这样Excel就不会 * 简单地 * 隐藏,而是明显地超出了用户对事件的响应能力。最后,在您设置其他属性之后,可能会有一些关于设置
Visible
的事情-可能是Excel通过切换其他一些事情来响应Visible事件的情况(不记得了,但我的大脑后面的东西说这是这种情况,或者曾经是)。xcitsw883#
在我的例子中,我使用Powershell打开一个Excel文件,运行一个宏,然后我想检查数据并在需要时编辑它。之后我保存了文件。我的问题是,我在单元格中键入一些内容后没有按Enter键,所以显然它仍然在执行一个进程,抛出了那个异常。我使用try catch块解决了这个问题,用弹出消息完成单元格编辑,然后再次执行.SaveAs()。