[英]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.