通过VBA在Word文档中修改embedded的Excel工作簿

我有一个Word文档,其中包含两个embedded式Excel文件(使用Insert – > Object – > Create From File添加),我希望使用Word VBA进行修改。 我已经到了可以打开embedded文件进行编辑的地步(请参阅下面的代码),但是我无法获得Excel工作簿的使用,我可以使用该工作簿进行修改并保存embedded文件。 有没有人有这个解决scheme? 提前致谢。

Sub TestMacro() Dim lNumShapes As Long Dim lShapeCnt As Long Dim xlApp As Object Dim wrdActDoc As Document Set wrdActDoc = ActiveDocument For lShapeCnt = 1 To 1 'wrdActDoc.InlineShapes.Count If wrdActDoc.InlineShapes(lShapeCnt).Type = wdInlineShapeEmbeddedOLEObject Then If wrdActDoc.InlineShapes(lShapeCnt).OLEFormat.ProgID = "Excel.Sheet.8" Then 'This opens the embedded Excel workbook using Excel wrdActDoc.InlineShapes(lShapeCnt).OLEFormat.Edit End If End If Next lShapeCnt End Sub 

哎呀,不要做你在评论中提出的build议。 你最终可能会得到多个Excel实例(查看任务pipe理器,看看有多less执行代码后)。

首先,添加对Excel对象库的引用(“项目” – >“引用”并select“Microsoft Excel对象库”)。 现在,您可以将对象声明为真正的Exceltypes,并使用早期绑定而不是将它们声明为“对象”,并使用后期绑定。 这不是绝对必要的,但是除了其他任何东西,这意味着在编辑代码时会得到Intellisense。

你做正确的事情,直到你做。OleFormat.Edit。 (我会亲自使用。OleFormat.Activate,但因为我从来没有尝试过使用。编辑我不能说,它有所作为)。

完成了.Activate(或者大概是.Edit)后,就可以访问OleFormat.Object成员。 由于embedded对象是一个Excel图表,“对象”将是Excel工作簿,因此您可以这样做:

昏暗oOleFormat OleFormat
设置oOleFormat = ...

 oOleFormat.Activate

 Dim oWorkbook As Excel.Workbook
设置oWorkbook = oOleFormat.Object

 '做工作簿的东西
 oWorkbook.Charts(1).ChartArea.Font.Bold = True

请注意,您不需要closuresExcel,而且实际上不能 – Word拥有用于就地编辑的实例,并将决定何时closures它。 这实际上是一个问题,因为没有明显的办法来强制embedded对象被停用,所以在执行上面的代码之后,图表将保持打开状态。

尽pipe如此,还是有一种可以让图表closures的方法。 如果你添加告诉Word来激活它,它会首先停用。 所以,如果你把它作为非感性的东西来激活它,你将会得到正确的结果,因为它会停用它,然后不能重新激活它。 所以,添加下面一行:

 oOleFormat.ActivateAs“This.Class.Does.Not.Exist”

请注意,这会引发错误,所以您需要使用On Error Resume Next暂时禁用error handling。 出于这个原因,我通常创build一个Deactivate方法,以避免中断我的主要方法中的error handling。 如:

 Private Sub DeactivateOleObject(ByRef oOleFormat as OleFormat)
    在错误恢复下一步
     oOleFormat.ActivateAs“This.Class.Does.Not.Exist”
结束小组

希望这可以帮助。 加里

有另一种方法可以让图表closures:只需使用find函数就可以find文档中不存在的内容。

例如

 With Selection.Find .ClearFormatting .Text = "wiffleball" .Execute Forward:=True End With 

这将带你离开embedded式文件,closures实例并返回到主文档,您可以从那里编码。

希望这有助于,这个问题使我疯狂。

我有一个解决我自己的问题。 任何进一步的意见将不胜感激 –

 Sub TestMacro() Dim lNumShapes As Long Dim lShapeCnt As Long Dim xlApp As Object Dim wrdActDoc As Document Set wrdActDoc = ActiveDocument For lShapeCnt = 1 To 1 'wrdActDoc.InlineShapes.Count If wrdActDoc.InlineShapes(lShapeCnt).Type = wdInlineShapeEmbeddedOLEObject Then If wrdActDoc.InlineShapes(lShapeCnt).OLEFormat.ProgID = "Excel.Sheet.8" Then wrdActDoc.InlineShapes(lShapeCnt).OLEFormat.Edit Set xlApp = GetObject(, "Excel.Application") xlApp.Workbooks(1).Worksheets(1).Range("A1") = "This is A modified" xlApp.Workbooks(1).Save xlApp.Workbooks(1).Close xlApp.Quit End If End If Next lShapeCnt End Sub