运行Excel宏以更新Powerpoint链接图表(工作簿已打开)

时间:2017-04-24 16:04:25

标签: excel-vba powerpoint-vba vba excel

更新&交叉发布自: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工作簿中运行宏,而无需重新打开和关闭它?

提前致谢。

2 个答案:

答案 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

清除。您的评论“它正在运行,然后它不是,现在它”迫使我进行一些故障排除。这是解决方法:

  • 打开PPT文件,点击更新链接
  • 立即右键单击嵌入/链接图表,选择“编辑数据”
  • 这将打开Excel文件(非只读)
  • 关闭Excel,不保存文件

令人惊讶的是,它然后通过单击幻灯片视图中的按钮或通过VB资源管理器中的步进来运行。更令人惊讶的是,它运行时不会打开Excel - 它只能在后台运行。

如果我没有右键单击>>首先是“编辑数据”,它将始终打开Excel&提示只读/通知/取消。然后我无法从PPT运行宏,并且在Excel中运行它只在Excel中更新图表,而不是在PPT中。

或者我尝试了“Slide1.Shapes(1).LinkFormat.AutoUpdate = ppUpdateOptionAutomatic”来查看是否会将更新设置为自动...它没有。

如果有人可以修复解决方法,我会很感激。与此同时,感谢大卫无私的毅力,我会试着弄清楚如何给你答案。

相关问题