阻止用户使用Excel内置排序功能

时间:2016-06-21 08:11:57

标签: excel excel-vba sorting built-in vba

我有一个功能(使用许多已经编写和运行的宏)的文档基本上作为日历的可视化表示,然后可以将其导出到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

3 个答案:

答案 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