当单元格处于单独编辑模式时无法在 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 处于编辑模式时,它会完全冻结”
要查看实际效果并真正了解正在发生的事情,请执行以下操作。
- 打开Excel
- 添加新作品sheet
- 转到任何 sheet 并按 F2 或双击单元格 A1。即将单元格置于编辑模式
- 打开 Powerpoint
- 添加新演示文稿
- 点击插入 |对象 | Microsoft Excel Worksheet(新建)如下图
你会注意到你现在会得到一个更“易于理解的错误”
备选
我们知道 Excel 让您创建 Excel 的多个实例。那么我们现在要做的是
- 创建 Excel
的新实例
- 添加新作品sheet
- 将空白工作簿保存在用户的临时目录中
- 在 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
当你运行这段代码时,你会看到
首先,打开一个新的 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 处于编辑模式时,它会完全冻结”
要查看实际效果并真正了解正在发生的事情,请执行以下操作。
- 打开Excel
- 添加新作品sheet
- 转到任何 sheet 并按 F2 或双击单元格 A1。即将单元格置于编辑模式
- 打开 Powerpoint
- 添加新演示文稿
- 点击插入 |对象 | Microsoft Excel Worksheet(新建)如下图
你会注意到你现在会得到一个更“易于理解的错误”
备选
我们知道 Excel 让您创建 Excel 的多个实例。那么我们现在要做的是
- 创建 Excel 的新实例
- 添加新作品sheet
- 将空白工作簿保存在用户的临时目录中
- 在 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
当你运行这段代码时,你会看到