确定受保护的视图选项在文档中是否处于活动状态

时间:2019-09-17 03:31:39

标签: excel vba protected

打开文档时,它表示要查看它,我必须启用受保护视图的编辑。

我希望在检测到它时关闭文档,直到删除该Excel配置为止。

enter image description here

此程序是否有任何小的VBA功能?

  

在变量对象运行时发生错误91,未设置块

main

整个ActiveWorbook代码

If Application.ProtectedViewWindows.Count > 0 Then
    ActiveWorkbook.Close savechanges:=False
    Application.Quit
Else
End If

3 个答案:

答案 0 :(得分:0)

尝试这个。

  1. 单击文件>选项。
  2. 单击“信任中心”>“信任中心设置”>“受保护的视图”。
  3. 取消选中“启用受保护的视图”以查找来自Internet的文件。

希望有帮助

答案 1 :(得分:0)

受保护的视图是一项安全功能,它禁用宏和文件编辑。如果您可以在受保护的视图中运行VBA代码,那将是一个安全漏洞。因此,您不能在受保护的视图中运行任何代码。

作为解决方法,您可以添加工作表ProtectionInfo并在类似的位置上写一些警告消息:“此工作簿需要在启用宏的情况下打开,并且没有受保护的视图!”

然后,您在Workbook_Open中编写代码,如果打开了工作簿,该代码将隐藏工作表ProtectionInfo。这意味着,如果启用了宏并且用户不在受保护的视图中,则他将看不到警告工作表。但是,如果宏被禁用或处于受保护的视图中,则用户将看到警告。

确保使工作表ProtectionInfoWorkbook_BeforeClose上可见,以便下次在禁用宏的情况下打开该工作表时再次显示该工作表。另外,您可能希望隐藏所有其他工作表,因此ProtectionInfo是禁用宏时显示的唯一工作表。

答案 2 :(得分:0)

就像@Pᴇʜ所说的那样,您只能通过隐藏所有工作表来解决此问题,除非其中一个工作表说必须禁用受保护的视图并在启用宏时取消隐藏工作表。但是您应该在Workbook_BeforeSave处执行此操作,因为有些人将其保存在中间,但是最后不保存,因此下次打开工作表时不会隐藏工作表。

由于我已经为宏设置了通知功能,因此我可以在这里共享它。 下面的代码将隐藏除“无宏”之外的所有工作表,在该消息中,我会显示一条消息,说明如何启用宏。 请注意,我添加了一个变量LastSheet,以便当有人保存文件时,它知道在再次取消隐藏所有工作表之后该文件会跳回何处

Dim LastSheet As String

Private Sub Workbook_AfterSave(ByVal Success As Boolean)
    Unhide_Worksheets
    ThisWorkbook.Saved = True
End Sub

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    LastSheet = ThisWorkbook.ActiveSheet.Name
    Hide_Worksheets
End Sub

Private Sub Workbook_Open()
    Unhide_Worksheets
End Sub

Private Sub Hide_Worksheets()
    'Application.ScreenUpdating = False
    ThisWorkbook.Worksheets("No Macros").Visible = xlSheetVisible
    ThisWorkbook.Worksheets("No Macros").Activate

    On Error Resume Next
    For Each Worksheet In ThisWorkbook.Worksheets
        If Worksheet.Name <> "No Macros" Then
            Worksheet.Visible = xlSheetVeryHidden
        End If
    Next Worksheet
    On Error GoTo 0
    'Application.ScreenUpdating = True
End Sub

Private Sub Unhide_Worksheets()
    'Application.ScreenUpdating = False        
    On Error Resume Next        
    For Each Worksheet In ThisWorkbook.Worksheets
        Worksheet.Visible = xlSheetVisible
    Next Worksheet
    On Error GoTo 0

    If LastSheet <> vbNullString Then
        ThisWorkbook.Worksheets(LastSheet).Activate
    End If
    ThisWorkbook.Worksheets("No Macros").Visible = xlSheetHidden
    'Application.ScreenUpdating = True
End Sub