【问题标题】:Determine if the protected view options are active within the document确定受保护的视图选项在文档中是否处于活动状态
【发布时间】:2020-01-17 21:19:25
【问题描述】:

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

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

是否有任何小型 VBA 函数可以执行此过程?

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

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

整个 ActiveWorbook 代码

Private Sub Workbook_Open()

    Dim hoja As Worksheet

    For Each hoja In ThisWorkbook.Worksheets
        hoja.Visible = xlSheetVisible
    Next hoja

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

    If Not VBATrusted() Then
        Application.Visible = False
        MsgBox "Aviso. Ya no puedes usar este archivo. Comunícate con el desarrollador Arq. Luis Eduardo Ramírez Aguayo entremuros.masterplan@hotmail.com Cel. +(52) 415.151.102"
        ActiveWorkbook.Close savechanges:=False
        Application.Quit
    End If

    Sheets("Hoja1").Visible = xlVeryHidden

    '----------------------------------------------------------------'

    Application.Visible = False

    UserForm1.Show

End Sub


Private Sub Workbook_BeforeClose(Cancel As Boolean)

    Dim hoja As Worksheet

    Sheets("Hoja1").Visible = xlSheetVisible

    For Each hoja In ThisWorkbook.Worksheets
        If hoja.Name <> "Hoja1" Then
            hoja.Visible = xlSheetVeryHidden
        End If
    Next hoja

    '----------------------------------------------------------------'

    Sheets("HojaEscondida").Range("A4") = "admin"
    Sheets("HojaEscondida").Range("A4") = "admin"

    Application.DisplayAlerts = False

End Sub


Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    If SaveAsUI Then
        MsgBox "NO SE PUEDE GUARDAR COMO." & Chr(10) _
          & "Guarde el original, usando el icono guardar," & Chr(10) _
          & "o simplemente use la x de cerrar, y se guardará" & Chr(10) _
          & "automáticamente en el lugar correcto", vbCritical
        Cancel = True
    End If

End Sub


Function VBATrusted() As Boolean
    On Error Resume Next
    VBATrusted = (Application.VBE.VBProjects.Count) > 0
End Function

【问题讨论】:

    标签: excel vba protected


    【解决方案1】:

    试试这个。

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

    希望对你有帮助

    【讨论】:

    • 想法是通过VBA来实现
    • @EduardoGonzalez Protected View 是一项安全功能,可禁用宏和文件编辑。如果您可以在受保护的视图中运行 VBA 代码,这将是一个安全漏洞。因此,您不能在受保护的视图中运行任何代码。
    • 无论如何,您提到此 excel 文件来自您的电子邮件。根据您的版本,您可以只启用来自 Outlook 的 excel 文件。
    • @DavidGarcíaBodego 你是对的,但我认为他将文件发送给其他人(“我正在通过邮件发送文件”)所以收到邮件的人需要启用它(希望受到公司集团政策的限制)。
    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

      正如@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
      

      【讨论】:

        猜你喜欢
        • 2011-10-22
        • 1970-01-01
        • 2015-04-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-17
        • 1970-01-01
        • 2016-08-29
        相关资源
        最近更新 更多