首先,打开一个新的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上,有谁知道为什么会发生这种情况?
答案 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处于编辑模式时,它会完全冻结”
要了解这一点并真正了解正在发生的事情,请执行以下操作。
您会注意到,现在您将获得更多“易于理解的错误”
<强>替代强>
我们知道Excel允许您创建多个Excel实例。所以我们现在要做的是
<强>赞成强>
您将能够添加形状
<强>缺点强>
在您处于编辑模式之前,您将无法使用它。我仍然试图通过双击来弄清楚如何在单独的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
运行此代码时,您将看到