如何禁止更新链接警告?
我正在尝试编写一个脚本来打开许多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
消息的This workbook contains one or more links that cannot be updated
因为我将DisplayAlerts
设置为false。 工作簿链接到我们的Windows服务器上的文件夹中的等效文件,所以当从该文件夹中删除匹配的文件(这是我们业务stream程的一部分)时,链接将中断。 当链接被破坏时,可以抑制警告吗?
另外,我正在使用Excel 2010。
更新:
在所有的细节总结和讨论之后,我花了2个小时的时间来检查选项,这个更新是所有的。
准备工作
首先,我在由VMWare提供支持的Clean Win7 SP1 Ultimate x64虚拟机上执行了一个干净的Office 2010 x86安装(这对于我的日常testing任务来说是常见的例程,所以我已经部署了它们中的很多)。
然后,我只改变了以下的Excel选项(即所有其他的安装后保持原样):
-
Advanced > General > Ask to update automatic links
检查 :
-
Trust Center > Trust Center Settings... > External Content > Enable All...
(尽pipe与数据连接有关的那个最有可能对此不重要):
前提条件
我准备并放置到C:\
工作簿完全按照@Siddharth Rout
build议更新的答案(为了方便您的共享): https : @Siddharth Rout
链接的书籍,然后删除所以共享书籍中的链接不可用(肯定)。
手动打开
上面的共享文件在打开时显示(具有上面列出的Excel选项)2个警告 – 按照外观顺序:
警告#1
点击Update
后,我预计会有另一个:
警告#2
所以,我想我的testing环境现在和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
此代码以WARNING#1结尾,并且任一选项单击( Update
/ Don't Update
) Don't Update
产生进一步的警告,即Application.DisplayAlerts = False
禁止警告#2 。
3. Application.AskToUpdateLinks = False
Application.AskToUpdateLinks = False Application.Workbooks.Open Filename:="C:\Book1withLinkToBook2.xlsx" Application.AskToUpdateLinks = True
与DisplayAlerts
相反,此代码仅以WARNING#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
最后,这个1行解决scheme(最初由@brettdj
提出)的工作方式与双重假相同: 没有警告显示!
结论
除了一个好的testing练习和一个非常重要的解决案例(我可能每天都会面临这样的问题,同时把我的练习册发给第三方,现在我准备好了),另外还有两件事情:
- 无论版本如何,Excel选项都很重要 – 特别是当我们来到VBA解决scheme时。
- 每一个麻烦都有短暂而优雅的解决方法 – 再加上不明显和复杂的一个。 再说一点!)
非常感谢为解决scheme做出贡献的每个人,特别是提出问题的OP。 希望我的调查和彻底的描述testing步骤不仅对我有帮助)
上面代码示例的示例文件是共享的(许多行都是有意的评论): https : //www.dropbox.com/s/9bwu6pn8fcogby7/NoWarningsOpen.xlsm
原始答案 (针对某些选项的Excel 2007进行了testing):
此代码对我来说工作正常 – 它循环遍历在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
打开Excel的VBA编辑器并在立即窗口中input(见屏幕截图)
Application.AskToUpdateLinks = False
closuresExcel,然后打开您的文件。 它不会再提示你。 请记住在closures工作簿时重置它,否则它将不适用于其他工作簿。
ScreenShot :
编辑
因此,将其应用于您的代码,您的代码将如下所示
Function getWorkbook(bkPath As String) As Workbook Application.AskToUpdateLinks = False Set getWorkbook = Workbooks.Open(bkPath, False) Application.AskToUpdateLinks = True End Function
跟进
Sigil,下面的代码也适用于具有损坏链接的文件。 这是我的testing代码。
testing条件
- 创build2个新文件。 将它们命名为
Sample1.xlsx
和Sample2.xlsx
并将它们保存在C:\
- 在
Sample1.xlsx
单元格A1
中,键入此公式='C:\[Sample2.xlsx]Sheet1'!$A$1
- 保存并closures这两个文件
- 删除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
我发现了一个临时的解决scheme,至less可以让我处理这个工作。 我写了一个简短的AutoIt脚本,等待“更新链接”窗口出现,然后单击“不更新”button。 代码如下:
while 1 if winexists("Microsoft Excel","This workbook contains links to other data sources.") Then controlclick("Microsoft Excel","This workbook contains links to other data sources.",2) EndIf WEnd
到目前为止,这似乎是工作。 我真的很想find一个完全是VBA的解决scheme,所以我可以把它作为一个独立的应用程序。
我想压制提示,询问是否希望在Excel中手动打开工作簿(而不是通过VBA以编程方式打开工作簿)时更新指向其他工作簿的链接。 我试过包括: Application.AskToUpdateLinks = False
作为我的Auto_Open()
macros的第一行,但没有奏效。 然而,我发现,如果你把它放在ThisWorkbook
模块的Workbook_Open()
函数中,它会出色地工作 – 对话框被抑制,但更新仍然在后台默默地发生。
Private Sub Workbook_Open() ' Suppress dialog & update automatically without asking Application.AskToUpdateLinks = False End Sub
Excel 2016我创build工作簿/文件时遇到了类似的问题,然后我更改了名称,但不知何故旧的工作簿名称保留了。 经过大量的谷歌search…没有find任何最终的答案。 转到数据 – >编辑链接 – >启动提示(在底部)然后select最适合你的选项。
希望在解决这个问题(或其中的一部分)时给予一些额外的投入。
这将工作从另一个打开Excel
文件。 Peter L.先生的一行代码,用于更改,请使用以下代码:
Application.Workbooks.Open Filename:="C:\Book1withLinkToBook2.xlsx", UpdateLinks:=3
这是在MSDS
。 效果是,它只是更新一切(是的,一切),没有任何警告。 如果您录制一个macros,这也可以被检查。
在MSDS
,它是指MS EXCEL 2010
和2013
。 我在想, MS EXCEL 2016
也包括了这个。
我有MS EXCEL 2013
,和这个话题几乎一样。 所以我有一个文件(称为A
)与Workbook_Open
事件代码,总是被困在更新链接提示 。 我有另一个文件(称为B
)连接到这个,并且数据透视表迫使我打开文件A
以便可以加载数据模型。 因为我想在后台默默地打开A
文件,所以我只用上面写的一行,用Windows("A.xlsx").visible = false
,除了更大的加载时间,我打开来自B
文件的文件没有问题或警告,并且完全更新。