我有一些工作簿,从自动宏和数据刷新开始(并且预先设置一些建议,这些工作簿需要像这样工作,因为我从Windows调度程序自动启动它们,我需要它们来执行任务没有对用户的任何操作)。
当我需要检查/更新一些公式,SQL查询或布局时,我只需打开一个工作簿按住[Shift]键,它就可以防止在Workbook_Open / Auto_Open事件等中触发宏,这是大。
问题是仍有一些外部数据源在打开时会自动刷新。在其中一些工作簿中,查询需要很长时间才能完成,我需要等待一两分钟才能编辑工作簿。
有没有办法打开工作簿,同时禁用宏和数据刷新?或者,也许,任何取消执行查询的简单方法?
答案 0 :(得分:2)
进入 Excel选项 导航到信任中心,然后导航到防锈中心设置,然后转到 外部内容。
您将看到数据连接和工作簿链接的安全设置。 停用两者。
重新启动Excel,你就完成了。
在Office 2010中,转到相同的“外部内容”菜单,然后选择“禁用所有数据连接”以及“禁用工作簿链接的自动更新”。
答案 1 :(得分:1)
将代码插入适当的模块后运行CreateAltStartVBS
。 CreateAltStartVBS
将在workbooks文件夹中创建一个VBScript文件(AltStart.vbs)。当您运行AltStart.vbs
时,它将启动您的工作簿,绕过您的开放宏并禁用刷新连接。
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