我有一个功能(使用许多已经编写和运行的宏)的文档基本上作为日历的可视化表示,然后可以将其导出到powerpoint图形。由于执行此过程的方式,必须在每个数据行之间保留空行。我编写了自己的排序和过滤函数来保持这种状态,同时为用户提供适当的功能,现在正在处理文档安全性。
因此,我遇到的主要问题(虽然这可以更普遍地传播到所有工作表操作)是否可以限制用户使用excel中的默认排序函数(因为这会立即破坏数据)结构)?
为了澄清,该工作表已经具有保护和取消保护功能,但即使工作表未受保护,我也需要AllowSorting
属性保持为 。这可能吗?
编辑:
我试图解决这个问题,不是取消保护工作表,而是保护它们,除了AllowSorting和AllowFiltering属性之外,所有保护措施都“关闭”,在Locked和Unlocked配置中都保持为false。但是,这仍然允许我在工作表“解锁”时对数据进行排序
编辑2: 由于有必要进一步解释,我已经有了相应的保护和取消保护表的宏。我需要能够为具有正确密码的任何用户提供全部功能,除了排序,因为没有用户应该使用排序功能。我在下面显示(缩写)这些函数的代码:
Sub LockSheets()
For Each WS In ActiveWorkbook.Worksheets
WS.Protect Password:=MasterPass, _
DrawingObjects:=True, _
Contents:=True, _
Scenarios:=True, _
AllowFormattingCells:=False, _
AllowFormattingColumns:=False, _
AllowFormattingRows:=False, _
AllowInsertingColumns:=False, _
AllowInsertingRows:=False, _
AllowInsertingHyperlinks:=False, _
AllowDeletingColumns:=False, _
AllowDeletingRows:=False, _
AllowSorting:=False, _
AllowFiltering:=False, _
AllowUsingPivotTables:=False
Next WS
End Sub
Sub UnlockSheets()
For Each WS In ActiveWorkbook.Worksheets
WS.Protect Password:=MasterPass, _
DrawingObjects:=False, _
Contents:=False, _
Scenarios:=False, _
AllowFormattingCells:=True, _
AllowFormattingColumns:=True, _
AllowFormattingRows:=True, _
AllowInsertingColumns:=True, _
AllowInsertingRows:=True, _
AllowInsertingHyperlinks:=True, _
AllowDeletingColumns:=True, _
AllowDeletingRows:=True, _
AllowSorting:=False, _
AllowFiltering:=False, _
AllowUsingPivotTables:=False
Next WS
End Sub
答案 0 :(得分:1)
您的解锁代码中有两个问题已在原始帖子中发布。
Contents:=False
将覆盖保护工作表,这就是运行宏后工作表保持不受保护的原因。
AllowDelectingRows:=True
由于拼写错误,应该给出Compile error: Named argument not found.
:AllowDele**c**ting Rows
我不明白为什么它不在你的系统上。
以下是修改后的代码:
========================================
Option Explicit
Sub UnlockSheets()
Dim WS As Worksheet
For Each WS In ActiveWorkbook.Worksheets
WS.Protect Password:=MasterPass, _
DrawingObjects:=False, _
Contents:=True, _
Scenarios:=False, _
AllowFormattingCells:=True, _
AllowFormattingColumns:=True, _
AllowFormattingRows:=True, _
AllowInsertingColumns:=True, _
AllowInsertingRows:=True, _
AllowInsertingHyperlinks:=True, _
AllowDeletingColumns:=True, _
AllowDeletingRows:=True, _
AllowSorting:=False, _
AllowFiltering:=False, _
AllowUsingPivotTables:=False
Next WS
End Sub
========================================
答案 1 :(得分:0)
如果您只是希望在与他人共享的工作簿中发生意外滥用的工作安全性,那么这应该在Worksheet_Activate事件中起作用
Private Sub Worksheet_Activate()
Dim WhoCanSort As String
WhoCanSort = ThisWorkbook.WriteReservedBy
If WhoCanSort = "skkakkar" Then
ActiveSheet.Unprotect
Else:
ActiveSheet.Protect AllowSorting:=False
End If
End Sub
修改强> 保护工作表元素 默认情况下,当您保护工作表时,工作表上的所有单元格都被锁定,用户无法对锁定的单元格进行任何更改。例如,他们无法在锁定的单元格中插入,修改,删除或格式化数据。但是,您可以指定用户在保护工作表时可以更改的元素。 在保护工作表之前,您可以解锁希望用户能够更改或输入数据的范围。您可以为所有用户或特定用户解锁单元格。
Lock or unlock specific areas of a protected worksheet 我认为通过遵循此方法,您可以阻止用户使用任何命令对数据进行排序(数据选项卡,排序和过滤组)。用户无法对受保护工作表上包含锁定单元格的范围进行排序,无论此设置如何
答案 2 :(得分:0)
好的,这是。我把它放到了Workbook_open
- 事件中,我想,这是最好的地方。
Private Sub Workbook_open()
ActiveSheet.Protect _
AllowDeletingColumns:=True, _
AllowDeletingRows:=True, _
AllowFormattingCells:=True, _
AllowFormattingRows:=True, _
AllowFormattingColumns:=True, _
AllowInsertingHyperlinks:=True, _
AllowInsertingRows:=True, _
AllowUsingPivotTables:=True, _
AllowSorting:=False, _
AllowFiltering:=False
ActiveSheet.Protection.AllowEditRanges.Add _
Title:="yourtitle", _
Range:=Range("yourrange")
End Sub
这允许除排序之外的所有内容。所有其他属性都列在here
中