Excel 借助 VBA 实现基于日期的动态密码

September 6, 2019 · IT技术向 · 1442次阅读

刚进大学的时候,出于方便考虑,我做了一个汇总版本的个人信息表,后来也一直是我在更新维护。

这些信息很重要,稍有不慎、泄露出去,必将造成严重的后果。

但是最初汇总的时候,我并没有有考虑那么多。加上自己的谨慎保管,安全性还算可以保证。

然而,后来这个文件需要共享给其余8个班委,这个风险自然就翻番了……

怎么办呢?正常人应该都会想到——当然是加密啊!

没错,起初我也是这么干的,可后来一次无意间,我发现有人嫌麻烦、直接将我设置好的密码存在了文件名当中……

这样一来,密码不就形同虚设了吗?
啊(熊)

不行不行,千万不能让这种事情发生!

正所谓需求就是生产力,看来我只能使出绝招了——动态密码(授权)

方法

方法很简单,就是调用 Excel 自带的 VBA 简易编程功能。

启用宏

以最新版 Office 365 为例,新建并保存一个格式为.xlsm(启用宏的工作簿)的 Excel 文档。

在 Excel 选项中找到信任中心,打开信任中心设置,然后选找到宏设置

由于不确定我们需要的 VBA 代码是否可以在有数字签名的状态下无障碍运行,为了保证制作过程不受限制,此处我们选择启用所有宏
Excel启用宏.png

设置工作簿

这里需要两个工作簿,一个是咱们的信息表(名字随意),另一个是空白的,工作簿的名字必须是系统已锁定,具体用途后面会介绍。

当然如果你想让锁定看起来更高大上一些,也可以在空白的工作簿里写点东西,比如像我这样:
Excel锁定页.png

是不是看起来很牛逼装逼的样子?
熊猫捂脸偷看

添加 VBA 代码

按下ALT+F11打开 VBA 工程区,选中左侧的ThisWorkbook,然后填入以下代码:

Private Sub hideAllSheets()
    Dim wSheet As Worksheet
    
    '将所有工作表设置为完全隐藏,只能用VBA恢复
    For Each wSheet In Worksheets
        If wSheet.Name <> "系统已锁定" Then wSheet.Visible = xlSheetVeryHidden
    Next wSheet
    
End Sub

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Call hideAllSheets
End Sub

Private Sub Workbook_Open()

    Dim wSheet As Worksheet, pwd As String, s As String
    '禁用Ctrl+Pause键,以免用户强制中断VBA程序的运行
    Application.EnableCancelKey = xlDisabled
    
    '为防止上次打开该文件时禁用宏,以致工作表未隐藏,每次打开时都执行一遍隐藏操作
    Call hideAllSheets
    
    '生成密码,即基于当日日期的变体
    pwd = "ABCabc" & Month(Now()) * 20 + Day(Now()) * 19
    
    '循环要求用户输入密码,直到相符为止
    s = ""
    Do While s <> pwd
        s = InputBox("请输入密码:", "系统登录", vbOK)
    Loop
    
    '将所有工作表取消隐藏,设置为可见
    For Each wSheet In Worksheets
        wSheet.Visible = xlSheetVisible
    Next wSheet
    
    '恢复Ctrl+Pause键
    Application.EnableCancelKey = xlenabled

End Sub

此处的密码算法是"ABCabc" & Month(Now()) * 20 + Day(Now()) * 19,其中:

  • 引号括起来的是常量,保持不变
  • &表示直接连接
  • +表示进行加法运算

所以密码就是ABCabc月份*20+日期*19连接起来的一串字符。

以2019年9月6日为例,就是ABCabc294

当然,你也可以使用Year()等函数得到更加强大的密码算法,可以自己探索一下。


最后我们保存并关闭文件,再打开的时候,就会出现密码输入的提示框了,就像这样
Excel密码输入框.png

这样一来,只要保证密码算法无人知晓,就可以实现类似于“动态授权”的密码方式了。

不足之处

不过其实这样还是存在不足的:

  1. 一旦用户禁用 VBA 代码,密码还是形同虚设。所以那个“系统已锁定”的工作簿就派上用场了——用于覆盖掉敏感信息,防止用户禁用 VBA 后直接泄露所有信息;
  2. .xlsm这样的格式似乎只在电脑上能够得到支持,会造成使用不便;
  3. WPS 也有可能打不开带有 VBA 的工作簿(未实测)。

后记

在文件共享出去之前,我还是犹豫许久,并换回了普通的加密方式。

一来,是因为上面提到的不足;

另外就是,这个逼装得也太大了吧!
装逼被打

参考资料

  1. 杨洋的回答:如何给Excel设置动态登陆密码? https://www.zhihu.com/question/58289403/answer/156731104

来杯咖啡吧!

Excel

最后编辑于2个月前

添加新评论