昨天,一位朋友问我:能不能在EXCEL中实现到期后自动销毁该文件功能?说实话,这项功能以前听说过,只是没有实际应用场景,所以也就就没有亲手去实践。今天正好自己也学习一下,于是在百度上搜索,借鉴前人分享的经验,实现了上面的功能,现记录如下:
思路——
1、使用VBA实现上述功能,那么excel文件就必须强制启用宏,因为不启用,功能就无从实现。
2、如果不启用宏,那么就深度隐藏重要工作表,用户无法通过菜单将取消隐藏的工作表。
3、设置使用限期,到期后自动销毁文件。
详细代码:

Option Explicit
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Dim sh As Worksheet '定义sh为工作表变量
    Sheet1.Visible = True   'sheet1为可视,即提醒表为可视状态
    For Each sh In Me.Worksheets    '遍历工作簿中的所有表
        If UCase(sh.Name) <> "SHEET1" Then sh.Visible = xlSheetVeryHidden    '如果遍历到的工作表名为SHEET1(此处转为大写),则将其深度隐藏。
    Next sh '跳到下一工作表
    Me.Save '保存工作簿
End Sub

Private Sub Workbook_Open()'定义过程,在工作簿打开时执行,使用函数 DateDiff进行日期判断,如果超过所设期限,则执行过程KillThisWorkbook销毁文件

    If DateDiff("d", DateSerial(9999, 11, 21), Date) >= 30 Then
        MsgBox "此文件试用期限为30天,目前您的使用期限已到,请联系开发者!", 48, "温馨提醒您:"
        Call KillThisWorkbook
    Else'如果在期限内,则显示除sheet1外的所有工作表

        Dim sh As Worksheet
        For Each sh In Me.Worksheets
            If UCase(sh.Name) <> "SHEET1" Then sh.Visible = True
        Next sh
        Sheet1.Visible = xlSheetVeryHidden
End If

End Sub


Sub KillThisWorkbook()'定义销毁文件过程  
    Application.DisplayAlerts = False
    With ThisWorkbook
        .Saved = True
        .ChangeFileAccess xlReadOnly
        Kill .FullName
        .Close
    End With
    Application.DisplayAlerts = True
End Sub

未启用宏之前的提示
VBA界面
到期提醒
当然,我们还需要对工作簿进行加密才行,这里就不再细述了。有了上面的代码并不是就万事无忧了,因为通过VBA,保护密码也是可以去掉的。
Sheet1.Visible有三个属性,xlSheetVisible是显示,xlSheetHidden是隐藏,xlSheetVeryHidden也是隐藏,和xlSheetHidden的区别是用xlSheetVeryHidden隐藏的只能在VBA里打开,从菜单里都不能取消隐藏了。
在Sub Workbook_BeforeClose(Cancel As Boolean)里如果ThisWorkbook.Save,则关闭工作簿时自动保存,不会再弹出对话框提示是否保存了;如果设置了cancel=true,哈哈,关不了EXCEL了。

发表评论