簡體   English   中英

通過 VBA 修改 Word 文檔中嵌入的 Excel 工作簿

[英]Modify embedded Excel workbook in Word document via VBA

我有一個 Word 文檔,其中包含兩個嵌入的 Excel 文件(使用插入 -> 對象 -> 從文件創建),我希望使用 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

哎呀,不要按照你在評論中的建議去做。 您可能最終會得到多個 Excel 實例(檢查任務管理器並查看執行代碼后有多少個)。

首先,添加對 Excel 對象庫的引用(Project->References & 選擇 Microsoft Excel Object Library)。 現在,您可以將對象聲明為真正的 Excel 類型並使用早期綁定,而不是將它們聲明為“對象”並使用后期綁定。 這不是絕對必要的,但除此之外,這意味着您在編輯代碼時會獲得智能感知。

在您執行 .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“擁有”用於就地編輯的實例,並將決定何時關閉它。 這實際上是一個問題,因為沒有明顯的方法可以強制取消激活嵌入的對象,因此在您執行上述代碼后圖表將保持打開狀態。

不過,有一種 hack-y 方法可以關閉圖表。 如果您添加告訴 Word 將其激活為其他內容,它將首先停用它。 因此,如果您告訴它以無意義的方式激活它,您將獲得正確的結果,因為它會停用它,然后無法重新激活它。 因此,添加以下行:

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

請注意,這將引發錯誤,因此您需要使用 On Error Resume Next 暫時禁用錯誤處理。 出於這個原因,我通常會創建一個 Deactivate 方法,以避免中斷我的主要方法中的錯誤處理。 如:

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

希望這會有所幫助。 加里

我有自己的問題的解決方案。 任何進一步的評論將不勝感激 -

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

有另一種讓圖表關閉的黑客方法:只需使用 find 函數查找文檔中不存在的內容。

EG

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

這將使您退出嵌入文件,關閉實例並返回主文檔,您可以從那里進行編碼。

希望這會有所幫助,這個問題讓我發瘋。

當您對 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。 沒有問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM