如何禁止更新链接警告?

时间:2013-02-16 08:15:18

标签: excel vba excel-vba

我正在尝试编写一个打开许多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。

7 个答案:

答案 0 :(得分:119)

<强>更新

在总结和讨论了所有细节之后,我花了2个小时来检查选项,此更新是针对所有i s。

制剂

首先,我在由VMWare提供支持的Clean Win7 SP1 Ultimate x64虚拟机上执行了干净的Office 2010 x86安装(这是我日常测试任务的常用例程,因此我部署了许多其他例程)。

然后,我只更改了以下Excel选项(即所有其他选项在安装后保留原样):

  • Advanced > General > Ask to update automatic links 已检查

Ask to update automatic links

  • Trust Center > Trust Center Settings... > External Content > Enable All...(虽然与数据连接相关的那个很可能对案例不重要):

External Content

前提条件

我准备好了C:\一本工作簿,完全按照@Siddharth Rout的建议更新了他的更新答案(为了您的方便而分享):https://www.dropbox.com/s/mv88vyc27eljqaq/Book1withLinkToBook2.xlsx链接的书籍已被删除以便共享图书中的链接不可用(肯定)。

手动开启

以上共享文件在打开时显示(具有上面列出的Excel选项)2个警告 - 按照出现的顺序:

警告#1

This workbook contains links to other data sources

点击Update后,我发现了另一个:

警告#2

This workbook contains one or more links that cannot be updated

所以,我想我的测试环境现在与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 结束,单击任一选项(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相反,此代码仅以警告#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

显然,此代码最终会抑制 BOTH WARNINGS

<强> 5。 UpdateLinks:=假

Application.Workbooks.Open Filename:="C:\Book1withLinkToBook2.xlsx", UpdateLinks:=False

最后,这个1行解决方案(最初由@brettdj提出)的工作方式与Double False相同:显示 NO WARNINGS

结论

除了良好的测试实践和非常重要的解决案例(我每天都会在将工作簿发送给第三方时遇到此类问题,现在我已做好准备),还有2件事情要学习:

  1. Excel选项很重要,无论版本如何 - 特别是当我们来到VBA解决方案时。
  2. 每一个麻烦都有简短而优雅的解决方案 - 连同不明显和复杂的解决方案。再多证明一次!)
  3. 非常感谢为解决方案做出贡献的每个人,尤其是提出问题的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

答案 1 :(得分:20)

打开Excel的VBA编辑器并在立即窗口中输入该内容(参见屏幕截图)

Application.AskToUpdateLinks = False 

关闭Excel,然后打开文件。它不会再次提示你。请记住在关闭工作簿时重置它,否则它也不适用于其他工作簿。

<强>截图

enter image description here

修改

因此将其应用于您的代码,您的代码将如下所示

Function getWorkbook(bkPath As String) As Workbook
    Application.AskToUpdateLinks = False
    Set getWorkbook = Workbooks.Open(bkPath, False)
    Application.AskToUpdateLinks = True
End Function

<强>后续

Sigil,下面的代码也适用于链接断开的文件。这是我的测试代码。

测试条件

  1. 创建2个新文件。将他们命名为Sample1.xlsxSample2.xlsx并将其保存在C:\
  2. A1的单元格Sample1.xlsx中,输入此公式='C:\[Sample2.xlsx]Sheet1'!$A$1
  3. 保存并关闭两个文件
  4. 删除Sample2.xlsx !!!
  5. 打开一个新工作簿,它的模块粘贴此代码并运行Sample。你会发现你不会得到提示。
  6. <强>代码

    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 :(得分:5)

我想在我的工作簿在Excel中手动打开时(而不是通过VBA以编程方式打开它)时,禁止询问您是否希望更新指向另一个工作簿的链接的提示。我尝试将Application.AskToUpdateLinks = False作为Auto_Open()宏中的第一行,但这不起作用。然而,我发现如果你把它放在Workbook_Open()模块的ThisWorkbook函数中,它可以很好地工作 - 对话框被抑制但是更新仍然在后台静默发生。

 Private Sub Workbook_Open()
    ' Suppress dialog & update automatically without asking
    Application.AskToUpdateLinks = False
End Sub

答案 3 :(得分:4)

Excel 2016 我创建一个工作簿/文件时遇到了类似的问题然后我更改了名称,但不知何故保留了旧的工作簿名称。 经过大量的谷歌搜索......好吧,没有找到任何最终答案......

转到DATA - &gt;修改链接 - &gt;启动提示(位于底部)然后为您选择最佳选项。

答案 4 :(得分:2)

我找到了一个临时解决方案,至少可以让我处理这项工作。我写了一个简短的AutoIt脚本,等待&#34;更新链接&#34;要显示的窗口,然后点击“不要更新”#34;按钮。代码如下:

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

到目前为止,这似乎有效。我真的很想找到一个完全是VBA的解决方案,所以我可以把它变成一个独立的应用程序。

答案 5 :(得分:1)

希望在解决这个问题(或部分问题)时提供一些额外的意见。

这适用于从另一个文件打开Excel文件。来自先生的一行代码。 Peter L。,对于更改,请使用以下内容:

Application.Workbooks.Open Filename:="C:\Book1withLinkToBook2.xlsx", UpdateLinks:=3

这是MSDS。结果是它只是更新了所有内容(是的,所有内容)而没有任何警告。如果您录制宏,也可以检查这一点。

MSDS中,它将此引用到MS EXCEL 20102013。我认为MS EXCEL 2016也涵盖了这一点。

我有MS EXCEL 2013,并且情况与此主题非常相似。所以我有一个文件(称之为A),其Workbook_Open事件代码总是卡在更新链接提示上。 我有另一个连接到此文件的文件(称为B),数据透视表强制我打开文件A,以便加载数据模型。由于我想在后台静默打开A文件,我只使用上面写的行Windows("A.xlsx").visible = false,除了更大的加载时间,我打开{{1来自A文件的文件没有任何问题或警告,并且已完全更新。

答案 6 :(得分:0)

(我没有足够的代表点来添加评论,但我想在此处为答案添加一些清晰度)

Application.AskToUpdateLinks = False可能不是您想要的。

如果设置为False,则MS Excel 尝试自动更新链接,只是不会事先提示用户,这有点违反直觉。

正确的解决方案,如果您要打开文件而没有更新链接,则应为:

Workbook.Open(更新链接:= 0)

相关链接: Difference in AskToUpdateLinks=False and UpdateLinks:=0