首页 文章

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

提问于
浏览
7

我有一个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

3 回答

  • 2

    哎呀,不要做你在评论中提出的建议 . 您可能最终会得到多个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

    有另一种hackey方式来关闭图表:只需使用find函数在文档中查找不存在的内容 .

    例如

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

    这将带您离开嵌入式文件,关闭实例并返回主文档,您可以从那里进行编码 .

    希望这会有所帮助,这个问题让我发疯了 .

  • 5

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

    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
    

相关问题