我正在尝试编写一个打开许多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。
答案 0 :(得分:119)
<强>更新强>
在总结和讨论了所有细节之后,我花了2个小时来检查选项,此更新是针对所有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...
(虽然与数据连接相关的那个很可能对案例不重要):
我准备好了C:\
一本工作簿,完全按照@Siddharth Rout
的建议更新了他的更新答案(为了您的方便而分享):https://www.dropbox.com/s/mv88vyc27eljqaq/Book1withLinkToBook2.xlsx链接的书籍已被删除以便共享图书中的链接不可用(肯定)。
以上共享文件在打开时显示(具有上面列出的Excel选项)2个警告 - 按照出现的顺序:
警告#1
点击Update
后,我发现了另一个:
警告#2
所以,我想我的测试环境现在与OP
非常相似了。到目前为止,我们最终还是去了
现在,我将逐步尝试所有可能的选项,以使图片清晰。为简单起见,我将仅共享相关的代码行(最后将共享包含代码的完整示例文件)。
<强> 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
此代码以警告#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
与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
显然,此代码最终会抑制 BOTH WARNINGS 。
<强> 5。 UpdateLinks:=假强>
Application.Workbooks.Open Filename:="C:\Book1withLinkToBook2.xlsx", UpdateLinks:=False
最后,这个1行解决方案(最初由@brettdj
提出)的工作方式与Double False相同:显示 NO WARNINGS !
除了良好的测试实践和非常重要的解决案例(我每天都会在将工作簿发送给第三方时遇到此类问题,现在我已做好准备),还有2件事情要学习:
非常感谢为解决方案做出贡献的每个人,尤其是提出问题的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
答案 1 :(得分:20)
打开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,下面的代码也适用于链接断开的文件。这是我的测试代码。
测试条件
Sample1.xlsx
和Sample2.xlsx
并将其保存在C:\
A1
的单元格Sample1.xlsx
中,输入此公式='C:\[Sample2.xlsx]Sheet1'!$A$1
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
答案 2 :(得分: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
答案 3 :(得分:4)
Excel 2016 我创建一个工作簿/文件时遇到了类似的问题然后我更改了名称,但不知何故保留了旧的工作簿名称。 经过大量的谷歌搜索......好吧,没有找到任何最终答案......
转到DATA - &gt;修改链接 - &gt;启动提示(位于底部)然后为您选择最佳选项。
答案 4 :(得分:2)
我找到了一个临时解决方案,至少可以让我处理这项工作。我写了一个简短的AutoIt脚本,等待&#34;更新链接&#34;要显示的窗口,然后点击“不要更新”#34;按钮。代码如下:
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的解决方案,所以我可以把它变成一个独立的应用程序。
答案 5 :(得分:1)
希望在解决这个问题(或部分问题)时提供一些额外的意见。
这适用于从另一个文件打开Excel
文件。来自先生的一行代码。 Peter L。,对于更改,请使用以下内容:
Application.Workbooks.Open Filename:="C:\Book1withLinkToBook2.xlsx", UpdateLinks:=3
这是MSDS
。结果是它只是更新了所有内容(是的,所有内容)而没有任何警告。如果您录制宏,也可以检查这一点。
在MSDS
中,它将此引用到MS EXCEL 2010
和2013
。我认为MS EXCEL 2016
也涵盖了这一点。
我有MS EXCEL 2013
,并且情况与此主题非常相似。所以我有一个文件(称之为A
),其Workbook_Open
事件代码总是卡在更新链接提示上。
我有另一个连接到此文件的文件(称为B
),数据透视表强制我打开文件A
,以便加载数据模型。由于我想在后台静默打开A
文件,我只使用上面写的行Windows("A.xlsx").visible = false
,除了更大的加载时间,我打开{{1来自A
文件的文件没有任何问题或警告,并且已完全更新。
答案 6 :(得分:0)
(我没有足够的代表点来添加评论,但我想在此处为答案添加一些清晰度)
Application.AskToUpdateLinks = False可能不是您想要的。
如果设置为False,则MS Excel 将尝试自动更新链接,只是不会事先提示用户,这有点违反直觉。
正确的解决方案,如果您要打开文件而没有更新链接,则应为:
Workbook.Open(更新链接:= 0)
相关链接: Difference in AskToUpdateLinks=False and UpdateLinks:=0