如何抑制更新链接警告?

Posted

技术标签:

【中文标题】如何抑制更新链接警告?【英文标题】:How to suppress Update Links warning? 【发布时间】:2013-02-01 05:38:25 【问题描述】:

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

【问题讨论】:

从与@SiddharthRout 的讨论中,我们现在看到原因是不同 Excel 版本的设置不同:很可能您使用 Excel 2010 或更高版本(Siddharth Rout 也有 2010),而我使用的是 2007如果链接正常,则根本看不到任何警告。我们将进行更多调查并返回有效的解决方案 - 我希望如此)现在尝试 Siddharth Rout 的答案。 我为非常有趣的案例点赞! @PeterL。由于即使您手动打开文件也没有获得更新链接,我想我在某处缺少一个设置。在我确认之前让我在 Excel 2007 中测试它。 :) 你能发布一个问题文件的样本吗?看看链接的性质会很好 @brettdj,它是专有的,所以我不能发布整个文件。我会调查这些链接,看看它们是否有问题。 【参考方案1】:

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

测试条件

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

【讨论】:

该代码对我有用 Sid(in xl2010),因为它禁用了消息,但它确实在后台更新了链接。使用 `Set getWorkbook = Workbooks.Open(bkPath, False)` 将抑制警告,而不是驱动更新。开始测试 xl03xl10 谢谢戴夫。 :) 顺便说一句,我猜你的意思是 xl03 和 xl2007 :P 我还编辑了上面的帖子以反映你的建议。 @brettdj 非常感谢!那天早上我们和希德一起度过了一个小时,试图弄清楚这个案子。那么,上面的代码是否会抑制任何 Excel 版本的所有警告并使链接更新静默?我应该如何修改代码以避免更新?抱歉,我对选项有点迷茫,但希望我解释正确) @brettdj 如果还添加了Application.DisplayAlerts = False 会怎样? @sigil:没有看到你的工作簿,我将无法进一步评论。我已经在不同的条件下测试了我的代码,它可以完美运行。事实上,这是抑制这些警报的正确方法......【参考方案2】:

更新:

在总结和讨论了所有细节之后,我花了 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...(尽管与数据连接相关的那个对于这个案例很可能并不重要):

前提条件

我完全按照@Siddharth Rout 在他更新的答案中的建议(为了您的方便而共享)准备并放置了一个工作簿到C:\: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. UpdateLinks:=False

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

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

结论

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

    无论版本如何,Excel 选项都很重要,尤其是当我们使用 VBA 解决方案时。 每个问题都有简短而优雅的解决方案 - 包括不明显和复杂的解决方案。再有一个证明!)

非常感谢为解决方案做出贡献的每个人,尤其是提出问题的 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

【讨论】:

Application.DisplayAlerts = False 不会禁用这些警告 :) @SiddharthRout Sid 我发誓我没有看到它们:我有一个带有此类链接的文件,并且在手动打开它时会看到警告。使用上述脚本 - 没有警告)可能会为您分享视频)))Excel 2007 - 以防万一。 好的,试试这个 :) 打开两个新的工作簿。将它们保存为 book1.xlsx 和 book2.xlsx。在 book1 的单元格 A1 中,键入“=”并将其指向 Book2 的单元格 A1。如果您愿意,可以在 Book2 的单元格 A1 中键​​入内容,然后关闭两个工作簿。现在使用您的代码打开 book1,您会看到仍然收到提示 :) 另外,在运行上述练习之前,请在“立即”窗口中检查 ?Application.AskToUpdateLinks。是已经设置为假还是真的... +1 到 brettdj。如果您的所有报告都相似,您的客户一定很高兴)【参考方案3】:

我找到了一个临时解决方案,至少可以让我处理这份工作。我编写了一个简短的 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 的解决方案,这样我就可以使它成为一个独立的应用程序。

【讨论】:

【参考方案4】:

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

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

【讨论】:

好主意;不幸的是,这个项目需要我打开一组我无法修改其内容的工作簿。因此,无法为我的目标集中的每个工作簿设置 Workbook_Open() 事件。【参考方案5】:

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

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

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

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

MSDS 中,它指的是MS EXCEL 20102013。我在想MS EXCEL 2016 也有这个问题。

我有MS EXCEL 2013,情况和这个话题差不多。所以我有一个带有Workbook_Open 事件代码的文件(称为A),它总是卡在更新链接提示上。 我有另一个文件(称为B)连接到这个文件,数据透视表强制我打开文件A,以便加载数据模型。因为我想在后台静默打开A文件,所以我只使用上面写的行,加上Windows("A.xlsx").visible = false,除了加载时间更长,我从@打开A文件987654336@ 文件没有问题或警告,并且完全更新。

【讨论】:

【参考方案6】:

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

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

【讨论】:

这是最好的解决方案。它只影响做出此选择的工作簿,不需要任何 VBA。【参考方案7】:

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

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

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

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

Workbook.Open(UpdateLinks:=0)

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

【讨论】:

【参考方案8】:

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

Private Sub workbook_Open()
Application.ThisWorkbook.UpdateLinks = xlUpdateLinksNever 
#Your code goes here
Application.ThisWorkbook.UpdateLinks = xlUpdateLinksAlways
End Sub

【讨论】:

以上是关于如何抑制更新链接警告?的主要内容,如果未能解决你的问题,请参考以下文章

如何抑制 LLVM 自动合成警告?

如何在 Visual Studio 2005 中抑制单个 BizTalk 警告

如何修复或抑制误报“您可能在组件渲染函数中有无限更新循环”Vue 警告

有没有办法在构建 Docker 映像时抑制“更新替代:警告:跳过创建”警告?

Xcode 7 警告!是为比被链接 (5.1) 更新的 iOS 版本 (5.1.1) 构建的

如何查找和禁用特定的 NVCC 警告?