2016-07-29 132 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副本,然后重试。

其余部分将根据用户...