代码之家  ›  专栏  ›  技术社区  ›  Andreas

Excel只有在启用了VBA时才可以保存文件,可以吗?

  •  0
  • Andreas  · 技术社区  · 6 年前

    我有一个三级权限的文件。
    系统会提示您在用户窗体上输入密码,您可以获得管理员权限、读/写权限或只读权限。
    除非不启用宏,否则这样做很好。

    如果不启用提示用户窗体的宏,则不会显示该宏,并且不会设置权限,因此您具有完全访问权限。

    我已经看到你可以使用闪屏,但要使其正常工作,你需要尽我所能保存工作簿?
    它们的基本概念是在关闭隐藏工作表和取消隐藏初始屏幕之前,然后保存工作簿。 但是,如果用户犯了错误,那么在不保存的情况下关闭并稍后重新打开又会怎样呢?文件关闭,所有工作表都可见?

    所以我想也许我可以使用“explorer->右键单击->属性->只读”属性作为额外的保护层?

    我发现了这些功能。

    ActiveWorkbook.ChangeFileAccess Mode:=xlreadonly
    ActiveWorkbook.ChangeFileAccess Mode:=xlreadwrite 
    

    但我尝试了只读行,它设置为只读,无法保存文件。
    然后我不保存就关闭了工作簿,然后再次打开。但该属性似乎没有在文件的属性中设置,因为它没有被勾选,当我打开文件时,我可以保存它。

    还有其他方法可以解决这个问题吗?
    我想对用户“强制”VBA,或者确保他/她在没有VBA的情况下打开文件时无法保存该文件。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Chronocidal    6 年前

    这是一个 远的 比…更复杂的方法 Adreas' 但并不具有同样的风险,轻度的技术娴熟的用户只需右键单击文件并弹出到“属性”面板。

    创建两个新工作表。其中一个设置为 xlVeryHidden -下面的例子我称之为 hsSheetStatus . 另一个,有一个很好的大通知告诉你 倒霉的奴才 同事启用宏时,将更改可见性。我叫这个 hsEnableNotice .

    然后我有一个宏要显示 启用通知 隐藏所有其他工作表(将其可见性和活动工作表存储在 hs工作表状态 )和第二个要执行反向操作的宏(从中恢复可见性/活动表) hs工作表状态 )然后让它们继续运行 Workbook_BeforeSave , Workbook_AfterSave Workbook_Open :

    Option Explicit
    
    Private Sub Workbook_AfterSave(ByVal Success As Boolean)
        UnlockAndShow
    End Sub
    
    Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
        LockAndHide
    End Sub
    
    Private Sub Workbook_Open()
        UnlockAndShow
    End Sub
    
    Private Sub LockAndHide()
        Dim lSheet As Long, ActiveName As String
        Application.ScreenUpdating = False
        Application.EnableEvents = False
        ActiveName = ThisWorkbook.ActiveSheet.Name
        hsEnableNotice.Visible = xlSheetVisible
        hsEnableNotice.Activate
    
        hsSheetStatus.Range(hsSheetStatus.Cells(1, 1), hsSheetStatus.Cells(hsSheetStatus.Rows.Count, 1)).EntireRow.Delete
    
        For lSheet = 1 To ThisWorkbook.Sheets.Count 'By using Sheets instead of Worksheets, we include Charts etc
            hsSheetStatus.Cells(lSheet, 1).Value = ThisWorkbook.Sheets(lSheet).Name
            hsSheetStatus.Cells(lSheet, 2).Value = ThisWorkbook.Sheets(lSheet).Visible
            If ThisWorkbook.Sheets(lSheet).Name = ActiveName Then hsSheetStatus.Cells(lSheet, 3).Value = 1
            If ThisWorkbook.Sheets(lSheet).Name <> hsEnableNotice.Name Then ThisWorkbook.Sheets(lSheet).Visible = xlSheetVeryHidden
        Next lSheet
    
        ThisWorkbook.Protect Password:="ThisIsMyPassword.ThereAreManyLikeIt,ButThisOneIsMine.", Structure:=True, Windows:=False
        Application.EnableEvents = True
    End Sub
    
    Private Sub UnlockAndShow()
        Dim WasSaved As Boolean, lSheet As Long, lMax As Long
        WasSaved = ThisWorkbook.Saved
        Application.ScreenUpdating = False
        Application.EnableEvents = False
    
        lMax = hsSheetStatus.Cells(hsSheetStatus.Rows.Count, 1).End(xlUp).Row
    
        ThisWorkbook.Unprotect Password:="ThisIsMyPassword.ThereAreManyLikeIt,ButThisOneIsMine."
        For lSheet = 1 To lMax
            ThisWorkbook.Sheets(hsSheetStatus.Cells(lSheet, 1).Value).Visible = hsSheetStatus.Cells(lSheet, 2).Value
            If hsSheetStatus.Cells(lSheet, 3).Value = 1 Then ThisWorkbook.Sheets(hsSheetStatus.Cells(lSheet, 1).Value).Activate
        Next lSheet
    
        hsSheetStatus.Visible = xlSheetVeryHidden
        hsEnableNotice.Visible = xlSheetVeryHidden
    
        Application.EnableEvents = True
        Application.ScreenUpdating = True
        ThisWorkbook.Saved = WasSaved
    End Sub
    
        2
  •  2
  •   Andreas    6 年前

    我找到了一个可行的解决方案。

    你可以进来 Workbook_BeforeClose 使用此行可使文件属性中的文件为只读。

    SetAttr Application.ActiveWorkbook.FullName, vbReadonly
    

    这将在属性中设置勾号,Excel将注意到文件是写保护的。

    然后在 Workbook_Open() (或者就我而言,权利已经确立)

    SetAttr Application.ActiveWorkbook.FullName, vbReadwrite
    ActiveWorkbook.ChangeFileAccess Mode:=xlReadWrite
    

    第一行删除了文件属性中的勾号,但Excel仍然“记住”文件为只读。
    第二行将告诉Excel使其读写,文件再次正常工作。