单元格处于单独的Excel窗口中编辑模式时无法添加OLEObject在PowerPoint中
首先,打开一个新的PowerPoint和Excel文档,然后单击Excel文档中的第一个(或任意)单元格,直到文本光标可见,切换回PowerPoint并运行以下VBA代码(假设您至less有一个空白幻灯片已经存在):
ActivePresentation.slides(1).Shapes.AddOLEObject 30, 30, 100, 100, "Excel.Sheet"
我收到以下错误(在多个系统上):
-2147467259对象“形状”的方法“AddOLEObject”失败
如果closures单独的Excel窗口,命令工作正常,如果您select不同的单元格而不显示文本光标,则该命令也可以正常工作。 关于在单独的Excel窗口中编辑单元格的事实似乎导致“AddOLEObject”方法失败。
这是我见过的最奇怪的VBA bug之一,我在三台独立的机器上validation了这种行为,在Office版本2013和2010上,有人知道为什么会出现这种情况?
不幸的是,大多数的MS Office VB错误消息都是错的!
为什么要低调? 因为他们很难被普通用户所理解。 当您单击错误消息中的“ 帮助 ”button时,会将您带到一些不相关的链接/页面在线或Excel帮助中。 我一直在考虑在Microsoft应用“ 错误消息编写器 ”:D
经过18年以上的工作,我可以认识到他们中的大多数人,但偶尔偶尔遇到一个新的错误信息,我实际上必须searchGoogle来找出那个错误的含义!
无论如何…
就像我说的,“ 当Excel处于编辑模式时,它会完全冻结 ”
而要看到这个行动,并真正了解发生了什么事情,请执行以下操作。
- 打开Excel
- 添加一个新的工作表
- 转到任何工作表并按F2或双击单元格A1 。 即把单元格设置为编辑模式
- 打开Powerpoint
- 添加新的演示文稿
- 点击INSERT | OBJECT | Microsoft Excel工作表(新build),如下图所示
你会注意到,你现在会得到一个“ 易于理解的错误 ”
替代
我们知道Excel让你创buildExcel的多个实例。 所以我们现在要做的是
- 创build一个新的Excel实例
- 添加一个新的工作表
- 将空白工作簿保存在用户的临时目录中
- 在PowerPoint中添加该文件
- 删除该文件
优点
您将能够添加形状
缺点
您将无法使用它,直到您处于编辑模式。 我仍然试图找出如何通过双击在单独的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
当你运行这个代码时,这是你将会看到的
总结所有意见并为将来的任何人提供一张路线图,下面是相关的事实,以及我在申请中为避免这个问题所作的决定:
-
在编辑模式下,不能发送VBA命令给Excel,这会导致它冻结,或者如果通过外部应用程序(例如powerpoint)完成,它将输出前面提到的错误信息(@ SiddharthRout)
-
“在COM中,应用程序是一个处理来自COM客户端请求的COM服务器,由于该模式是在应用程序级而不是文档级进行处理的,因此会阻塞所有文档。 这意味着这里发布的解决scheme将无法工作。(@Comintern)
-
这种行为是由devise,而不是一个错误(@SiddharthRout),没有办法改变Excel的编辑模式从PowerPoint,如果用户有一个Excel窗口打开在编辑模式下是不可能运行“AddOLEObject”命令从幻灯片。
解
我所做的是在我的error handling程序中创build一个特例来输出消息:
无法连接到Excel(错误-2147467259),请确保已安装Excel并且未处于“编辑模式”。 请closures任何打开的Excel副本,然后重试。
其余的将取决于用户…