打开文档时,它表示要查看它,我必须启用受保护视图的编辑。
我希望在检测到它时关闭文档,直到删除该Excel配置为止。
此程序是否有任何小的VBA功能?
在变量对象运行时发生错误91,未设置块
main
整个ActiveWorbook代码
If Application.ProtectedViewWindows.Count > 0 Then
ActiveWorkbook.Close savechanges:=False
Application.Quit
Else
End If
答案 0 :(得分:0)
尝试这个。
希望有帮助
答案 1 :(得分:0)
受保护的视图是一项安全功能,它禁用宏和文件编辑。如果您可以在受保护的视图中运行VBA代码,那将是一个安全漏洞。因此,您不能在受保护的视图中运行任何代码。
作为解决方法,您可以添加工作表ProtectionInfo
并在类似的位置上写一些警告消息:“此工作簿需要在启用宏的情况下打开,并且没有受保护的视图!”
然后,您在Workbook_Open
中编写代码,如果打开了工作簿,该代码将隐藏工作表ProtectionInfo
。这意味着,如果启用了宏并且用户不在受保护的视图中,则他将看不到警告工作表。但是,如果宏被禁用或处于受保护的视图中,则用户将看到警告。
确保使工作表ProtectionInfo
在Workbook_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