我们对我们的自动Excel刷新过程(每天50多个Excel)感到好奇,该过程可以正常运行数年,并且过去能够维持两次Office升级(从2010年的32位升级到64位,然后到2013年的64位)版)。最近,我们被迫迁移到新的Office365。我们的麻烦开始了。
Excel文件已通过此自动化功能顺利刷新,然后在8-24小时后突然拒绝继续。我们收到一般错误消息:您不能在空值表达式上调用方法。就像某些东西突然失去了某些对象的执行权限。
错误与帐户(运行帐户)没有关联,与文件excel首次出现错误无关。一旦我们第一次收到此错误,excel文件的NON将被刷新。除非我们重启PC!然后,再过8-24小时,一切都会恢复正常!问题与特定文件,特定时间,特定用户或任何事物无关。问题行为非常不稳定,以至于我们无法清楚地确定问题的原因,我们无法找到任何模式。
最后我们发现一件事,不仅重置PC可以解决问题,而且重新启动进程OfficeClickToRun.exe总是有帮助的。很好奇,我试图永久禁用此过程,但随后Excel无法再启动,因此我被迫再次启用它。要使Excel在Office 365中工作,必须执行此过程。
我们用于自动Excel刷新的技术:SQL Server 2014作业计划程序,在其中执行了带有COM对象Excel的PowerShell脚本(请参见下面的代码)。
此外,一旦进程卡住,甚至直接执行Powershell脚本也将不再起作用(直到重置)。之后,Powershell完全拒绝打开Excel comobject。在发生错误之前,Powershell可以与相同的excel文件一起正常工作。这可能表明问题与从SQL(计划的作业)远程执行,模拟,用户帐户等无关。但是,我们怀疑这种自动化本身会在某个时候触发问题。 Powershell中的comobject会以某种方式阻止Excel应用程序启动。好像某些事物突然失去了对某些物体的特权。即使进程卡住了(出现第一个错误之后)并且直接Powershell不再起作用,您仍然可以手动打开excel并刷新它而没有任何问题。
我想问题在于该OfficeClickToRun进程。我什至在考虑在每次excel刷新迭代后自动重置此过程,以使其保持“新鲜”。但是,对于这种自动化,我没有适当的特权以管理员身份自动运行Powershell。也许有办法?
摘要:
最后的注释:
[我们具有所有这些Excel App DCOM对象设置,交互式用户,远程执行等。我们还创建了那些Fakes的“ Desktop”文件夹,并且需要执行其他技巧才能使此自动化过程正常运行。我们也尝试过卸载Office并重新安装新实例,这没有帮助。
问题:您有什么建议可以导致此问题吗?或者我们如何跟踪此问题?
Powershell代码示例(仅以下与Excel相关的行:]
function ReleaseRef ($ref)
{
if($ref -ne $Null)
{ ([System.Runtime.InteropServices.Marshal]::ReleaseComObject([System.__ComObject]$ref) -gt 0)
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()
}
}
#Start of the Procedure:
MakeReadWrite $TemplateFilePath
$excel = new-object -comobject excel.application
#$Excel.Visible = $false
$workbook = $excel.Workbooks.Open($TemplateFilePath)
$workBook.RefreshAll()
$workbook.Save()
$workbook.Close($False, $TemplateFilePath, $False)
$a = ReleaseRef($worksheet)
$a = ReleaseRef($workbook)
$excel.Quit()
$a = ReleaseRef($excel)
我将您的需求与类似的东西进行比较。
此错误:您不能在空值表达式上调用方法
通常表示您正在尝试运行不存在的方法或在不存在的表达式上运行的方法。示例Task.Run(),但不是Task.Runt()或Taskt.Run()