如何在不更新外部数据源的情况下打开Excel工作簿(但保持启用)?

时间:2016-09-15 07:54:47

标签: excel vba excel-vba macros database-connection

我有一些工作簿,从自动宏和数据刷新开始(并且预先设置一些建议,这些工作簿需要像这样工作,因为我从Windows调度程序自动启动它们,我需要它们来执行任务没有对用户的任何操作)。

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

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

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

2 个答案:

答案 0 :(得分:2)

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

您将看到数据连接和工作簿链接的安全设置。 停用两者。

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

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

答案 1 :(得分:1)

将代码插入适当的模块后运行CreateAltStartVBSCreateAltStartVBS将在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