1

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

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

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

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

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

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

4

2 回答 2

1

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

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

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

  • 这种行为是设计使然,而不是错误(@SiddharthRout),无法从 PowerPoint 更改 Excel 的编辑模式,如果用户在编辑模式下打开了 excel 窗口,则无法运行“AddOLEObject”命令微软幻灯片软件。

解决方案

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

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

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

于 2016-07-29T19:10:04.140 回答
1

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

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

在使用它超过 18 年之后,我可以识别其中的大多数,但时不时地,当我遇到一个新的错误消息时,我实际上必须在谷歌上搜索该错误的含义!!!

无论如何...

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

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

  1. 打开 Excel
  2. 添加新工作表
  3. 转到任何工作表,然后在单元格A1F2中按或双击。即把单元格置于编辑模式
  4. 打开简报
  5. 添加新演示文稿
  6. 点击插入 | 对象 | Microsoft Excel 工作表(新建)如下图所示

在此处输入图像描述

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

在此处输入图像描述


选择

我们知道 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

当您运行此代码时,您将看到以下内容

在此处输入图像描述

于 2016-07-30T04:56:55.810 回答