Dav*_*ers 5 excel powerpoint vba ole powerpoint-vba
如果您运行以下代码,您将获得非常有趣的结果(仅运行PowerPoint,在运行之前关闭所有Excel实例):
'Optional - Include the "Microsoft Excel 16.0 Object Library"
Option Explicit
Public Sub test()
Dim oslide As slide
Set oslide = ActivePresentation.Slides.add(1, ppLayoutBlank)
Dim oshape As Shape
Set oshape = oslide.Shapes.AddOLEObject(30, 30, 50, 50, "Excel.Sheet")
oshape.OLEFormat.Object.Sheets(1).ListObjects.add(1) 'xlSrcRange
oshape.OLEFormat.Object.Sheets(1).Cells(1, 1) = "fewewq"
oshape.OLEFormat.Object.Close
End Sub
Run Code Online (Sandbox Code Playgroud)
成功创建嵌入对象,并且表与指定数据一起出现.但是,当您单击嵌入的对象时,您会收到以下错误:
没有足够的可用内存来读取工作表.
无法再以任何其他方式访问此对象,并且在关闭/打开文档并重新启动时,对象的损坏性质仍然存在.我已经验证了这个问题发生在我测试过的所有系统上(PowerPoint/Excel 2016,Windows 7 X64).
所以我的问题是,其他人是否可以重现这一点,如果是这样,为什么会发生这种情况呢?如果将"单元格(1,1)"行更改为"单元格(2,1)"没有问题,就好像编辑表格的头部会导致某些特殊行为与编辑行或其他细胞.
实际上还没有写到这一点,大部分内容与此特定问题无关.
这篇文章声称这是一个安装太多字体(> 600)的问题.我测试了这个,我只安装了241个......
还有一些职位完全无关,又不配发去那里.
我在MS Word中测试了相同的代码,似乎工作正常,问题似乎与PowerPoint隔离
我已经尝试在代码(破碎的对象)中执行一个版本,而另一个手动(工作对象),保存它们并比较二进制输出(仅嵌入对象).这听起来很酷,但它并没有给我任何更深刻的见解.我无法单独使用Excel打开嵌入对象,因为对象似乎以专有格式存储.二进制的中心区域看起来不同,但我不确定如何或为什么.到目前为止,我还没有发现将其解码为人类可读信息的方法.
经过一段显着的延迟和适当的归属后,我已将此问题交叉发布到Microsoft论坛.也许有人对那里有一些见解.我会积极维护这两个职位.如果我100%确信这是一个错误,我甚至可以考虑在这里开一个问题.
您可以通过不关闭OLEObject来完全避免此问题,这会导致2010年出现问题,尤其是当与关联的图表行为结合使用时,您会看到显示的孤立的Excel窗口.不是一个好的用户体验.我想我可以在后台打开一个隐藏的Excel窗口,然后在我完成嵌入式工作时终止...
我正在运行版本:Microsoft Office 365 ProPlus:版本1705(Build 8201.3103即点即用),但我也看到了Microsoft Office Standard 2010版本14.0.7015.1000(32位)上的问题.这个表的问题似乎在每个其他版本的办公室都是一样的,但我想知道这是否会影响2010年以前的办公室版本?
我用图表尝试了同样的事情:
'Include the "Microsoft Excel 16.0 Object Library"
Option Explicit
Sub test()
Dim sld As slide
Dim shp As Shape
Dim pptWorkbook As Workbook
Set sld = ActivePresentation.Slides.Add(1, ppLayoutBlank)
Set shp = sld.Shapes.AddChart
Set pptWorkbook = shp.Chart.ChartData.Workbook
pptWorkbook.Close SaveChanges:=True
Set pptWorkbook = shp.Chart.ChartData.Workbook
pptWorkbook.Sheets(1).Cells(1, 2) = "fewewq"
Application.ActivePresentation.Save
pptWorkbook.Close SaveChanges:=True
End Sub
Run Code Online (Sandbox Code Playgroud)
如果更改标题行值,则无法再访问嵌入对象("Cells(1,2)"),如果更改其他值("Cells(2,1)"),则运行正常.我认为这是同样的问题,我无法在运行此代码后打开图表数据.如果我尝试以编程方式访问它,我会收到以下错误:
运行时错误'-2147467259(80004005)':
对象'ChartData'的方法'Workbook'失败
虽然2016年只是一个问题,但我在2010年尝试了一些略有不同的事情并没有看到任何问题.
我终于弄清楚为什么我无法在另一个系统上重现这个问题.仅在进行更改后关闭所有excel实例时才会出现此问题.这意味着如果您在运行此代码时打开了一个单独的(不相关的)Excel窗口,您将看不到该问题.
只有在PowerPoint单独运行时才能重现此问题,而不打开任何其他Excel电子表格.
我可以在 Windows10-64/Excel2013-64 上一致地重现您的问题。这是一个错误,我们只能尝试检查到底出了什么问题。
当通过VBA更改表头时,ListColumn顽固地拒绝更新其名称。无论您更改标题单元格还是显式更改 ListColumn 的名称,都会发生这种情况!仅当您编辑工作簿并手动更改单元格时,它才会更新,但不会从 VBA 更新:
Public Sub Test()
Dim oslide As Slide
Set oslide = ActivePresentation.Slides.Add(1, ppLayoutBlank)
Dim oshape As Shape
Set oshape = oslide.Shapes.AddOLEObject(30, 30, 250, 250, "Excel.Sheet")
With oshape.OLEFormat.Object
.Sheets(1).ListObjects.Add 1, .Sheets(1).Range("B2:D5") ' <-- put it anywhere
.Sheets(1).ListObjects(1).ListColumns(1).Name = "fewewq" ' <-- whether like this
'.Sheets(1).Range("B2").Value = "fewewq" ' <-- or like this
Debug.Print .Sheets(1).ListObjects(1).ListColumns(1).Range.Cells(1).Value 'fewewq
Debug.Print .Sheets(1).ListObjects(1).ListColumns(1).Name
''''''''''''''' Still prints Column1 ! ''''''''''''''''''
.Close
End With
End Sub
Run Code Online (Sandbox Code Playgroud)
结果很明显:表被损坏,因为它内部保存了在标题中找不到的ListObject列名(即)(标题是)。这导致了观察到的错误,不幸的是,显示的错误消息并不总是准确的。Column1fewewq
当 Excel 实例已在运行时,行为会发生变化并且ListColumn名称也会更新。似乎在编辑表头时更新表内部数据的“组件”在 PowerPoint VBA 内编辑时“未加载”。仅当以下任一情况时:
您可以在 PPT 中手动编辑工作簿
您有一个正在运行的 Excel 实例
共同的因素是加载了一些编辑器组件,并且该编辑器是在编辑标题时更新内部表数据的编辑器。
您在答案中发现的良好解决方法是在操作之前打开 xlApp,然后在操作之后关闭它,这与这些观察结果一致。
重要的是,对象发生的“其他”问题Chart(在Update 1中)确实与您正确假设的问题相同(“我认为这是同一个问题”)。创建的图表链接到ListObject工作表中的表格,并且该表格的标题位于第一行。因此,当您更改标题中的单元格时,单元格的名称ListColumn不会更新,从而导致相同的损坏问题。
更新:另一种轻量级解决方法
在评论提出与打开先前 Excel 应用程序的解决方法相关的担忧后,我试图找到一种“更轻松”的解决方法,并找到了一个。
我确信问题是由于未能更新ListColumn表中的 s 名称所致,因此找到了一种“强制”更新其名称的方法。解决方法包括两个步骤:
将表的范围向右扩展一列,然后立即将其缩小回原始范围。
此操作只是强制表重新计算其列名,仅此而已!现在表的列名是正确的,问题消失了。
Public Sub Workaround()
Dim oslide As Slide: Set oslide = ActivePresentation.Slides.Add(1, ppLayoutBlank)
Dim oshape As Shape: Set oshape = oslide.Shapes.AddOLEObject(30, 30, 250, 250, "Excel.Sheet")
With oshape.OLEFormat.Object.Sheets(1)
.ListObjects.Add 1 ' xlRange
.Range("A1").Value = "fewewq"
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Expand the table one column to the right than shrink it back
'
With .ListObjects(1)
.Resize .Range.Resize(, .Range.Columns.Count + 1)
.Resize .Range.Resize(, .Range.Columns.Count - 1)
End With
'
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
End With
With oshape.OLEFormat.Object
Debug.Print .Sheets(1).ListObjects(1).ListColumns(1).Range.Cells(1).Value ' fewewq
Debug.Print .Sheets(1).ListObjects(1).ListColumns(1).Name ' Now prints fewewq !
.Close
End With
End Sub
Run Code Online (Sandbox Code Playgroud)
执行此操作后,您可以验证嵌入的工作表是否可编辑,并且您可以关闭然后打开演示文稿,不会发现任何问题。我希望这有帮助 :)