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

Unable to Add OLEObject In PowerPoint When Cell is in Edit Mode in Seperate Excel Window

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

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

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

-2147467259 Method 'AddOLEObject' of object 'Shapes' failed

如果您关闭单独的 Excel window,该命令可以正常工作,如果您 select 一个没有文本光标可见的不同单元格,该命令也可以正常工作。关于您在单独的 Excel window 中编辑单元格这一事实似乎导致 "AddOLEObject" 方法失败。

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

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

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

  • "In COM, the application is a COM server that handles requests from COM clients. Since the mode is handled on an application level and not a document level, it blocks for all documents." 这意味着发布 here 的解决方案将不起作用。(@Comintern)

  • 此行为是设计使然而非错误(@SiddharthRout),如果用户有 [=38],则无法从 PowerPoint 更改 Excel 的编辑模式=] window 在编辑模式下打开无法从 PowerPoint 运行 "AddOLEObject" 命令。

解决方案

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

Failed to Connect to Excel(Error -2147467259), Ensure that Excel is Installed and is not in "Edit Mode". Please close any open copies of Excel and try again.

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

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

为什么很糟糕?因为普通用户很难理解它们。当您单击错误消息中的“帮助”按钮时,它会将您带到一些不相关的 link/page 联机或 Excel 帮助中。我一直在考虑申请成为 Microsoft 的“错误消息编写者”:D

使用它超过 18 年之后,我可以认出其中的大部分,但时不时地,当我遇到新的错误消息时,我实际上必须搜索 Google 才能找到那是什么错误的意思!!!

总之...

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

要查看实际效果并真正了解正在发生的事情,请执行以下操作。

  1. 打开Excel
  2. 添加新作品sheet
  3. 转到任何 sheet 并按 F2 或双击单元格 A1。即将单元格置于编辑模式
  4. 打开 Powerpoint
  5. 添加新演示文稿
  6. 点击插入 |对象 | Microsoft Excel Worksheet(新建)如下图

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


备选

我们知道 Excel 让您创建 Excel 的多个实例。那么我们现在要做的是

  1. 创建 Excel
  2. 的新实例
  3. 添加新作品sheet
  4. 将空白工作簿保存在用户的临时目录中
  5. 在 PowerPoint 中添加该文件
  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

当你运行这段代码时,你会看到