当前位置:  开发笔记 > 后端 > 正文

通过VBA修改Word文档中的嵌入式Excel工作簿

如何解决《通过VBA修改Word文档中的嵌入式Excel工作簿》经验,为你挑选了1个好方法。

我有一个Word文档,其中包含两个嵌入的Excel文件(使用Insert - > Object - > Create From File添加),我希望使用Word VBA进行修改.我已经到了能够打开嵌入文件进行编辑的程度(参见下面的代码),但是我无法处理Excel工作簿,我可以使用它来进行修改并保存嵌入文件.有人有解决方案吗?提前致谢.

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

Gary McGill.. 7

哎呀,不要做你在评论中提出的建议.您可能最终会得到多个Excel实例(检查任务管理器并查看执行代码后有多少个实例).

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

你做的是正确的事,直到你做.OleFormat.Edit.(我个人会使用.OleFormat.Activate,但因为我从未尝试过使用过.Edit我不能说它有所作为).

完成.Activate(或者,可能是.Edit)后,您可以访问OleFormat.Object成员.由于嵌入的对象是Excel图表,因此"对象"将是Excel工作簿,因此您可以这样做:

Dim oOleFormat as OleFormat
Set oOleFormat = ...

oOleFormat.Activate

Dim oWorkbook As Excel.Workbook
Set oWorkbook = oOleFormat.Object

' Do stuff with the workbook
oWorkbook.Charts(1).ChartArea.Font.Bold = True

请注意,您不需要关闭Excel,实际上您不能 - Word"拥有"用于编辑的实例,并将决定何时关闭它.这实际上是一个问题,因为没有明显的方法来强制嵌入对象被取消激活,因此在执行上面的代码后图表将保持打开状态.

然而,有一种黑客方式让图表关闭.如果你添加告诉Word将其激活为其他东西,它将首先取消激活它.因此,如果你告诉它将它激活为非感性的东西,你将获得正确的结果,因为它将取消激活它,然后无法重新激活它.所以,添加以下行:

oOleFormat.ActivateAs "This.Class.Does.Not.Exist"

请注意,这将引发错误,因此您需要使用On Error Resume Next临时禁用错误处理.因此,我通常会创建一个Deactivate方法,以避免破坏main方法中的错误处理.如:

Private Sub DeactivateOleObject(ByRef oOleFormat as OleFormat)
    On Error Resume Next
    oOleFormat.ActivateAs "This.Class.Does.Not.Exist"
End Sub

希望这可以帮助.加里



1> Gary McGill..:

哎呀,不要做你在评论中提出的建议.您可能最终会得到多个Excel实例(检查任务管理器并查看执行代码后有多少个实例).

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

你做的是正确的事,直到你做.OleFormat.Edit.(我个人会使用.OleFormat.Activate,但因为我从未尝试过使用过.Edit我不能说它有所作为).

完成.Activate(或者,可能是.Edit)后,您可以访问OleFormat.Object成员.由于嵌入的对象是Excel图表,因此"对象"将是Excel工作簿,因此您可以这样做:

Dim oOleFormat as OleFormat
Set oOleFormat = ...

oOleFormat.Activate

Dim oWorkbook As Excel.Workbook
Set oWorkbook = oOleFormat.Object

' Do stuff with the workbook
oWorkbook.Charts(1).ChartArea.Font.Bold = True

请注意,您不需要关闭Excel,实际上您不能 - Word"拥有"用于编辑的实例,并将决定何时关闭它.这实际上是一个问题,因为没有明显的方法来强制嵌入对象被取消激活,因此在执行上面的代码后图表将保持打开状态.

然而,有一种黑客方式让图表关闭.如果你添加告诉Word将其激活为其他东西,它将首先取消激活它.因此,如果你告诉它将它激活为非感性的东西,你将获得正确的结果,因为它将取消激活它,然后无法重新激活它.所以,添加以下行:

oOleFormat.ActivateAs "This.Class.Does.Not.Exist"

请注意,这将引发错误,因此您需要使用On Error Resume Next临时禁用错误处理.因此,我通常会创建一个Deactivate方法,以避免破坏main方法中的错误处理.如:

Private Sub DeactivateOleObject(ByRef oOleFormat as OleFormat)
    On Error Resume Next
    oOleFormat.ActivateAs "This.Class.Does.Not.Exist"
End Sub

希望这可以帮助.加里

推荐阅读
大大炮
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有