2016-07-29 134 views
1

首先,打開一個新的PowerPoint和Excel文檔,然後單擊Excel文檔中的第一個(或任意)單元格,直到文本光標可見,切換回PowerPoint和運行以下VBA代碼(假設你有至少一個空白幻燈片已經存在):無法在PowerPoint中單獨處於編輯模式時在PowerPoint中添加OLEObject

ActivePresentation.slides(1).Shapes.AddOLEObject 30, 30, 100, 100, "Excel.Sheet" 

我收到以下錯誤(在多個系統):

-2147467259方法對象'Shapes'的'AddOLEObject'失敗

如果您關閉單獨的Excel窗口,該命令可以正常工作,如果您選擇不同的單元格而不顯示文本光標,則該命令也可以正常工作。關於在單獨的Excel窗口中編輯單元格的事實似乎會導致「AddOLEObject」方法失敗。

這是我見過的最奇怪的VBA錯誤之一,我在三臺獨立的機器上驗證了這種行爲,並且在Office版本2013和2010上,有人知道爲什麼會發生這種情況?

+1

這是不是一個錯誤。當Excel處於編輯模式時,它會完全凍結:) –

+0

Excel無法在編輯模式下處理COM請求(原因很明顯)。正在積極編輯的'Range'的'.Value'是什麼? – Comintern

+0

@Comintern「明顯的原因」對我來說並不明顯,Google搜索「編輯模式下的Excel COM請求」後不明顯,這是否在任何地方記錄?另外,我正在編輯的「Value」可以是excel文檔中的任何單元格,但通常我使用A1來複制問題。 –

回答

1

不幸的是大多數的MS Office的VB錯誤的消息是低劣的!

爲什麼選擇Shitty?因爲它們很難被普通用戶理解。當您單擊錯誤消息中的「幫助」按鈕時,它會將您帶到一些不相關的鏈接/頁面或Excel幫助中。我在微軟已經想申請爲「錯誤信息作家」:d

與它一起工作了超過18年後,我可以識別大部分,但每一個現在,然後,當我遇到一個新的錯誤信息,我實際上已經搜索谷歌找到那個錯誤意味着什麼!

反正...

就像我說的,「當Excel在編輯模式下,它像是凍結完全

而要看到這個動作,並真正瞭解發生了什麼, 請執行下列操作。

  1. 打開Excel
  2. 添加新的工作表
  3. 去任何紙張,並按F2或細胞A1雙擊。即把細胞在編輯模式下
  4. 打開PowerPoint
  5. 添加一個新的演示
  6. 點擊插入| OBJECT | Microsoft Excel工作表,如下圖所示下面

enter image description here

你會發現,你現在會得到更多的 「容易理解錯誤

enter image description here

(新建)

替代

我們知道Excel讓您創建Excel的多個實例。所以,我們現在要做的就是

  1. 創建一個Excel
  2. 一個新的實例添加一個新的工作表
  3. 保存在用戶
  4. 的臨時目錄的空白工作簿添加該文件在PowerPoint中
  5. 刪除文件

優點

您可以添加形狀

缺點

您將無法與它的工作,直到你在編輯模式下的時間。我仍然試圖找出如何通過雙擊在單獨的Excel實例中打開它。

代碼

'~~> API to get user's temp path 
Private Declare Function GetTempPath Lib "kernel32" Alias "GetTempPathA" _ 
(ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long 

Private Const MAX_PATH As Long = 260 

Sub Sample() 
    Dim oxlapp As Object, oxlwb As Object 
    Dim filePath As String 

    '~~> Create a temporary file name 
    filePath = TempPath & Format(Now, "ddmmyyhhmmss") & ".xlsx" 

    '~~> Create a new instance 
    Set oxlapp = CreateObject("Excel.Application") 

    '~~> Add a new workbook 
    Set oxlwb = oxlapp.workbooks.Add 

    '~~> Save it to the temp directory 
    oxlwb.SaveAs filePath, 51 

    '~~> Add the shape 
    ActivePresentation.Slides(1).Shapes.AddOLEObject 30, 30, 100, 100, , filePath, msoFalse, , , , msoFalse 

    oxlwb.Close (False) 
    oxlapp.Quit 

    Kill filePath 
End Sub 

Function TempPath() As String 
    TempPath = String$(MAX_PATH, Chr$(0)) 
    GetTempPath MAX_PATH, TempPath 
    TempPath = Replace(TempPath, Chr$(0), "") 
End Function 

當你運行該代碼,這是你會看到什麼

enter image description here

1

彙總所有的意見,並在未來提供一個路線圖給任何人,這裏有相關的事實,我已經在我的申請作出的決定,以避免該問題:

  • 你不能當它處於編輯模式時,將VBA命令發送到Excel,這會導致它凍結,或者如果通過外部應用程序(即Powerpoint)完成,它將輸出先前所述的錯誤消息。(@ SiddharthRout)

  • 「In COM,應用程序是一個處理COM客戶端請求的COM服務器。由於該模式是在應用程序級別上處理的,文檔級別,它會阻止所有文檔。「 (@Comintern)

  • 此行爲是由設計而不是錯誤(@SiddharthRout),沒有辦法從PowerPoint更改Excel的編輯模式,如果用戶在編輯模式下打開Excel窗口,無法從PowerPoint運行「AddOLEObject」命令。

解決方案

我所做的是我的錯誤處理程序創建一個特殊的情況下輸出消息:

無法連接到Excel(錯誤-2147467259),確保Excel中是 已安裝且未處於「編輯模式」。請關閉任何打開的Excel副本,然後重試。

其餘部分將根據用戶...