无法通过VBA更新PowerPoint中的Excel链接的图表

我知道我可以轻松地通过文件 – >链接 – >自动更新。 但是,由于某种原因,这会导致其他人的电脑崩溃。 我想这可能是一个兼容性问题,因为我在2016年powerpoint。我有大约30多个图表,我想通过macros更新。 无论如何,我尝试使用以下的VBA,但我只是最终从Excel中popup说: Microsoft Excel正在等待另一个应用程序来完成一个OLE操作 。 这popup刚刚持续popup15分钟。

帮助将不胜感激,因为我不是很有经验的macros。

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 

有一件事我会感兴趣的是,改变这一点:

 On Error Resume Next 'update first link pptWorkbook.UpdateLink pptWorkbook.LinkSources(1) On Error GoTo 0 

对此。 (我曾经询问过,如果你删除On Error Resume Next并且你从来没有回答过,会发生什么情况, 一般来说 ,除非你完全确定你知道你在做什么,并且正在充分处理潜在的错误,在这种情况下你可能不是,但我不知道是否有错误)。

 'On Error Resume Next 'update first link pptWorkbook.UpdateLink pptWorkbook.LinkSources(1) 'On Error GoTo 0 

如果发生错误,请告知具体的错误信息。

如果这不会引起错误,但会导致相同的问题,请尝试以下操作:

 'On Error Resume Next 'update first link pptWorkbook.UpdateLink pptWorkbook.LinkSources(1) 'On Error GoTo 0 Exit For '### Get out of the loop 

如果像你说的那样,所有的图表都链接到相同的数据,那么我认为Exit For是安全的,以避免多余的调用没有做任何事情。 仍然有问题,请尝试:

 'On Error Resume Next 'update first link pptWorkbook.RefreshAll 'On Error GoTo 0 Exit For '### Get out of the loop 

最后,我怀疑这可能实际上工作,试试这个。 你已经说过没有公式引用或外部链接(数据库,文本,网页查询等),所以看起来没有必要做一个RefreshAll甚至UpdateLink似乎毫无意义。 简单地激活chartdata工作表,然后立即closures它似乎应该更新PPTembedded式Excel表和图表中的数据。 至less在我testing非彭博文件的时候呢。

 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 Exit For 

注意:你想要Exit For因为刷新同一个文件30次没有意义。

对我来说这个工作:

 For Each sld In ActivePresentation.Slides For Each shp In sld.Shapes If shp.HasChart Then shp.Chart.ChartData.Activate shp.Chart.ChartData.Workbook.UpdateLink shp.Chart.ChartData.Workbook.LinkSources(1) shp.Chart.ChartData.Workbook.Close True End If Next Next 

即不用刚创build的variables创build新的variables。