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

时间:2016-07-29 17:25:39

标签: excel vba powerpoint powerpoint-vba powerpoint-2013

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

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

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

  

-2147467259对象'Shapes'的方法'AddOLEObject'失败

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

这是我认为我遇到的最奇怪的VBA错误之一,我在三台独立的机器上验证了这种行为,在Office版本2013和2010上,有谁知道为什么会发生这种情况?

2 个答案:

答案 0 :(得分:1)

总结所有评论并为将来的任何人提供路线图,以下是相关事实,以及我在申请中为避免此问题所做的决定:

  • 您无法在编辑模式下向Excel发送VBA命令,这会导致它冻结,或者如果通过外部应用程序(即powerpoint)完成,它将输出先前声明的错误消息。(@ SiddharthRout )

  • “在COM中,应用程序是一个处理COM客户端请求的COM服务器。由于模式是在应用程序级别而不是文档级别处理的,因此它会阻止所有文档。”这意味着发布here的解决方案将无效。(@ Comintern)

  • 此行为是设计而非错误(@SiddharthRout),没有办法从PowerPoint更改Excel的编辑模式,如果用户在编辑模式下打开了Excel窗口则无法运行PowerPoint中的“AddOLEObject”命令。

解决方案

我所做的是在我的错误处理程序中创建一个特殊情况来输出消息:

  

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

其余的将取决于用户......

答案 1 :(得分:1)

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

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

使用它超过18年后,我可以识别它们中的大多数,但偶尔会遇到一条新的错误消息,我实际上必须搜索Google以找出该错误的含义!!! / p>

反正...

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

要了解这一点并真正了解正在发生的事情,请执行以下操作。

  1. 打开Excel
  2. 添加新工作表
  3. 转到任何工作表并按 F2 或双击单元格 A1 。即将单元格置于编辑模式
  4. 打开Powerpoint
  5. 添加新演示文稿
  6. 点击INSERT |对象| Microsoft Excel工作表(新建)如下图所示
  7. enter image description here

    您会注意到,现在您将获得更多“易于理解的错误

    enter image description here

    <强>替代

    我们知道Excel允许您创建多个Excel实例。所以我们现在要做的是

    1. 创建Excel的新实例
    2. 添加新工作表
    3. 将空白工作簿保存在用户的临时目录中
    4. 在PowerPoint中添加该文件
    5. 删除该文件
    6. <强>赞成

      您将能够添加形状

      <强>缺点

      在您处于编辑模式之前,您将无法使用它。我仍然试图通过双击来弄清楚如何在单独的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