更新&交叉发布自:http://www.ozgrid.com/forum/showthread.php?t=203827
我的目标是从PowerPoint中运行Excel宏。 [所有宏都会更改Excel中数据范围的行过滤,从而更改图表上描绘的线条]。
所以我的PPT宏应该(1)运行更改图表的Excel宏,然后(2)更新PPT中与Excel图表链接的图表。
这是我尝试过的:
Sub Test()
Excel.Application.Run "'" & "C:\myPath\" & "PPT Macro Test.xlsm'!Steps"
ActivePresentation.UpdateLinks
End Sub
它运行“Steps”宏,在Excel中更新图表,但不更新PPT图表。
所以我改编了这篇文章中的一项技巧:How to update excel embedded charts in powerpoint?(帽子提示brettdj)。
Sub Test()
Excel.Application.Run "'" & "C:\myPath\" & "PPT Macro Test.xlsm'!Steps"
ChangeChartData
End Sub
Sub ChangeChartData()
Dim pptChart As Chart
Dim pptChartData As ChartData
Dim pptWorkbook As Object
Dim sld As Slide
Dim shp As Shape
For Each sld In ActivePresentation.Slides
For Each shp In sld.Shapes
If shp.HasChart Then
Set pptChart = shp.Chart
Set pptChartData = pptChart.ChartData
pptChartData.Activate
Set pptWorkbook = pptChartData.Workbook
On Error Resume Next
'update first link
pptWorkbook.UpdateLink pptWorkbook.LinkSources(1)
On Error GoTo 0
pptWorkbook.Close True
End If
Next
Next
Set pptWorkbook = Nothing
Set pptChartData = Nothing
Set pptChart = Nothing
End Sub
现在它按预期工作,但它会在打开,保存和暂停时暂停关闭工作簿。这是一个相当大的文件,因此在演示期间这是一个不可接受的延迟。有没有办法在已经“幕后”打开的Excel工作簿中运行宏,而无需重新打开和关闭它?
提前致谢。
答案 0 :(得分:2)
在我的简短测试中,假设工作簿已经打开,那么数据应该基于Excel过程实时更新。您根本不需要从PowerPoint中调用split
程序。
ChangeChartData
这避免了Sub Test()
Excel.Application.Run "'" & "C:\myPath\" & "PPT Macro Test.xlsm'!Steps"
End Sub
方法针对非常大的Excel文件的(大概)资源密集型任务,当从PPT调用时,该文件是针对每个图表完成的,无论需要,这似乎是不必要的长运行时间的罪魁祸首。
根据如何从PowerPoint调用Save
过程可能会有一些例外情况,如果您另外注意,请添加更多详细信息(最低限度:PPT处于演示模式时如何运行该过程)
This answer is promising 但是,它有一些明显的警告(两个文件都必须打开,Excel文件应该是唯一打开的Excel文件等)。我没有测试其他方案,看它是否仍然有效。它似乎对我有用:
Test
在您的实施中,或许:
Set pres = Presentations("Chart.pptm") 'ActivePresentation, modify as needed.
' Make sure you reference correct shape name on the next line:
pres.Slides(1).Shapes("Chart1").LinkFormat.Update
关于For Each sld In ActivePresentation.Slides
For Each shp In sld.Shapes
If shp.HasChart Then
Set pptChart = shp.Chart
pptChart.LinkFormat.Update
End If
Next
Next
对象的Activate
方法,MSDN Notes that:
在引用此属性之前,必须调用Activate方法;否则会发生错误。
This is by design并且“不会被改变”,但我从未与任何理解为什么这被视为良好或可取的UI体验的人交谈......
几年前 This自我回答的问题表明你可以避免ChartData
要求,但我不认为这是准确的 - 我不能复制它而我不能找到任何其他表明可以做到这一点的来源。
答案 1 :(得分:0)
@David,谢谢你的帮助。这(大部分)有效:
Sub Test()
Excel.Application.Run "'" & "C:\myPath\" & "PPT Macro Test.xlsm'!Steps"
Slide1.Shapes(1).LinkFormat.Update
End Sub
清除。您的评论“它正在运行,然后它不是,现在它”迫使我进行一些故障排除。这是解决方法:
令人惊讶的是,它然后通过单击幻灯片视图中的按钮或通过VB资源管理器中的步进来运行。更令人惊讶的是,它运行时不会打开Excel - 它只能在后台运行。
如果我没有右键单击>>首先是“编辑数据”,它将始终打开Excel&提示只读/通知/取消。然后我无法从PPT运行宏,并且在Excel中运行它只在Excel中更新图表,而不是在PPT中。
或者我尝试了“Slide1.Shapes(1).LinkFormat.AutoUpdate = ppUpdateOptionAutomatic”来查看是否会将更新设置为自动...它没有。
如果有人可以修复解决方法,我会很感激。与此同时,感谢大卫无私的毅力,我会试着弄清楚如何给你答案。