如何打开Excel工作簿而不更新外部数据源(但保持启用状态)?

我有一些工作簿,它以自动macros和数据刷新开始(并且预先给出一些build议,这些工作簿需要这样工作,因为我从Windows调度程序自动启动它们,并且我需要它们执行任务而不执行任何操作在用户的部分)。

当我需要检查/更新一些公式,SQL查询或布局时,我只是打开一个工作簿按住[Shift]键 ,它可以防止在Workbook_Open / Auto_Open事件等触发macros,这是伟大的。

问题是还有一些外部数据源在开始时会自动刷新。 在其中一些工作簿查询需要很长时间才能完成,我需要等待一两分钟才能编辑工作簿。

有什么办法可以打开工作簿同时禁用macros和数据刷新? 或者,也许,任何简单的方法来取消执行查询?

进入Excel选项导航到信任中心,然后T 锈中心设置,并转到外部内容

您将看到“数据连接和工作簿链接的安全设置”。 同时禁用

重新启动Excel,你就完成了。

在Office 2010中,转至相同的“外部内容”菜单,然后select“禁用所有数据连接”以及“禁用工作簿链接的自动更新”。

将代码插入适当的模块后,运行CreateAltStartVBSCreateAltStartVBS将在工作簿文件夹中创build一个VBScript文件(AltStart.vbs)。 当您运行AltStart.vbs ,它将启动您的工作簿绕过您的开放macros,并禁用刷新连接。

工作簿模块

 Private Sub Workbook_BeforeClose(Cancel As Boolean) EnableRefresh True End Sub Private Sub Workbook_Open() If getSwitch = "/z" Then EnableRefresh False Exit Sub End Sub 'Normal code goes here End Sub Sub EnableRefresh(Enable As Boolean) Dim conn As Object For Each conn In ActiveWorkbook.Connections conn.ODBCConnection.EnableRefresh = Enable Next End Sub 

标准模块

 Option Base 0 Option Explicit Declare Function GetCommandLine Lib "kernel32" Alias "GetCommandLineW" () As Long Declare Function lstrlenW Lib "kernel32" (ByVal lpString As Long) As Long Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (MyDest As Any, MySource As Any, ByVal MySize As Long) Function CmdToSTr(Cmd As Long) As String Dim Buffer() As Byte Dim StrLen As Long If Cmd Then StrLen = lstrlenW(Cmd) * 2 If StrLen Then ReDim Buffer(0 To (StrLen - 1)) As Byte CopyMemory Buffer(0), ByVal Cmd, StrLen CmdToSTr = Buffer End If End If End Function Function getSwitch() Dim CmdRaw As Long Dim CmdLine As String CmdRaw = GetCommandLine CmdLine = CmdToSTr(CmdRaw) getSwitch = Split(CmdLine, Chr(34))(2) End Function Sub EnableConnections(Enable As Boolean) Dim conn As Object For Each conn In ActiveWorkbook.Connections conn.ODBCConnection.EnableRefresh = Enable Next End Sub Sub CreateAltStartVBS() Dim myFile As String myFile = ThisWorkbook.Path & "\AltStart.vbs" Open myFile For Output As #1 Print #1, "Dim objShell" Print #1, "Set objShell = CreateObject (""WScript.Shell"")" Print #1, "objShell.Run ""excel.exe /z """ & Chr(34) & ThisWorkbook.FullName & Chr(34) Print #1, "Set objShell = Nothing" Close #1 End Sub