gpt4 book ai didi

excel - 测试 Excel 是否已完成其启动/关闭序列

转载 作者:行者123 更新时间:2023-12-03 01:14:37 25 4
gpt4 key购买 nike

我正在使用 PowerShell通过 COM 自动执行一些 excel 任务,通过 PowerShell像这样的脚本:

$xl = new-object -ComObject Excel.Application
sleep 5
DO THINGS...
$xl.quit()
sleep 5
$null = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($xl)
[GC]::collect()

我的问题是,如果我忽略第一次调用 sleep , Excel 将无法执行需要加载项的任务,以及对 $xl.quit() 的调用不起作用,并且该过程无法退出,如下所示:
PS > Get-Process EXCEL

Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
784 104 104008 109380 944 3.21 5996 EXCEL

同样,如果我省略第二次调用 sleep , excel 来不及完成关闭,最终导致对话框提示“Microsoft Excel 已停止工作...”,下次 Excel 启动时,另一个对话框提示“Microsoft Excel 无法关闭正确,以安全模式启动?”
function XLtest {
$xl = new-object -ComObject Excel.Application
$xl.quit()
$null = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($xl)
[GC]::collect()
}

for($i=0;$i -lt 10; $i++){ XLtest } # generates multiple errors

显然这些是我想避免的问题,但是调用 sleep 5 的启发式解决方案在某些情况下仍然可能失败。有什么方法可以检测 excel 何时完成其启动序列并准备发出命令(特别是 xl.quit())以及关闭序列何时完成(即何时可以调用 [System....Marshal]::ReleaseComObject($xl)

最佳答案

如果没有像提到的 DO THINGS... 这样的加载项,就不可能重现您的确切环境和情况,但应该能够利用 Excel Application object 的成员来获得对应用程序状态的一些了解。

一个似乎可能的候选人是 _Application.CalculationState property 。如果强制进行完全重新计算,然后处理 Do While...: DoEvents: Loop,则伪计时器可能会暂停 powershell 脚本,而 Application.CalculationState 与 Internet.Explorer 对象的 xlDone 并不相同。一直等待它完成接收其网页。

$xl = new-object -ComObject Excel.Application
$xl.Calculate
do while $xl.CalculationState <> xlDone: $xl.DoEvents: Loop
$xl.quit()
... (do more things?)

如果您在关闭(并随后退出)之前保存,也可以使用 _Application.CalculateBeforeSave property 强制重新计算。

另一个不错的候选者是更简单的 _Application.Ready property
$xl = new-object -ComObject Excel.Application
do while not $xl.ready: $xl.DoEvents: Loop
$xl.quit()

有关可以确定“状态”的潜在属性的完整列表,请参见 Application Members (Excel)。更多信息在 Developer’s Guide to the Excel 2010 Application Object

关于excel - 测试 Excel 是否已完成其启动/关闭序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32513797/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com