单元格处于单独的Excel窗口中编辑模式时无法添加OLEObject在PowerPoint中

首先,打开一个新的PowerPoint和Excel文档,然后单击Excel文档中的第一个(或任意)单元格,直到文本光标可见,切换回PowerPoint并运行以下VBA代码(假设您至less有一个空白幻灯片已经存在):

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

我收到以下错误(在多个系统上):

-2147467259对象“形状”的方法“AddOLEObject”失败

如果closures单独的Excel窗口,命令工作正常,如果您select不同的单元格而不显示文本光标,则该命令也可以正常工作。 关于在单独的Excel窗口中编辑单元格的事实似乎导致“AddOLEObject”方法失败。

这是我见过的最奇怪的VBA bug之一,我在三台独立的机器上validation了这种行为,在Office版本2013和2010上,有人知道为什么会出现这种情况?

不幸的是,大多数的MS Office VB错误消息都是错的!

为什么要低调? 因为他们很难被普通用户所理解。 当您单击错误消息中的“ 帮助 ”button时,会将您带到一些不相关的链接/页面在线或Excel帮助中。 我一直在考虑在Microsoft应用“ 错误消息编写器 ”:D

经过18年以上的工作,我可以认识到他们中的大多数人,但偶尔偶尔遇到一个新的错误信息,我实际上必须searchGoogle来找出那个错误的含义!

无论如何…

就像我说的,“ 当Excel处于编辑模式时,它会完全冻结

而要看到这个行动,并真正了解发生了什么事情,请执行以下操作。

  1. 打开Excel
  2. 添加一个新的工作表
  3. 转到任何工作表并按F2或双击单元格A1 。 即把单元格设置为编辑模式
  4. 打开Powerpoint
  5. 添加新的演示文稿
  6. 点击INSERT | OBJECT | Microsoft Excel工作表(新build),如下图所示

在这里输入图像说明

你会注意到,你现在会得到一个“ 易于理解的错误

在这里输入图像说明


替代

我们知道Excel让你创buildExcel的多个实例。 所以我们现在要做的是

  1. 创build一个新的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 

当你运行这个代码时,这是你将会看到的

在这里输入图像说明

总结所有意见并为将来的任何人提供一张路线图,下面是相关的事实,以及我在申请中为避免这个问题所作的决定:

  • 在编辑模式下,不能发送VBA命令给Excel,这会导致它冻结,或者如果通过外部应用程序(例如powerpoint)完成,它将输出前面提到的错误信息(@ SiddharthRout)

  • “在COM中,应用程序是一个处理来自COM客户端请求的COM服务器,由于该模式是在应用程序级而不是文档级进行处理的,因此会阻塞所有文档。 这意味着这里发布的解决scheme将无法工作。(@Comintern)

  • 这种行为是由devise,而不是一个错误(@SiddharthRout),没有办法改变Excel的编辑模式从PowerPoint,如果用户有一个Excel窗口打开在编辑模式下是不可能运行“AddOLEObject”命令从幻灯片。

我所做的是在我的error handling程序中创build一个特例来输出消息:

无法连接到Excel(错误-2147467259),请确保已安装Excel并且未处于“编辑模式”。 请closures任何打开的Excel副本,然后重试。

其余的将取决于用户…