如何取消更新链接警告?


109

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


1
从与@SiddharthRout的讨论中,我们现在看到的原因是不同Excel版本的设置不同:最有可能您使用E​​xcel 2010或更高版本(Siddharth Rout也具有2010),而我正在使用2007,并且如果看到链接则根本没有任何警告还可以 我们将进行更多调查,然后返回有效的解决方案-希望如此)现在尝试Siddharth Rout的答案。
Peter L.

2
我对非常有趣的案例表示支持!
Peter L.

@PeterL。由于即使您手动打开文件也无法获得更新链接,所以我猜某处缺少某个设置。在确认之前,请先在Excel 2007中对其进行测试。:)
Siddharth Rout

您可以发布问题文件的样本吗?很高兴看到链接的性质
brettdj

@brettdj,它是专有的,所以我不能发布整个文件。我将调查这些链接,以便查看它们是否存在问题。
sigil

Answers:


139

更新:

在总结并讨论了所有细节之后,我花了2个公平的时间来检查这些选项,此更新是将所有is 标记为点。

准备工作

首先,我在由VMWare驱动的Clean Win7 SP1 Ultimate x64虚拟机上执行了干净的Office 2010 x86安装(这是我日常测试任务的常规例程,因此我已经部署了许多此类任务)。

然后,我仅更改了以下Excel选项(即,所有其他选项在安装后均保持不变):

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

要求更新自动链接

  • Trust Center > Trust Center Settings... > External Content > Enable All... (尽管与数据连接相关的连接在这种情况下最不重要):

外部内容

前提条件

我按照他的最新答案中的建议准备并放置到C:\工作簿@Siddharth Rout中(为了方便您共享):https: //www.dropbox.com/s/mv88vyc27eljqaq/Book1withLinkToBook2.xlsx然后删除了链接的书,以便共享中的链接该书不可用(肯定)。

手动开启

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

警告#1

该工作簿包含其他数据源的链接

单击后,Update我有望得到另一个:

警告#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

该代码以WARNING#1结尾,并且单击任一选项(Update/ Don't Update)都不会产生进一步的警告,即Application.DisplayAlerts = False禁止显示WARNING#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

显然,该代码最终以禁止BOAT WARNINGS结束。

5. UpdateLinks:=否

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

最后,此1行解决方案(最初由提出@brettdj)的工作方式与Double False:没有警告

结论

除了良好的测试实践和非常重要的已解决案例(我将工作簿发送给3rd Party时,我可能每天都会遇到此类问题,现在我已经准备好了),另外还学习了2件事:

  1. 无论版本如何,Excel选项都很重要-尤其是当我们使用VBA解决方案时。
  2. 每个麻烦都有简短而优雅的解决方案-以及不明显和复杂的解决方案。仅此而已!)

非常感谢为解决方案做出贡献的每个人,尤其是提出问题的OP。希望我的调查和详尽描述的测试步骤不仅对我有帮助)

具有上述代码示例的示例文件是共享的(有意注释了许多行):https : //www.dropbox.com/s/9bwu6pn8fcogby7/NoWarningsOpen.xlsm

原始答案(经过Excel 2007测试,带有某些选项):

这段代码对我来说效果很好-遍历使用通配符指定的所有Excel文件InputFolder

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


6
Application.DisplayAlerts = False不会禁用这些警告:)
Siddharth Rout

@SiddharthRout Sid我发誓我看不到它们:我有一个包含此类链接的文件,并且在手动打开它时看到了警告。使用上述脚本-无警告)可以为您共享视频)))Excel 2007-以防万一。
Peter L.

好的,试试看:)打开两个新的工作簿。将它们另存为book1.xlsx和book2.xlsx。在book1的单元格A1中,键入“ =”并将其指向Book2的单元格A1。如果需要,在Book2的单元格A1中键入一些内容,然后关闭两个工作簿。现在,使用您的代码打开book1,您将看到提示:)
Siddharth Rout

同样,在运行上述锻炼之前,请检查?Application.AskToUpdateLinks“立即”窗口。它已经设置为false还是它是真的?
Siddharth Rout

2
+1到brettdj。如果您的所有报告都相似,则您的客户必须感到高兴)
Ksenia 2013年

22

打开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,以下代码也适用于链接断开的文件。这是我的测试代码。

测试条件

  1. 创建2个新文件。它们命名Sample1.xlsx,并Sample2.xlsx和它们保存在C:\
  2. 在的单元格A1Sample1.xlsx,输入此公式='C:\[Sample2.xlsx]Sheet1'!$A$1
  3. 保存并关闭两个文件
  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

3
该代码对我Sid(在xl2010中)有效,因为它禁用了消息,但确实在后台更新了链接。使用`Set getWorkbook = Workbooks.Open(bkPath,False)`将禁止显示警告,并且不会驱动更新。测试xl03xl10
brettdj

1
谢谢戴夫。:)顺便说一句,我想你的意思是xl03和xl2007:P我也编辑了上面的帖子以反映您的建议。
Siddharth Rout

1
@brettdj非常感谢!那天早上我们和Sid度过了一个愉快的时光,试图弄清楚这件事。因此,上面的代码是否会禁止任何Excel版本的所有警告,并以静默方式更新链接?以及如何将代码修改为避免更新?抱歉,我在选择权上有些失落,但希望我能正确解释所有内容)
Peter L.

@brettdj,如果Application.DisplayAlerts = False还添加什么内容?
Peter L.

1
@sigil:在看不到您的工作簿的情况下,我将无法进一步发表评论。我已经在不同的条件下测试了我的代码,它可以完美地工作。实际上,这是抑制那些警报的正确方法……
Siddharth Rout

6

Excel 2016在创建工作簿/文件时,我遇到了类似的问题,然后我更改了名称,但是以某种方式保留了旧的工作簿名称。经过大量的搜索之后...好吧,在那里没有找到最终答案...

转到DATA-> Edit Link-> Startup Prompt(在底部),然后为您选择最佳选项。


3
这是最好的解决方案。它仅影响做出此选择的工作簿,并且不需要任何VBA。
盖亚

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

好主意; 不幸的是,该项目要求我打开一组无法修改其内容的工作簿。因此,将无法Workbook_Open()为目标集中的每个工作簿设置事件。
sigil

3

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

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

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

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

Workbook.Open(UpdateLinks:= 0)

相关链接: AskToUpdateLinks = False和UpdateLinks:= 0之间的差异


2

我找到了一个临时解决方案,至少可以让我处理此工作。我写了一个简短的AutoIt脚本,等待“更新链接”窗口出现,然后单击“不更新”按钮。代码如下:

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的解决方案,这样我就可以使其成为一个独立的应用程序。


2

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

这将用于打开另一个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,并且除了加载时间更长之外,我还没有任何问题或警告地AB文件中打开了文件,并进行了完全更新。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.