我正在尝试编写一个打开许多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.到目前为止,我们终于如此好了
现在,我将逐步尝试所有可能的选项,以使图片清晰.为简单起见,我将仅共享相关的代码行(最后将共享包含代码的完整示例文件).
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相同:不显示任何警告!
除了良好的测试实践和非常重要的解决案例(我每天都会在将工作簿发送给第三方时遇到这样的问题,现在我已经准备好了),还有两件事:
非常感谢为解决方案做出贡献的每个人,尤其是提出问题的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
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,下面的代码也适用于链接断开的文件.这是我的测试代码.
测试条件
Sample1.xlsx,并Sample2.xlsx和它们保存在C:\A1中Sample1.xlsx,键入此公式='C:\[Sample2.xlsx]Sheet1'!$A$1Sample.你会发现你不会得到提示.码
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)
Excel 2016 我在创建工作簿/文件然后更改名称时遇到了类似的问题,但以某种方式保留了旧的工作簿名称。经过大量的谷歌搜索......好吧,没有在那里找到任何最终答案......
转到 DATA -> Edit Link -> Startup Prompt(在底部)然后选择最适合您的选项。
小智 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 的区别
我找到了一个临时解决方案,至少可以让我处理这项工作。我编写了一个简短的 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 组成的解决方案,这样我就可以将其变成一个独立的应用程序。
| 归档时间: |
|
| 查看次数: |
281690 次 |
| 最近记录: |