强制Excel用户启用宏

时间:2015-08-03 17:48:33

标签: excel excel-vba excel-2010 excel-2013 vba

如果用户没有启用宏

,是否有办法阻止Excel工作簿打开

3 个答案:

答案 0 :(得分:4)

执行此操作的标准方法是强制用户使用启动画面启用宏。

也可以通过写入注册表来修改VBA设置(例如使用VBS - 虽然在公司设置中GPO可能会阻止此操作)。有关访问注册表的示例,请参阅http://blogs.msdn.com/b/cristib/archive/2012/02/29/vba-programmatically-enable-access-to-the-vba-object-model-using-macros.aspx

启动画面方式

  • 制作工作簿中除闪屏之外的所有工作表 非常隐藏(只能通过VBA或VBA编辑器进行更改)
  • 如果启用了宏:
    1)当工作簿打开时,代码会取消隐藏所有这些非常隐藏的表单 2)当工作簿关闭时,所有这些工作表再次非常隐藏
  • 如果未启用宏,则用户只能看到启动画面说“请启用宏,关闭然后重新打开此文件”

下面列出了两种具有此技术完整代码的链接

  1. 来自here at TekTips
  2. 的Brad Yundt

    代码进入ThisWorkbook模块

    Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Dim ws As Worksheet, wsSplash As Worksheet
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Set wsSplash = Worksheets("Splash screen")
    wsSplash.Visible = xlSheetVisible
    For Each ws In ThisWorkbook.Worksheets
       If ws.Name <> "Splash screen" Then ws.Visible = xlSheetVeryHidden
    Next ws
    Cancel = True
    ThisWorkbook.Save
    For Each ws In ThisWorkbook.Worksheets
       If ws.Name <> "Splash screen" Then ws.Visible = xlSheetVisible
    Next ws
    wsSplash.Visible = xlSheetVeryHidden
    Application.EnableEvents = True
    Application.ScreenUpdating = True
    End Sub
    
    Private Sub Workbook_Open()
    Dim ws As Worksheet, wsSplash As Worksheet
    Dim Pswd As String
    Pswd="myPassword"
    Application.ScreenUpdating = False
    Set wsSplash = Worksheets("Splash screen")
    wsSplash.Visible = xlSheetVisible
    For Each ws In ThisWorkbook.Worksheets
       If ws.Name <> "Splash screen" Then 
           If ws.Name="Sheet1" Then
               If InputBox("Please enter your password")=Pswd Then ws.Visible=xlSheetVisible
           Else
               ws.Visible = xlSheetVisible
           End If
       End If
    Next ws
    wsSplash.Visible = xlSheetVeryHidden
    Application.ScreenUpdating = True
    End Sub
    
    1. Jonske at VBAeXpress
    2. 代码进入ThisWorkbook模块

      Option Explicit 
      
      Private Sub Workbook_Open() 
      
          With Application 
               'disable the ESC key
              .EnableCancelKey = xlDisabled 
              .ScreenUpdating = False 
      
              Call UnhideSheets 
      
              .ScreenUpdating = True 
               're-enable ESC key
              .EnableCancelKey = xlInterrupt 
          End With 
      
      End Sub 
       '
      Private Sub UnhideSheets() 
           '
          Dim Sheet As Object 
           '
          For Each Sheet In Sheets 
              If Not Sheet.Name = "Prompt" Then 
                  Sheet.Visible = xlSheetVisible 
              End If 
          Next 
           '
          Sheets("Prompt").Visible = xlSheetVeryHidden 
           '
          Application.Goto Worksheets(1).[A1], True '< Optional
           '
          Set Sheet = Nothing 
          ActiveWorkbook.Saved = True 
      
      End Sub 
      
      Private Sub Workbook_BeforeClose(Cancel As Boolean) 
          With Application 
              .EnableCancelKey = xlDisabled 
              .ScreenUpdating = False 
      
              Call HideSheets 
      
              .ScreenUpdating = True 
              .EnableCancelKey = xlInterrupt 
          End With 
      End Sub 
      
      Private Sub HideSheets() 
           '
          Dim Sheet As Object '< Includes worksheets and chartsheets
           '
          With Sheets("Prompt") 
               '
               'the hiding of the sheets constitutes a change that generates
               'an automatic "Save?" prompt, so IF the book has already
               'been saved prior to this point, the next line and the lines
               'relating to .[A100] below bypass the "Save?" dialog...
              If ThisWorkbook.Saved = True Then .[A100] = "Saved" 
               '
              .Visible = xlSheetVisible 
               '
              For Each Sheet In Sheets 
                  If Not Sheet.Name = "Prompt" Then 
                      Sheet.Visible = xlSheetVeryHidden 
                  End If 
              Next 
               '
              If .[A100] = "Saved" Then 
                  .[A100].ClearContents 
                  ThisWorkbook.Save 
              End If 
               '
              Set Sheet = Nothing 
          End With 
           '
      End Sub 
      

答案 1 :(得分:0)

使用以下vb脚本强制为我自动启用宏。希望对别人有帮助

Set objExcel = CreateObject("Excel.Application")
objExcel.Application.Visible = True

Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.SendKeys "%{F11}"
WshShell.SendKeys "% n"

Set objWorkbook = objExcel.Workbooks.Open("C:\Macro File.xlsm")

答案 2 :(得分:0)

您可以使用密码保护电子表格。

可以在“审阅/保护工作簿”中找到。

当用户尝试打开电子表格时,将提示他们输入密码。如果他们不知道,则无法打开它。

这种方法不需要VBA(也不需要宏)。