<div style="text-indent: 2em;"><p>这个模块(MWorkspace.bas)主要用来配置EXCEL VBA独立应用程序的环境,摘抄自《Excel专业开发》,分享下,也备自己不时之需。</p>

其中有一些常量或者函数是定义在其他模块文件中的,使用时需要自己定义。如 gsREG_XL_ENV 就是定义在MGlobals.bas中。

'
' Description:  This module holds code to save and restore the Excel workspace.
'
' Authors:      Stephen Bullen, www.oaltd.co.uk
'               Rob Bovey, www.appspro.com
'
' Chapter Change Overview
' Ch#   Comment
' --------------------------------------------------------------
' 06    Initial version
' 07    Kill the application event handler at shutdown
' 08    Adding the commandbar builder meant a change in a procedure name
'       Moved code to re-enable toolbars here from the old ResetMenus
' 09    Added call to SetIcon in new MAPIWrappers module
'
Option Explicit
Option Private Module

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Comments: Store the Excel workspace settings in the Registry ' ' Arguments: None ' ' Date Developer Chap Action ' -------------------------------------------------------------- ' 02 Jun 04 Stephen Bullen Ch06 Initial version ' Sub StoreExcelSettings()

Dim cbBar As CommandBar
Dim sBarNames As String
Dim objTemp As Object
Dim wkbTemp As Workbook

'Some properties require a workbook open, so create one
If ActiveWorkbook Is Nothing Then Set wkbTemp = Workbooks.Add

'Write a value to indicate that the settings have been stored.
SaveSetting gsREG_APP, gsREG_XL_ENV, "Stored", "Yes"

'Store the current Excel settings in the registry,
'for safe crash-recovery
With Application

    SaveSetting gsREG_APP, gsREG_XL_ENV, "DisplayStatusBar", CStr(.DisplayStatusBar)
    SaveSetting gsREG_APP, gsREG_XL_ENV, "DisplayFormulaBar", CStr(.DisplayFormulaBar)
    SaveSetting gsREG_APP, gsREG_XL_ENV, "Calculation", CStr(.Calculation)
    SaveSetting gsREG_APP, gsREG_XL_ENV, "IgnoreRemoteRequests", CStr(.IgnoreRemoteRequests)
    SaveSetting gsREG_APP, gsREG_XL_ENV, "Iteration", CStr(.Iteration)
    SaveSetting gsREG_APP, gsREG_XL_ENV, "MaxIterations", CStr(.MaxIterations)

    'Which commandbars are visible
    For Each cbBar In .CommandBars
        If cbBar.Visible Then sBarNames = sBarNames &amp; "," &amp; cbBar.Name
    Next
    SaveSetting gsREG_APP, gsREG_XL_ENV, "VisibleCommandBars", sBarNames

    'Special items for Excel 2000 and up
    If Val(.Version) &gt;= 9 Then
        SaveSetting gsREG_APP, gsREG_XL_ENV, "ShowWindowsInTaskbar", CStr(.ShowWindowsInTaskbar)
    End If

    'Special items for Excel 2002 and up
    If Val(.Version) &gt;= 10 Then
        Set objTemp = .CommandBars
        SaveSetting gsREG_APP, gsREG_XL_ENV, "DisableAskAQuestion", CStr(objTemp.DisableAskAQuestionDropdown)
        SaveSetting gsREG_APP, gsREG_XL_ENV, "AutoRecover", CStr(.AutoRecover.Enabled)
    End If
End With

If Not wkbTemp Is Nothing Then wkbTemp.Close False

End Sub

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Comments: Restore the Excel workspace settings, reading them ' from the Registry ' ' Arguments: None ' ' Date Developer Chap Action ' -------------------------------------------------------------- ' 02 Jun 04 Stephen Bullen Ch06 Initial version ' 02 Jun 04 Stephen Bullen Ch07 Kill the event handler at shutdown ' 03 Jun 04 Stephen Bullen Ch08 Renamed RestoreMenus to ResetCommandBars and moved re-enabling toolbars to here ' Sub RestoreExcelSettings()

Dim vKey As Variant
Dim vBarName As Variant
Dim objTemp As Object
Dim cbCommandbar As CommandBar

'Kill our event handler
Set gclsEventHandler = Nothing

'Restore the original Excel settings from the registry
With Application

    'Ch08+
    'Ensure all menus are enabled
    EnableDisableMenus gsCONTEXT_ENABLE_ALL

    'Enable all the toolbars
    On Error Resume Next
    For Each cbCommandbar In .CommandBars
        cbCommandbar.Enabled = True
    Next
    On Error GoTo 0

    'Restore the Excel menus
    ResetCommandBars
    'Ch08-

    'Check that we have some settings to restore
    If GetSetting(gsREG_APP, gsREG_XL_ENV, "Stored", "No") = "Yes" Then

        .DisplayStatusBar = CBool(GetSetting(gsREG_APP, gsREG_XL_ENV, "DisplayStatusBar", CStr(.DisplayStatusBar)))
        .DisplayFormulaBar = CBool(GetSetting(gsREG_APP, gsREG_XL_ENV, "DisplayFormulaBar", CStr(.DisplayFormulaBar)))
        .IgnoreRemoteRequests = CBool(GetSetting(gsREG_APP, gsREG_XL_ENV, "IgnoreRemoteRequests", CStr(.IgnoreRemoteRequests)))
        .Calculation = CLng(GetSetting(gsREG_APP, gsREG_XL_ENV, "Calculation", CStr(.Calculation)))
        .Iteration = CBool(GetSetting(gsREG_APP, gsREG_XL_ENV, "Iteration", CStr(.Iteration)))
        .MaxIterations = CLng(GetSetting(gsREG_APP, gsREG_XL_ENV, "MaxIterations", CStr(.MaxIterations)))

        'Show the correct toolbars
        On Error Resume Next
        For Each vBarName In Split(GetSetting(gsREG_APP, gsREG_XL_ENV, "VisibleCommandBars"), ",")
            Application.CommandBars(vBarName).Visible = True
        Next
        On Error GoTo 0

        'Specific stuff for Excel 2000 and up
        If Val(.Version) &gt;= 9 Then
            .ShowWindowsInTaskbar = CBool(GetSetting(gsREG_APP, gsREG_XL_ENV, "ShowWindowsInTaskbar", CStr(.ShowWindowsInTaskbar)))
        End If

        'Specific stuff for Excel 2002 and up
        If Val(.Version) &gt;= 10 Then
            Set objTemp = .CommandBars
            objTemp.DisableAskAQuestionDropdown = CBool(GetSetting(gsREG_APP, gsREG_XL_ENV, "DisableAskAQuestion", CStr(objTemp.DisableAskAQuestionDropdown)))
            .AutoRecover.Enabled = CBool(GetSetting(gsREG_APP, gsREG_XL_ENV, "AutoRecover", CStr(.AutoRecover.Enabled)))
        End If
    End If

    'Reenable the shortcut keys we disabled
    If IsArray(gvaKeysToDisable) Then
        For Each vKey In gvaKeysToDisable
            .OnKey vKey
        Next
    End If
End With

'Unprotect the backdrop workbook, if it still exists
If WorkbookAlive(gwbkBackDrop) Then
    gwbkBackDrop.Unprotect
    gwbkBackDrop.Saved = True
End If

End Sub

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Comments: Configure the Excel workspace for our application ' ' Arguments: None ' ' Date Developer Chap Action ' -------------------------------------------------------------- ' 02 Jun 04 Stephen Bullen Ch06 Initial version ' 03 Jun 04 Stephen Bullen Ch08 Moved menu OnKey assignments to here ' Moved toolbar hiding to here ' 03 Jun 04 Stephen Bullen Ch09 Added call to SetIcon in new MAPIWrappers module

Sub ConfigureExcelEnvironment()

Dim objTemp As Object
Dim vKey As Variant
Dim cbCommandbar As CommandBar

With Application
    'Set the Application properties we want
    .Caption = gsAPP_TITLE
    .DisplayStatusBar = True
    .DisplayFormulaBar = False
    .Calculation = xlManual

    .DisplayAlerts = False
    .IgnoreRemoteRequests = True
    .DisplayAlerts = True

    .Iteration = True
    .MaxIterations = 100

    'Specific items for Excel 2000 and up
    If Val(.Version) &gt;= 9 Then
        .ShowWindowsInTaskbar = False
    End If

    'Specific items for Excel 2002 and up
    If Val(.Version) &gt;= 10 Then
        Set objTemp = .CommandBars
        objTemp.DisableAskAQuestionDropdown = True
        objTemp.DisableCustomize = True
        .AutoRecover.Enabled = False
    End If

    'We'll have slighly different environment states, depending on whether we're debugging or not
    If gbDEBUGMODE Then
        ' Since we have blitzed the environment, we should set a hot key combination to restore it.
        ' That key combination is Shift+Ctrl+R
        .OnKey "+^R", "RestoreExcelSettings"
    Else
        'Make sure the VBE isn't visible
        On Error Resume Next
        .VBE.MainWindow.Visible = False
        On Error GoTo 0

        'Disable a whole host of shortcut keys
        For Each vKey In gvaKeysToDisable
            .OnKey vKey, ""
        Next
    End If

    'Ch08+
    'Hide all the toolbars
    On Error Resume Next
    For Each cbCommandbar In Application.CommandBars
        cbCommandbar.Visible = False
        cbCommandbar.Enabled = False
    Next
    On Error GoTo 0

    'Set up keyboard equivalents for some key menu items

' .OnKey "^N", "MenuFileNew" ' .OnKey "^n", "MenuFileNew" ' .OnKey "^O", "MenuFileOpen" ' .OnKey "^o", "MenuFileOpen" End With

'Ch09
SetIcon ApphWnd, ThisWorkbook.Path &amp; "\" &amp; gsICON_FILE

End Sub

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Comments: Copies the backdrop workbook from the addin to a ' new workbook and configures it ' ' Arguments: None ' ' Date Developer Chap Action ' -------------------------------------------------------------- ' 02 Jun 04 Stephen Bullen Ch06 Initial version ' Sub PrepareBackDrop()

Dim wkbBook As Workbook

'Do we already have a backdrop object?
If Not WorkbookAlive(gwbkBackDrop) Then

    'See if there's already a backdrop workbook out there
    Set gwbkBackDrop = Nothing
    For Each wkbBook In Workbooks
        If wkbBook.BuiltinDocumentProperties("Title") = gsBACKDROP_TITLE Then
            Set gwbkBackDrop = wkbBook
            Exit For
        End If
    Next

    If gwbkBackDrop Is Nothing Then
        'Copy the backdrop sheet out of this workbook
        'into a new one for display
        wksBackdrop.Copy
        Set gwbkBackDrop = ActiveWorkbook
        gwbkBackDrop.BuiltinDocumentProperties("Title") = gsBACKDROP_TITLE
    End If
End If

With gwbkBackDrop
    .Activate

    'Select the full region that encompasses the backdrop
    'graphic, so we can use Zoom = True to size it to fit
    .Worksheets(1).Range("rgnBackDrop").Select

    'Set the Window View options to hide everything
    With .Windows(1)
        .WindowState = xlMaximized
        .Caption = ""
        .DisplayHorizontalScrollBar = False
        .DisplayVerticalScrollBar = False
        .DisplayHeadings = False
        .DisplayWorkbookTabs = False

        'Zoom the selected area to fit the screen
        .Zoom = True
    End With

    'Prevent selection or editing of any cells on the backdrop
    With .Worksheets(1)
        .Range("ptrCursor").Select
        .ScrollArea = .Range("ptrCursor").Address
        .EnableSelection = xlNoSelection
        .Protect DrawingObjects:=True, UserInterfaceOnly:=True
    End With

    'Protect the backdrop workbook, to remove the
    'control menu
    .Protect Windows:=True
    .Saved = True
End With

End Sub