如何抑制更新链接警告?
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.xlsx
和 Sample2.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)` 将抑制警告,而不是驱动更新。开始测试 xl03 和 xl10 谢谢戴夫。 :) 顺便说一句,我猜你的意思是 xl03 和 xl2007 :P 我还编辑了上面的帖子以反映你的建议。 @brettdj 非常感谢!那天早上我们和希德一起度过了一个小时,试图弄清楚这个案子。那么,上面的代码是否会抑制任何 Excel 版本的所有警告并使链接更新静默?我应该如何修改代码以避免更新?抱歉,我对选项有点迷茫,但希望我解释正确) @brettdj 如果还添加了Application.DisplayAlerts = False
会怎样?
@sigil:没有看到你的工作簿,我将无法进一步评论。我已经在不同的条件下测试了我的代码,它可以完美运行。事实上,这是抑制这些警报的正确方法......【参考方案2】:
更新:
在总结和讨论了所有细节之后,我花了 2 个小时检查选项,这次更新是 dot all i
s。
准备工作
首先,我在由 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 2010
和2013
。我在想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
【讨论】:
以上是关于如何抑制更新链接警告?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Visual Studio 2005 中抑制单个 BizTalk 警告
如何修复或抑制误报“您可能在组件渲染函数中有无限更新循环”Vue 警告
有没有办法在构建 Docker 映像时抑制“更新替代:警告:跳过创建”警告?