手动打开excel文件可以运行公式,用VBScript或PowerShell或Python的win32com打开excel文件就不行了

5 人关注

我遇到了一个脚本不能更新excel文件的问题,我把它简化为以下问题。

如果我打开一个excel文件,我可以进入公式选项卡,点击 "立即计算",它会花一点时间更新所有的计算结果。

如果我运行一个VBScript just 打开文件(见下面的代码),如果我进入公式标签并点击 "立即计算",它就会立即刷新,没有任何变化。

Dim objXLApp, objXLWb, objXLWs
Set objXLApp = CreateObject("Excel.Application")
objXLApp.Visible = True
Set objXLWb = objXLApp.Workbooks.Open(file_path.xls)

我已经尝试了各种各样的东西,比如。

objXLApp.Calculation = xlAutomatic
objXLApp.Calculate
objXLApp.CalculateFull
objXLApp.CalculateFullRebuild
objXLWb.RefreshAll
objXLWs.EnableCalculation = True
objXLWs.Calculate               

但这些似乎与进入标签并点击 "计算 "所做的事情相同,结果只是快速刷新,Excel页面根本没有尝试更新。

使用python的win32com模块时也是如此。我不能在打开的文件中运行计算。

import win32com.client as win32
excel = win32.Dispatch('Excel.Application')
excel.Visible = True
excel_workbook = excel.Workbooks.Open(file_path.xls)

使用PowerShell也是如此。

$excel = New-Object -com excel.application
$excel.Visible = $True
$workbook = $excel.Workbooks.Open( $file_path )

那么,为什么用这些语言打开的文件会以某种方式关闭计算公式的能力?

5 个评论
有趣的是。你有没有添加任何当你的工作簿被打开时自动执行的代码(例如在 Workbook_Open 中)?
我不确定你的意思,但不,除了我发布的内容外,我没有在任何东西上添加任何代码。
Bond
你的公式是否包含外部引用?
Bond
Try objXLApp.CalculateBeforeSave = True and then objXLWb.Save .
是的,实际上。有些公式是这样从PI软件中获取数据的。 osisoft.com/software-support/products/PI_DataLink.aspx .然而,当脚本打开文件夹时,我的页面上仍然有PI的附加标签。
python
winapi
excel
vbscript
vba
Charles Clayton
Charles Clayton
发布于 2014-07-30
3 个回答
Charles Clayton
Charles Clayton
发布于 2014-07-30
已采纳
0 人赞同

我发现了问题,用VBScript(或Powershell)打开excel页面不会自动包含手动打开时的插件,所以我需要手动添加这两个插件。

excel.AddIns.Add("C:\Program Files (x86)\PIPC\Excel\PITrendXL.xla").Installed = True
excel.AddIns.Add("C:\Program Files (x86)\PIPC\Excel\pipc32.xll").Installed = True
    
Bond
Bond
发布于 2014-07-30
0 人赞同

Try this. Just for testing.

' Launch Excel...
CreateObject("WScript.Shell").Run "excel.exe"
' Wait for it to load...
WScript.Sleep 5000
' Get the running instance...
Set Excel = GetObject(, "Excel.Application")
' Open your workbook...
Excel.Workbooks.Open strPath
' Now go and click the Calculate button and see if it works.
    
Set Excel = GetObject(, "Excel.Application") 处我得到一个 ActiveX component can't create object 的错误。而当我在逗号前加入文件名时,我得到了 File name or class name not found during Automation operation: 'GetObject'
Bond
在信息出现之前,Excel是否加载并运行?
非常有趣如果excel没有打开,我运行脚本,就会出现ActiveX错误。如果我打开excel然后运行脚本,程序就会运行得很好,是的,它可以让公式弹出!
是的。因此,由于某些原因,只运行一个 shell.run excel 并不工作,但如果我打开两个不同的空白工作簿,那么我可以得到工作簿并运行 excel.Calculate ,它就会工作。问题似乎只出现在 Set objXLApp = CreateObject("Excel.Application") 上,而 Set objXLApp = GetObject(,"Excel.Application") 则可以工作。
Bond
是的,这肯定是 CreateObject Workbooks.Open 的问题。通过使用 Shell.Run GetObject 来启动并连接到Excel,它应该告诉我们 CreateObject 是否是罪魁祸首。
Pike7893
Pike7893
发布于 2014-07-30
0 人赞同

试着添加一个模块,里面有这样的内容