对此没有完美的解决方案,但大多数情况下有效的解决方案是强制打开/关闭OLEFormat.Object
。无论您是从 Word 外部重新水合嵌入的 Excel 工作表(即操作 Open XML 格式)还是通过对象模型执行此操作,都没有关系。它涉及到从 Word 中打开嵌入的 Excel 电子表格,然后关闭该对象,以便将图像更改为嵌入电子表格中的当前值并创建新图像。
这在一定程度上取决于您是在多个 Word 文档上执行此操作还是仅在一个 Word 文档上执行此操作。在前一种情况下,使用全局模板(例如 normal.dot 或您创建并放入 STARTUP 文件夹中的自定义模板),或者在后一种情况下,只需在一个文档后面运行代码。两者都有不同的方式让事情运行,但本质上你会挂接Document_Open
事件并从那里检查当前文档是否有 OLE 嵌入对象,如果有,则打开和关闭它们。
正如我所说,如果不陷入困境,代码就不漂亮。基本上是因为它使用SendKeys
。大多数时候,这会起作用。有些时候,它不会。这就是本质SendKeys
以及未经同意而获得焦点的其他程序(例如即时通讯程序)。
If Word has the focus (which means you can't open the VBE and press F5), this code should do the trick:
Sub UpdateEmbeddedXLSX()
Dim workbook As InlineShape
For Each workbook In ActiveDocument.InlineShapes
With workbook
If .Type = wdInlineShapeEmbeddedOLEObject Then
''# Excel.Sheet.12 for Excel 2007
If .OLEFormat.ClassType = "Excel.Sheet.12" Then
''# Open Object as spreadsheet
.OLEFormat.DoVerb wdOLEVerbPrimary
''# If you want, you can also do any updates here like
.OLEFormat.Object.ActiveSheet.Cells(2, 2).Value = ".1"
''# Nasty - but it works - SendKeys
SendKeys "{ESC}", True
End If
End If
End With
Next
End Sub
至少,您可以将此代码放入 normal.dot 中并将其分配给 QAT 以作为宏运行。
请注意,该代码不会绕过 Excel 打开、值更改然后关闭的问题 - 这是使用嵌入对象的重要组成部分。使用链接而不是嵌入将是完成所有这一切的更顺利的方法,但我意识到这并不总是一种选择。