我有一个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获取这个打开的实例并告诉它只读取链接。
我希望如果该文件被其他人打开,则不会发生这种情况,但是我希望它以只读方式自动打开文件进行更新。
答案 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来实现此目的,有时它可能会错误地粘贴链接信息!当您去更新链接时,什么都不会改变,因为链接不正确并且实际上没有引用您要更新的项目。