如何禁止更新链接警告?

sig*_*gil 99 excel vba

我正在尝试编写一个打开许多Excel文件的脚本.我一直得到提示:

This workbook contains links to other data sources.
Run Code Online (Sandbox Code Playgroud)

我希望不要出现此消息,以便我的脚本可以自动浏览所有工作簿,而无需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
Run Code Online (Sandbox Code Playgroud)

但是,该消息仍然出现.我怎么能抑制它?

编辑:似乎这个消息出现在链接断开的工作簿中; 我没有看到这条This workbook contains one or more links that cannot be updated消息因为我设置DisplayAlerts为假.工作簿链接到Windows服务器上的文件夹中的等效文件,因此当从该文件夹中删除匹配文件(这是我们业务流程的一部分)时,链接会中断.链接断开时是否可以禁止警告?

另外,我正在使用Excel 2010.

Pet*_* L. 129

更新:

在总结和讨论了所有细节之后,我花了2个小时来检查选项,而这个更新是为了解决所有问题i.

准备工作

首先,我进行了一个干净的Office 2010 x86安装搭载VMWare的干净的Win7 SP1旗舰版64位虚拟机上(这是我的日常测试任务的例行常规,所以我有很多的部署).

然后,我只更改了以下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"
Run Code Online (Sandbox Code Playgroud)

毫不奇怪 - 这会产生两个警告,就像上面的手动打开一样.

2. Application.DisplayAlerts = False

Application.DisplayAlerts = False
Application.Workbooks.Open Filename:="C:\Book1withLinkToBook2.xlsx"
Application.DisplayAlerts = True
Run Code Online (Sandbox Code Playgroud)

此代码以警告#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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

显然,这段代码最终会抑制两个警告.

5. UpdateLinks:= False

Application.Workbooks.Open Filename:="C:\Book1withLinkToBook2.xlsx", UpdateLinks:=False
Run Code Online (Sandbox Code Playgroud)

最后,这个1行解决方案(最初提出@brettdj)的工作方式与Double False相同:不显示任何警告!

结论

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

  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
Run Code Online (Sandbox Code Playgroud)

我尝试使用不可用外部链接的书籍 - 没有警告.

示例文件:https://www.dropbox.com/s/9bwu6pn8fcogby7/NoWarningsOpen.xlsm

  • `Application.DisplayAlerts = False`不会禁用那些警告:) (6认同)
  • +1到brettdj.如果您的所有报告都相似,您的客户必须满意) (2认同)

Sid*_*out 22

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

Application.AskToUpdateLinks = False 
Run Code Online (Sandbox Code Playgroud)

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

ScreenShot:

在此输入图像描述

编辑

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

Function getWorkbook(bkPath As String) As Workbook
    Application.AskToUpdateLinks = False
    Set getWorkbook = Workbooks.Open(bkPath, False)
    Application.AskToUpdateLinks = True
End Function
Run Code Online (Sandbox Code Playgroud)

跟进

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
Run Code Online (Sandbox Code Playgroud)

  • 该代码对我来说是有效的(*在xl2010*中),因为它禁用了该消息,但它确实在后台更新了链接.使用`Set getWorkbook = Workbooks.Open(bkPath,False)`将禁止警告,而不是驱动更新.进行测试*xl03*和*xl10* (3认同)

use*_*451 8

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

转到 DATA -> Edit Link -> Startup Prompt(在底部)然后选择最适合您的选项。

  • 这是最好的解决方案。它只影响做出此选择的工作簿,不需要任何 VBA。 (4认同)

小智 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
Run Code Online (Sandbox Code Playgroud)


小智 5

(我没有足够的代表点来添加评论,但我想在这里对答案进行一些澄清)

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

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

如果您希望在更新链接的情况下打开文件,则正确的解决方案应该是:

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

相关链接: AskToUpdateLinks=False 和 UpdateLinks:=0 的区别


sig*_*gil 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
Run Code Online (Sandbox Code Playgroud)

到目前为止,这似乎有效。然而,我真的很想找到一个完全由 VBA 组成的解决方案,这样我就可以将其变成一个独立的应用程序。