创建后关闭 OLEObject Excel.Sheet 时出错

Error Closing OLEObject Excel.Sheet After Creation

假设您希望创建然后关闭链接 excel sheet:

Dim shp As shape
Set shp = Application.ActiveDocument.Shapes.AddOLEObject(ClassType:="Excel.Sheet")

DoEvents

shp.OLEFormat.Object.Close

失败并出现以下错误:

Run time error '1004'

Close method of Workbook class failed

为什么?我似乎无法在 word 中找到任何发生这种情况的示例,我能找到的最接近的示例是 this,它与用户表单的关系比实际功能更相关。

该错误似乎很普遍,有什么方法可以找到关闭方法失败的“原因”的更具体原因吗?似乎如果你 google 周围,你会发现这个错误是出于各种原因 (example, another example) 而抛出的,但这些似乎没有任何可以添加到这个特定问题。

注意:类似的错误发生在“shp.OLEFormat.Object.Save”

这个问题的通常原因是让对象"unselect"在文档表面...

根据我的经验,无法关闭在文档界面上激活的工作簿。这与 OLE 嵌入的工作方式有关。 Application.Quit 应该 有效,但(根据我的经验)Excel 无效。

实现此目的的最可靠方法是强制工作簿在独立 Excel.Application window 中打开,然后您可以关闭并保存工作簿并退出 Excel申请。

像下面这样的东西应该可以工作:

Dim shp as Word.Shape
Dim oleF as Word.OLEFormat
Dim xlBook as Excel.Workbook 'or Object
Dim xlApp as Excel.Application 'or Object

Set shp = Application.ActiveDocument.Shapes.AddOLEObject(ClassType:="Excel.Sheet")
Set olef = shp.OLEFormat
oelf.DoVerb VerbIndex:=wdOLEVerbOpen
Set xlBook = olef.Object
Set xlApp = xlBook.Application
'Do things here
xlBook.Close
xlApp.Quit
Set xlApp = Nothing
Set xlBook = Nothing

请注意,出于调试目的,您可能需要设置 xlApp.Visible = True。

可能 xlBook.Close 仍然会产生错误,即使除此之外的行为是正确的。在那种情况下,可以通过关闭这一行的错误消息来抑制错误,然后重新设置它:

On Error Resume Next
xlBook.Close
On Error GoTo 0

这是我想出的:

Set xlBook = olef.Object
Set xlApp = xlBook.Application

xlApp.SendKeys "{ESC}"

这将阻止 Excel.Application 和 return 用户使用 Word。与 运行 关闭工作簿的命令相同。