如何禁止更新链接警告?

我正在尝试编写一个脚本来打开许多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 Routbuild议更新的答案(为了方便您的共享): 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 UpdateDon'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练习和一个非常重要的解决案例(我可能每天都会面临这样的问题,同时把我的练习册发给第三方,现在我准备好了),另外还有两件事情:

  1. 无论版本如何,Excel选项都很重要 – 特别是当我们来到VBA解决scheme时。
  2. 每一个麻烦都有短暂而优雅的解决方法 – 再加上不明显和复杂的一个。 再说一点!)

非常感谢为解决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条件

  1. 创build2个新文件。 将它们命名为Sample1.xlsxSample2.xlsx并将它们保存在C:\
  2. Sample1.xlsx单元格A1中,键入此公式='C:\[Sample2.xlsx]Sheet1'!$A$1
  3. 保存并closures这两个文件
  4. 删除Sample2.xlsx !!!
  5. 打开一个新的工作簿,它的模块粘贴这个代码并运行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 20102013 。 我在想, MS EXCEL 2016也包括了这个。

我有MS EXCEL 2013 ,和这个话题几乎一样。 所以我有一个文件(称为A )与Workbook_Open事件代码,总是被困在更新链接提示 。 我有另一个文件(称为B )连接到这个,并且数据透视表迫使我打开文件A以便可以加载数据模型。 因为我想在后台默默地打开A文件,所以我只用上面写的一行,用Windows("A.xlsx").visible = false ,除了更大的加载时间,我打开来自B文件的文件没有问题或警告,并且完全更新。