如何禁止更新链接警告?
如何禁止更新链接警告?
我正在尝试编写一个脚本来打开许多Excel文件。我一直收到如下提示:
This workbook contains links to other data sources.
我想使这条消息不再出现,这样我的脚本可以自动运行,而不必为每个工作簿点击Don\'t Update
。目前我正在使用以下代码:
function getWorkbook(bkPath as string) as workbook Application.EnableEvents=False Application.DisplayAlerts=False getWorkbook=Workbooks.Open(bkPath,updatelinks:=0,readonly:=false) end function
但是,消息仍在出现。我该怎么解决?
编辑:似乎这条消息出现在具有损坏链接的工作簿中。我没有看到This workbook contains one or more links that cannot be updated
消息,因为我将DisplayAlerts
设置为false。这些工作簿链接到我们Windows服务器上的一个文件夹中的等效文件,因此当该文件夹中的匹配文件被删除(这是我们业务流程的一部分)时,链接将中断。当链接中断时,是否可能抑制警告?
此外,我正在使用Excel 2010。
打开Excel的VBA编辑器,然后在即时窗口中键入以下内容(见屏幕截图)
Application.AskToUpdateLinks = False
关闭Excel,然后打开您的文件。它将不再提示您。记得在关闭工作簿时重置它,否则它也无法适用于其他工作簿。
屏幕截图:
编辑
因此,将其应用于您的代码,您的代码将如下所示:
Function getWorkbook(bkPath As String) As Workbook Application.AskToUpdateLinks = False Set getWorkbook = Workbooks.Open(bkPath, False) Application.AskToUpdateLinks = True End Function
跟进
Sigil,下面的代码也适用于具有损坏链接的文件。以下是我的测试代码。
测试条件
- 创建2个新文件。将它们命名为
Sample1.xlsx
和Sample2.xlsx
,并将它们保存在C:\
上 - 在
Sample1.xlsx
的单元格A1
中,键入以下公式='C:\[Sample2.xlsx]Sheet1'!$A$1
- 保存并关闭两个文件
- 删除Sample2.xlsx!!!
- 打开一个新工作簿,然后将该代码粘贴到其模块中,运行
Sample
。您将注意到您将不会收到提示。
代码
Option Explicit Sub Sample() getWorkbook "c:\Sample1.xlsx" End Sub Function getWorkbook(bkPath As String) As Workbook Application.AskToUpdateLinks = False Set getWorkbook = Workbooks.Open(bkPath, False) Application.AskToUpdateLinks = True End Function
更新:
在总结和讨论了所有细节之后,我花了2个小时检查了选项,这个更新是为了展示每一个i。
准备工作
首先,我在由VMWare提供支持的Clean Win7 SP1 Ultimate x64虚拟机上完成了Office 2010 x86的干净安装(这是我日常测试任务的常规程序,因此我已经部署了许多虚拟机)。
然后,我仅更改了以下Excel选项(即,所有其他选项在安装后均保持不变):
高级 > 常规 > 询问是否更新自动链接
已勾选:
信任中心 > 信任中心设置... > 外部内容 > 启用全部...
(尽管与数据连接相关的选项可能并不重要):
前提条件
我按照@Siddharth Rout
在他更新的回答中的建议(为方便共享)准备了一本工作簿,并将其放置在C:\
上:https://www.dropbox.com/s/mv88vyc27eljqaq/Book1withLinkToBook2.xlsx。然后,删除了链接的工作簿,因此共享的工作簿中的链接不可用(确保这一点)。
手动打开
在打开上述共享文件时(具有上述列出的Excel选项),会显示两个警告消息,顺序如下:
警告 #1
单击 更新
后,我预期会得到另一条警告:
警告 #2
因此,我认为我的测试环境现在与 OP
的情况非常相似)到目前为止一切顺利,我们终于进入了
VBA打开
现在我会逐步尝试所有可能的选项以使情况更加清晰。为简单起见,我只分享相关代码的行(完整的样本文件和代码将在最后共享)。
1. 简单的 Application.Workbooks.Open
Application.Workbooks.Open Filename:="C:\Book1withLinkToBook2.xlsx"
毫不意外-这会产生两个警告,与手动打开时一样。
2. Application.DisplayAlerts = False
Application.DisplayAlerts = False Application.Workbooks.Open Filename:="C:\Book1withLinkToBook2.xlsx" Application.DisplayAlerts = True
这段代码最终会得到 警告#1,无论是单击更新
还是不更新
,都不会产生进一步的警告,即Application.DisplayAlerts = False
抑制了警告#2。
3. Application.AskToUpdateLinks = False
Application.AskToUpdateLinks = False Application.Workbooks.Open Filename:="C:\Book1withLinkToBook2.xlsx" Application.AskToUpdateLinks = True
与DisplayAlerts
相反,此代码最终仅得到 警告#2,即Application.AskToUpdateLinks = False
抑制了 警告#1。
4. 双重假
Application.AskToUpdateLinks = False Application.DisplayAlerts = False Application.Workbooks.Open Filename:="C:\Book1withLinkToBook2.xlsx" Application.DisplayAlerts = True Application.AskToUpdateLinks = True
显然,此代码最终会抑制 两个警告。
5. UpdateLinks:=False
Application.Workbooks.Open Filename:="C:\Book1withLinkToBook2.xlsx", UpdateLinks:=False
最后,这个一行代码的解决方法(最初由@brettdj
提出)与Double False的方式完全相同:没有警告显示!
结论
除了一个好的测试实践和非常重要的解决方案(当我把我的工作簿发送给第三方时,我可能每天都会遇到这样的问题,现在我准备好了),还学到了两个东西:
- Excel选项很重要,无论版本如何-特别是当我们涉及VBA解决方案时。
- 每个问题都有简短而优雅的解决方案-连同不明显和复杂的解决方案。这只是更多的证明!)
非常感谢所有为解决方案做出贡献的人,特别是提出问题的OP。希望我的调查和详细描述的测试步骤不仅对我有帮助)
上面的代码示例的样例文件是共享的(许多行是故意注释的):https://www.dropbox.com/s/9bwu6pn8fcogby7/NoWarningsOpen.xlsm
原始答案(对于Excel 2007进行测试,具有某些选项):
这个代码对我来说很好用-它循环遍历了InputFolder
中指定的所有Excel文件:
Sub WorkbookOpening2007() Dim InputFolder As String Dim LoopFileNameExt As String InputFolder = "D:\DOCUMENTS\" 'Trailing "\" is required! LoopFileNameExt = Dir(InputFolder & "*.xls?") Do While LoopFileNameExt <> "" Application.DisplayAlerts = False Application.Workbooks.Open (InputFolder & LoopFileNameExt) Application.DisplayAlerts = True LoopFileNameExt = Dir Loop End Sub
我尝试了使用不可用外部链接的书籍-没有警告。
样例文件:https://www.dropbox.com/s/9bwu6pn8fcogby7/NoWarningsOpen.xlsm