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

Run an Excel Macro to Update a Powerpoint Linked Chart (Workbook Already Open)

更新并交叉post来自:http://www.ozgrid.com/forum/showthread.php?t=203827

我的 objective 是从 PowerPoint 中 运行 一个 Excel 宏。 [宏所做的只是更改 Excel 中数据范围的行过滤,从而更改图表上描绘的线条]。

所以我的 PPT 宏应该 (1) 运行 更改图表的 Excel 宏,然后 (2) 更新链接到 Excel 的 PPT 中的图表图表.

这是我试过的方法:

Sub Test()
    Excel.Application.Run "'" & "C:\myPath\" & "PPT Macro Test.xlsm'!Steps"
    ActivePresentation.UpdateLinks
End Sub

它运行是“步骤”宏,更新Excel中的图表,但不更新PPT图表。

所以我从这个 post 中采用了一种技术: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 工作簿中的宏,而无需重新打开和关闭它?

提前致谢。

在我的简短测试中,假设工作簿已经打开,那么数据应该根据Excel过程实时更新。您根本不需要从 PowerPoint 调用 ChangeChartData 过程。

Sub Test()
    Excel.Application.Run "'" & "C:\myPath\" & "PPT Macro Test.xlsm'!Steps"
End Sub

这避免了 Save 方法针对非常大的 Excel 文件的(大概)资源密集型任务,当从 PPT 调用时,它是针对 每个 图表,不管需要,这似乎很可能是 运行 时间过长的罪魁祸首。

根据从 PowerPoint 调用 Test 程序的方式,可能存在一些例外情况,如果您观察到其他情况,请添加更多详细信息(至少:程序是如何 运行 同时PPT 处于演示模式)

不过,它有一些明显的注意事项(两个文件都必须打开,Excel 文件应该是唯一的 Excel文件打开等)。我还没有测试其他场景,看它是否仍然有效。它似乎对我有用:

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

关于ChartData对象的Activate方法,MSDN Notes that

You must call the Activate method before referencing this property; otherwise, an error occurs.

This is by design 和 "wont' be changed",但我从未与理解为什么这被认为是良好或令人向往的 UI 体验的任何人交谈过...

This 几年前的自我回答问题表明您可以避免 Activate 要求,但我认为这不准确——我无法复制它但我可以'找到任何其他表明可以做到这一点的来源。

@David,感谢您的帮助。这(大部分)有效:

Sub Test()
    Excel.Application.Run "'" & "C:\myPath\" & "PPT Macro Test.xlsm'!Steps"
    Slide1.Shapes(1).LinkFormat.Update
End Sub

主要是。您的评论 "it was working, then it wasn't, now it is" 迫使我进行一些故障排除。解决方法如下:

  • 打开PPT文件,点击更新链接
  • 立即右击embedded/linked图表,select"Edit Data"
  • 这将打开 Excel 文件(非只读)
  • 关闭 Excel,不保存文件

令人惊讶的是,它随后 运行 通过单击幻灯片视图中的按钮或在 VB 资源管理器中单步执行。更神奇的是,当它 运行 时它不会打开 Excel-- 它只是在后台工作。

如果我不先右键单击 >> "Edit Data",它将始终打开 Excel 并提示输入 Read-Only/Notify/Cancel。然后我无法运行 PPT 中的宏,运行在Excel 中更新它仅在Excel 中更新图表,而不是在PPT 中。

或者,我尝试 "Slide1.Shapes(1).LinkFormat.AutoUpdate = ppUpdateOptionAutomatic" 看看是否可以将更新设置为自动...它没有。

如果有人可以解决这个问题,我将不胜感激。与此同时,感谢 David 的无私坚持,我会想办法给你的答案加分。