Powerpoint VBA更新由其他人打开的excel文件上的链接,没有警报

时间:2014-10-31 13:14:04

标签: vba powerpoint powerpoint-vba

我有一个powerpoint演示文稿,链接到多个大型excel spreasheets。我想更新链接,以便更新我的演示文稿。但是,如果点击Update All Link,我的powerpoint崩溃,可能是因为链接的excel文件很大。所以我必须手动更新每个链接,这样它就不会崩溃。

下面这个宏将循环每个链接对象并更新其链接,但是,如果文件当前打开,如果我想取消,打开只读或通知,它将弹出警报。设置为false的显示警报不会对其起任何作用。

Sub linkupdate()
    Application.DisplayAlerts = False 
    Dim osld As Slide
    Dim oshp As Shape
    For Each osld In ActivePresentation.Slides
        osld.Select
        For Each oshp In osld.Shapes
            If oshp.Type = msoLinkedOLEObject Then
                oshp.Select
                oshp.LinkFormat.Update
            End If
        Next oshp
    Next osld
    Application.DisplayAlerts = True
End Sub

我发现powerpoint在它下面打开一个看不见的excel应用程序来更新链接,但是我无法用我的vba获取这个打开的实例并告诉它只读取链接。

我希望如果该文件被其他人打开,则不会发生这种情况,但是我希望它以只读方式自动打开文件进行更新。

1 个答案:

答案 0 :(得分:2)

查看您的代码,我假设所有这些操作都是在PowerPoint VBA编辑器中完成的。话虽如此,让我解释一下为什么您要从Excel应用程序中获取弹出窗口。当您编写此行代码时:

Application.DisplayAlerts = False 

您指的是PowerPoint应用程序,您的意思是指Excel应用程序,因为我假设弹出窗口正在发生。我们需要创建对Excel应用程序的引用。如果我添加以下代码我们可以关闭Excel应用程序的显示

'Declare Excel Variables
Dim xlApp As Excel.Application
Dim xlWorkBook As Excel.Workbook

'Create a new Excel Application, make it invisible, set the Excel Display alerts to False.
Set xlApp = New Excel.Application
    xlApp.Visible = False
    xlApp.DisplayAlerts = False

因此,既然我们已经处理了弹出窗口,我们就解决您的链接问题。要解决链接问题,我们将打开链接在后台引用的Excel工作簿。这样更新链接的速度更快。 如果我们不打开工作簿,则有一个实例,其中更新链接过程很容易花费5分钟以上。

但是,例如,如果对象是链接图表,则获取正确的文件名可能会有些困难。 我们需要解析文件,以便它删除工作表名称和图表名称。我们的操作方法如下:

'Get the Source File of the shape.
 SourceFile = PPTShape.LinkFormat.SourceFullName

'We may need to parse the Source file because if it's linked to a chart, for example, we can get the following:
'C:\Users\NAME\ExcelBook.xlsx!Chart_One!
'We want it to look like the following:
'C:\Users\NAME\ExcelBook.xlsx

'This will parse the source file so that it only includes the file name.
Position = InStr(1, SourceFile, "!", vbTextCompare)
FileName = Left(SourceFile, Position - 1)

接下来,我们要打开工作簿,更新链接,然后关闭工作簿。因此,我们将添加以下代码段:

'This will open the file as read-only, and will not update the links in the Excel file.
Set xlWorkBook = xlApp.Workbooks.Open(FileName, False, True)

    'Update the link
    PPTShape.LinkFormat.Update

'Close the workbook and release it from memory.
xlWorkBook.Close
Set xlWorkBook = Nothing

总的来说,这是代码的外观,以便更新所有不同的链接OLEObject的链接。

Sub UpdateLink()

    'Declare PowerPoint Variables
    Dim PPTSlide As Slide
    Dim PPTShape As Shape

    'Declare Excel Variables
    Dim xlApp As Excel.Application
    Dim xlWorkBook As Excel.Workbook

    'Create a new Excel Application, make it invisible, set the Excel Display alerts to False.
    Set xlApp = New Excel.Application
        xlApp.Visible = False
        xlApp.DisplayAlerts = False

    'Loop through each slide in the Presentation.
    For Each PPTSlide In ActivePresentation.Slides

        'Loop through Each Shape in the slide
        For Each PPTShape In PPTSlide.Shapes

            'If the Shape is a linked OLEObject.
            If PPTShape.Type = msoLinkedOLEObject Then

                'Get the Source File of the shape.
                SourceFile = PPTShape.LinkFormat.SourceFullName

                'We may need to parse the Source file because if it's linked to a chart, for example, we can get the following:
                'C:\Users\NAME\ExcelBook.xlsx!Chart_One!
                'We want it to look like the following:
                'C:\Users\NAME\ExcelBook.xlsx

                'This will parse the source file so that it only includes the file name.
                Position = InStr(1, SourceFile, "!", vbTextCompare)
                FileName = Left(SourceFile, Position - 1)

                'This will open the file as read-only, and will not update the links in the Excel file.
                Set xlWorkBook = xlApp.Workbooks.Open(FileName, False, True)

                    'Update the link
                    PPTShape.LinkFormat.Update

                'Close the workbook and release it from memory.
                xlWorkBook.Close
                Set xlWorkBook = Nothing

            End If

        Next PPTShape
    Next PPTSlide

    'Close the Excel App & release it from memory
    xlApp.Quit
    Set xlApp = Nothing

End Sub

在将对象粘贴到PowerPoint幻灯片中时也要小心,如果使用VBA来实现此目的,有时它可能会错误地粘贴链接信息!当您去更新链接时,什么都不会改变,因为链接不正确并且实际上没有引用您要更新的项目。