VBA: Разрывные ссылки в PowerPoint работают, но не работают - PullRequest
0 голосов
/ 15 октября 2018

Я работаю над PowerPoint, включая диаграммы, которые ссылаются на данные в Excel.Я хотел бы удалить эту ссылку через макрос в VBA.Я использую следующий макрос, который выполняется без ошибок, но когда я просматриваю PowerPoint, я все равно могу перейти по ссылкам на мой файл Excel.Кто-нибудь может увидеть проблему?

Sub BreakAllLinks()

    Dim oSld As PowerPoint.Slide
    Dim oSh As PowerPoint.Shape
    Dim Yes As Integer
    Dim PowerPointApp As PowerPoint.Application

    Set PowerPointApp = GetObject(class:="PowerPoint.Application")

    '// Check if more then single powerpoint open
    If PowerPointApp.Presentations.Count > 1 Then
        MsgBox "Please close all other PowerPoints"
        Exit Sub
    End If


Yes = MsgBox("Are you sure you want to break all links in your active PowerPoint presentation?", vbYesNo + vbQuestion, "Break ALL links")

If Yes = vbYes Then
    For Each oSld In PowerPointApp.ActivePresentation.Slides
        For Each oSh In oSld.Shapes
            If oSh.Type = msoLinkedOLEObject Then   'SOLUTION EDIT: msoChart
                oSh.LinkFormat.BreakLink
            End If
        Next   ' Shape
    Next   ' Slide
End If


End Sub

Заранее спасибо.

1 Ответ

0 голосов
/ 16 октября 2018

Позвольте мне начать с того, что я не эксперт в OLE-связанных графиках.Кто-то может объяснить это намного лучше, чем я.Итак, отказ от ответственности сделан ... oSh.Type = msoLinkedOLEObject не правильно идентифицирует все связанные графики.Связанный график может быть, например, oSh.Type = msoChart.Я обнаружил, что лучший способ идентифицировать связанную диаграмму - это проверить наличие свойства Shape.LinkedFormat.AutoUpdate ... свойство AutoUpdate существует только для связанных диаграмм ... и не существует длясвязанные графики.Ссылка на него для несвязанной диаграммы приведет к ошибке во время выполнения.Однако, если мы собираемся использовать его существование, то проверьте, существует ли свойство в VBA (довольно неуклюжий процесс).Например:

Private Function IsLinked(myShape As Shape)
    Dim AutoUpdate As Variant
    On Error GoTo Err_Handler
    IsLinked = False
    AutoUpdate = myShape.LinkFormat.AutoUpdate
    IsLinked = True
Err_Handler:

End Function

Таким образом, вы можете проверить, связан ли oSh, используя вышеуказанную функцию.Следующая проблема заключается в том, что BreakLink не (всегда) работает.Лучший способ - просто установить автоматическое обновление на ручное обновление ... например:

oSh.LinkFormat.AutoUpdate = ppUpdateOptionManual

В качестве альтернативы, вы всегда можете скопировать диаграммы без ссылок.

...