119

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

4

8 回答 8

152

更新:

在总结和讨论了所有细节之后,我花了 2 个小时检查选项,这次更新是 dot all 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's) 到目前为止一切顺利,我们终于去

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,此代码仅以WARNING #2结束,即Application.AskToUpdateLinks = False抑制WARNING #1

4.双重错误

Application.AskToUpdateLinks = False
Application.DisplayAlerts = False
Application.Workbooks.Open Filename:="C:\Book1withLinkToBook2.xlsx"
Application.DisplayAlerts = True
Application.AskToUpdateLinks = True

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

5.更新链接:=假

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

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

结论

除了良好的测试实践和非常重要的已解决案例(我可能每天在将工作簿发送给第 3 方时都会遇到此类问题,现在我准备好了),还学到了 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

于 2013-02-16T08:45:29.643 回答
27

打开 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
于 2013-02-16T08:41:05.360 回答
8

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

转到数据 -> 编辑链接 -> 启动提示(在底部),然后选择最适合您的选项。

于 2016-08-17T05:24:03.530 回答
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
于 2013-05-17T00:06:58.477 回答
5

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

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

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

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

Workbook.Open(UpdateLinks:=0)

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

于 2018-12-11T15:00:10.710 回答
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 的解决方案,这样我就可以使它成为一个独立的应用程序。

于 2013-02-16T18:43:46.727 回答
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

于 2015-11-19T13:26:35.903 回答
0

就像对这次谈话的警告一样。要删除更新链接通知,您可以在 workbook_open() 中执行类似的操作。

Private Sub workbook_Open()
Application.ThisWorkbook.UpdateLinks = xlUpdateLinksNever 
#Your code goes here
Application.ThisWorkbook.UpdateLinks = xlUpdateLinksAlways
End Sub
于 2022-01-05T11:52:39.003 回答