百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

EXCEL如何强制用户在工作簿中启用宏?

haoteby 2024-12-03 15:17 5 浏览

有朋友问:如果用户工作簿禁用了宏,怎样对特定工作表进行隐藏,让用户无法查看?只有当宏被打开时显示其他工作表?

下表是当用户禁用工作簿宏时,隐藏其他工作表的同时显示提示:

要实现这样的功能,我们可以通过实现Workbook_Open、Workbook_BeforeClose、Workbook_BeforeSave等事件处理程序,我们可以控制工作簿在打开、关闭和保存时的行为。例如,在打开工作簿时自动显示所有工作表,并在关闭前检查是否需要保存更改;通过拦截标准的保存操作,我们可以调用自定义的保存函数CustomSave,该函数允许用户选择保存位置、格式,并在保存前隐藏所有非警告工作表,以避免不必要的干扰或数据泄露。同时,将介绍如何编写HideAllSheets和ShowAllSheets子程序来智能管理工作表的可见性。这些子程序将帮助用户隐藏除警告工作表外的所有工作表,并在需要时重新显示它们,从而保护敏感数据或简化工作簿的视图。代码片段如下:

' 强制显式声明变量
Option Explicit
' 将警告工作表的名称分配给一个常量
Const Warning As String = "提示"
' 工作簿打开时自动执行的宏
Private Sub Workbook_Open()
    ' 关闭屏幕更新
    Application.ScreenUpdating = False
    ' 调用显示所有工作表的例程
    Call ShowAllSheets
    ' 将工作簿的已保存属性设置为True
    Me.Saved = True
    ' 打开屏幕更新
    Application.ScreenUpdating = True
End Sub
' 工作簿关闭前执行的宏
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    ' 声明变量
    Dim Ans As Integer
    ' 如果工作簿的已保存属性为False,则模拟Excel的默认保存提示
    If Me.Saved = False Then
        Do
            Ans = MsgBox("你想保存对 '" & Me.Name & "' 的更改吗?", vbQuestion + vbYesNoCancel)
            Select Case Ans
                Case vbYes
                    ' 调用自定义保存例程
                    Call CustomSave
                Case vbNo
                    Me.Saved = True
                Case vbCancel
                    Cancel = True
                    Exit Sub
            End Select
        Loop Until Me.Saved
    End If
End Sub
' 工作簿保存前执行的宏
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    ' 取消常规保存
    Cancel = True
    ' 调用自定义保存例程
    Call CustomSave(SaveAsUI)
End Sub
' 自定义保存例程
Private Sub CustomSave(Optional SaveAs As Boolean)
    ' 声明变量
    Dim ActiveSht As Object
    Dim FileFormat As Variant
    Dim FileName As String
    Dim FileFilter As String
    Dim FilterIndex As Integer
    Dim Msg As String
    Dim Ans As Integer
    Dim OrigSaved As Boolean
    Dim WorkbookSaved As Boolean
    ' 关闭屏幕更新
    Application.ScreenUpdating = False
    ' 关闭事件,防止在保存时再次触发BeforeSave事件
    Application.EnableEvents = False
    ' 将工作簿的已保存属性保存到变量
    OrigSaved = Me.Saved
    ' 获取当前活动的工作表
    Set ActiveSht = ActiveSheet
    ' 调用隐藏所有工作表(除了提示工作表)的例程
    Call HideAllSheets
    ' 根据是否需要另存为或路径为空,处理保存逻辑
    ' ...(此处省略了部分逻辑以保持注释简洁)
     '...
    ' 调用显示所有工作表的例程
    Call ShowAllSheets
    ' 激活之前的活动工作表
    ActiveSht.Activate
    ' 根据是否成功保存,更新工作簿的已保存属性
    If WorkbookSaved Then
        Me.Saved = True
    Else
        Me.Saved = OrigSaved
    End If
    ' 打开屏幕更新
    Application.ScreenUpdating = True
    ' 打开事件
    Application.EnableEvents = True
End Sub
Private Sub HideAllSheets()
    Dim Sh As Object
    Sheets("提示").Visible = xlSheetVisible
    For Each Sh In Sheets
        If Sh.Name <> Warning Then
            Sh.Visible = xlSheetVeryHidden
        End If
    Next Sh
    
End Sub

Private Sub ShowAllSheets()
    Dim Sh As Object
    For Each Sh In Sheets
        If Sh.Name <> Warning Then
            Sh.Visible = xlSheetVisible
        End If
    Next Sh
    Sheets("提示").Visible = xlSheetVeryHidden
End Sub

Private Function IsLegalFilename(ByVal fname As String) As Boolean
    Dim BadChars As Variant
    Dim i As Long
    If Len(fname) > 218 Then
        IsLegalFilename = False
        Exit Function
    Else
        BadChars = Array("\", "/", "<", ">", "?", "[", "]", ":", "|", "*", """")
        fname = GetFileName(fname)
        For i = LBound(BadChars) To UBound(BadChars)
            If InStr(1, fname, BadChars(i)) > 0 Then
                IsLegalFilename = False
                Exit Function
            End If
        Next i
    End If
    IsLegalFilename = True
End Function

Private Function GetFileName(ByVal FullName As String) As String
    Dim i As Long
    For i = Len(FullName) To 1 Step -1
        If Mid(FullName, i, 1) = Application.PathSeparator Then Exit For
    Next i
    GetFileName = Mid(FullName, i + 1)
End Function

通过本篇文章,读者将学习到如何通过VBA编程来扩展Excel的功能,使其更加符合个人或团队的特定需求。

相关推荐

Python爬虫进阶教程(二):线程、协程

简介线程线程也叫轻量级进程,它是一个基本的CPU执行单元,也是程序执行过程中的最小单元,由线程ID、程序计数器、寄存器集合和堆栈共同组成。线程的引入减小了程序并发执行时的开销,提高了操作系统的并发性能...

A320-V2500发动机系统FADEC介绍(2)

目的全权数字发动机控制(FADEC)系统在所有飞行和运行阶段提供全范围发动机控制。...

三国志战棋版:玩家“二叔”用这套群DOT在比武中拿下31胜5负

声明:本文首发于今日头条,而后发布于“鼎叔闯三棋”的微信公众号、抖音、哔哩哔哩和小红书平台,如果在其他平台就是抄袭。...

真正的独一无二:Dot One 推出 DNA 定制系列 139英镑起

相信很多人在挑选衣物时有着这样的困扰,综合了性价比、面料等因素后好不容易找到了心仪的款式,还要担心是否会撞衫,不管是擦肩而过的陌生人还是身边的熟人,都令人尴尬。小部分人为此热衷于购买少量的古着或者限量...

崩铁:周年庆福利再升级,老角色加强时间确定,3.xdot体系反转

#埃安UT大一圈高级很多#...

Dotgo推出RBMHub,扩大了CPaaS提供商的覆盖范围和功能

据telecompaper网7月15日报道,用于商业消息传递的RichCommunicationServices(RCS)解决方案的领先提供商Dotgo宣布推出RBMHub。RBMHub的推出扩大了C...

深度解析:快照取消Dot职业的将何去何从

写在前面曾几何时,术士的出现便被冠以dot大师的名头,从远古时期的献祭腐蚀虹吸不如暗牧一个痛,到TBC上满dot=荣誉击杀+1,到wlk接近全暴击的冰晶腐蚀,再到CTM就算了吧MOP的各种变态吸x放...

星穹铁道:抽卡芙卡之前,你必须了解什么是dot!

卡妈终于上线了,可还是有很多人不明白什么是dot伤害,抽了卡妈直接玩起了直伤流,把一个持续伤害的引爆器玩成了打手,卡妈打dot伤害是远高于直伤的,有了卡妈的玩家一直了解dot,不然这卡妈就真被玩成四不...

游戏界的闪耀星辰陨落:悼念知名游戏博主″dotα牛娃″

无尽哀思!在数字时代浪潮中,游戏不仅是消遣娱乐的代名词,更是连接心灵的桥梁,构筑了无数人的青春回忆。在这片浩瀚无垠的游戏宇宙中,有这样一位博主,他以独特的风采、深邃的洞察力和无尽的热情,成为了玩家心中...

直击2017新加坡同性恋聚会Pink Dot,自由爱!

今年的“粉红点”又来啦~这个支持LGBT群体(男女同志、双性恋、跨性别等)群体的活动,从2009年起,已经在新加坡举办8年了!”这个非营利的同性恋权益活动,主要是希望大家了解到,不管一个人的性倾向或...

python-dotenv,一款超级实用处理环境变量python库

python-dotenv,一款超级实用处理环境变量python库python-dotenv概述:...

亚马逊语音助手毫无征兆发笑 诡异至极吓坏用户

来源:新华网美国电商亚马逊7日承诺,将更改名下“亚历克萨”语音系统设置,令它不会莫名发笑,免得吓坏用户。“亚历克萨”是亚马逊开发的语音助手软件,可服从用户语音指令完成对话、播放音乐等任务。依照原来设计...

2022最火英文网名男女生

精选好听英文昵称带翻译1.moveon(离开)2.Monster(怪物)3.Solo吉他手4.Finish.(散场)...

智能家具 RecycleDot 的出现给传统家具厂商带来新的挑战

从可穿戴手环、手表到智能衣服,智能硬件逐步渗透到每一个领域。最近有一对父子MikeSandru和JohnSandru在自家的车库中设计了一款智能家具RecycleDot,给日渐萧条的家具行...

欧洲通信卫星公司 OneWeb 敦促印度DoT尽早批准提供卫星宽带服务

据telecomtalk2月17日报道,欧洲通信卫星公司EutelsatOneWeb近日敦促印度电信部(DoT)尽快批准其在印度部署双地球站网关的计划,以便连接其近地轨道(LEO)全球卫星星座,并...