通过PowerPoint自动化Excel - 本地窗口不暴露完整的对象模型(即Linksources)

时间:2016-06-02 03:04:40

标签: excel excel-vba powerpoint powerpoint-vba vba

背景

我正在运行代码(来自PowerPoint):

  • 循环播放演示文稿中的每张幻灯片。
  • 检查每个形状以确定它是否为图表。
  • 如果是图表,请激活基础Excel工作表,然后将此基础文件中的链接更改为新源。

我注意到excel的链接在整个PPT级别[通过Info]不存在,它们被故意链接到每个图表,以便可以在不访问源excel的情况下编辑演示文稿文件

代码适用 - 广泛。

有一个持续的错误(代码现在正常运行),我认为这与网络和内存稳定性有关(在大约15个图表之后失败),我希望按照{{关闭screenupdating 3}}

问题

我访问的所有图表都链接到其他工作簿。然而,当Excel工作簿暴露给PowerPoint时, Linksources 不会显示在Locals窗口中,即使代码处理每个链接(下图显示链接存在)

我翻转了自动化以从Excel访问PowerPoint包,结果相同。没有 Linksources

为什么在使用Excel自动化PowerPoint时, Locals 窗口中的完整对象模型也不可用?

这是一个我偶然发现的局部故障,还是一个更广泛的问题?

下图显示了迭代链接的代码(ppl变量,但xlWB变量没有 Linksources )。

Turn off screenupdating for Powerpoint

Sub FastUpdate()

    Dim sld As Slide
    Dim shp As Shape
    Dim pptchrt As Chart
    Dim pptChrtData As ChartData

    Dim xlWB As Excel.Workbook
    Dim lngStart As Long
    Dim strNew As String
    Dim strMsg As String

    Dim ppl As Variant

    On Error GoTo cleanup
    'set start position manually 
    'lngStart = 34
    If lngStart = 0 Then lngStart = 1

    'call custom function for user to pick file
    'strNew = Getfile
     strNew = "S:\Corporate Model\05 RSM submissions\05 May 2016\02 Checked RSMs\VFAT\Australia\Australia - Valuation and Financial Analysis template.xlsx"


        For Each sld In ActivePresentation.Slides
            If sld.SlideIndex >= lngStart Then
                For Each shp In sld.Shapes
                    If shp.HasChart Then
                    Set pptchart = shp.Chart
                    Set pptChrtData = pptchart.ChartData
                    'open underlying excel file - doesn't just activate chart
                    pptChrtData.Activate
                    '
                    Set xlWB = pptChrtData.Workbook

                    'loop through all links
                    For Each ppl In xlWB.LinkSources
                        strMsg = strMsg & SlideNumber & " " & pptchart.Name & vbNewLine
                        xlWB.ChangeLink ppl, strNew
                    Next

                    xlWB.Close True
                    Set xlWB = Nothing
                    End If
                Next shp
            End If
        Next sld

cleanup:
Set xlWB = Nothing
If Err.Number <> 0 Then MsgBox Err.Description, vbCritical
If Len(strMsg) > 0 Then MsgBox strMsg, vbOKOnly, "Completed"
End Sub

1 个答案:

答案 0 :(得分:3)

Locals和Watch窗口显示对象的属性。可以找到Workbook对象的属性列表here

LinkSources是一个带有可选Type参数的方法。

如果要调试LinkSources,可以将其添加到Watch窗口: enter image description here

或将返回值保存到本地变量变量以在“局部”窗口中查看它。