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

时间:2009-01-27 15:19:06

标签: excel vba ms-word word-vba

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

4 个答案:

答案 0 :(得分:5)

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

首先,添加对Excel对象库的引用(Project-> References& choose Microsoft Excel Object Library)。现在,您可以将对象声明为真正的Excel类型并使用早期绑定,而不是将它们声明为“对象”并使用后期绑定。这不是绝对必要的,但除了其他任何内容之外,它意味着您在编辑代码时会获得智能感知。

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

完成.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 :(得分:2)

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

EG

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

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

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

答案 2 :(得分:1)

我有解决自己的问题。任何进一步的评论将不胜感激 -

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

答案 3 :(得分:0)

当您对 xlApp 进行分级时,您不会抓取特定的工作簿。因此,如果您引用一个数字,则您可能不在嵌入文件中。最好使用 Activeworkbook。 对我来说,workbook(1) 原来是我的个人隐藏 xl 文件,其中包含我的个人宏。

我不做测试,因为我的 .docx 中只有一个形状,但我认为“Excel.Sheet.8”这个数字对我来说是 0.12。

    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.ActiveWorkbook.Worksheets(1).Range("A1") = "This is A modified"
                    'xlApp.ActiveWorkbook.Save
                    'xlApp.ActiveWorkbook.Close
                    xlApp.Quit
                End If
            End If
        Next lShapeCnt
    
    End Sub

当我退出 xlApp 时,焦点会脱离嵌入的 xl。没问题。

相关问题