防止用户使用Excel内置的排序函数
我有一个文档,它的功能(使用许多已经编写和运行的宏)基本上是作为日历的视觉表示,然后可以导出为powerpoint图形。由于执行此过程的方式,必须在每个数据行之间保留空行。我编写了自己的排序和筛选函数来保留这种情况,同时为用户提供适当的功能,现在正在研究文档安全性 因此,我的主要问题(尽管这可以更普遍地扩展到所有工作表操作)是是否可以限制用户使用excel中的默认排序函数(因为这会立即破坏数据结构) 为了澄清,工作表已经具有保护和取消保护功能,但我需要防止用户使用Excel内置的排序函数,excel,sorting,built-in,vba,Excel,Sorting,Built In,Vba,我有一个文档,它的功能(使用许多已经编写和运行的宏)基本上是作为日历的视觉表示,然后可以导出为powerpoint图形。由于执行此过程的方式,必须在每个数据行之间保留空行。我编写了自己的排序和筛选函数来保留这种情况,同时为用户提供适当的功能,现在正在研究文档安全性 因此,我的主要问题(尽管这可以更普遍地扩展到所有工作表操作)是是否可以限制用户使用excel中的默认排序函数(因为这会立即破坏数据结构) 为了澄清,工作表已经具有保护和取消保护功能,但我需要AllowSorting属性在工作表未受保护
AllowSorting
属性在工作表未受保护时保持为false。这可能吗
编辑:我试图通过不解除对工作表的保护来解决此问题,而是使用除AllowSorting和AllowFiltering属性之外的所有“关闭”保护工作表,这两个属性在锁定和解锁配置中均为false。然而,这仍然允许我在工作表“解锁”时对数据进行排序 编辑2: 由于进一步的解释似乎是必要的,我已经有了相应的宏来保护和取消保护工作表。我需要能够为任何拥有正确密码的用户提供完整的功能,但排序除外,因为任何用户都不应该使用排序功能。我的这些函数代码如下所示(缩写):
如果您只是想为与其他人共享的工作簿中发生的意外误用提供工作安全性,则应在工作表\u激活事件中使用
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
编辑
保护工作表元素
默认情况下,保护工作表时,工作表上的所有单元格都会被锁定,用户无法对锁定的单元格进行任何更改。例如,它们不能在锁定的单元格中插入、修改、删除或格式化数据。但是,您可以指定在保护工作表时用户可以更改的元素。
在保护工作表之前,可以解锁希望用户能够更改或输入数据的范围。可以为所有用户或特定用户解锁单元格
我认为,通过使用此方法,您可以防止用户使用任何命令对数据进行排序(数据选项卡、排序和筛选组)。无论此设置如何,用户都无法对受保护工作表上包含锁定单元格的区域进行排序。好的,这里是。我把它放在
工作簿\u 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
这允许一切,除了排序。列出了所有其他属性原始帖子中发布的解锁代码中有两个问题
Contents:=False
将覆盖对工作表的保护,这也是运行宏后工作表仍不受保护的原因
AllowDelectingRows:=True
本应给出一个编译错误:找不到命名参数。
由于键入错误: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
===========================================这就是您不希望用户使用或阻止他们更改工作表中任何内容的排序功能吗?@Tom特别提到了排序功能,尽管我只是出于好奇,想知道如何禁用任何特定的内置功能。我内置了温和的安全机制,以确保只有拥有密码的用户(表明他们接受过文档使用培训)才能执行任何编辑过程,但是我想避免有人在文档可编辑时意外使用排序功能。您可能想看看这个:或者这个,要禁用所有更改,您可以通过右键单击工作表并选中“保护工作表…”来“保护”工作表。@Tom这些选项都不能满足我的需要。我内置了一些功能来保护工作表不受未经培训的用户的影响,但是需要对必须编辑文档的用户进行完全控制,因此工作表不受保护。这两个链接对我没有帮助,因为它们只检测数据是否已经被过滤/排序,在我的例子中,这已经太晚了,已经破坏了数据集。不过还是谢谢你。希望另一个答案会随之而来,但仍然不能解决我的问题,而是离它更近了。本质上,我需要
允许排序
即使在工作表未受保护时也保持为false。这可能吗?可能是我翻转了功能,而不是“取消保护”工作表(即保持工作表受保护,但删除除排序功能外的所有受保护方面?)我不知道这是否可行,但也许您可以将所有这些属性设置为真,将AllowEditRanges设置为数据的范围,并将AllowSorting设置为False@汤姆:如果你觉得你的答案完全符合OP的要求,你可以发布你的答案。我将给予它应有的信任。你也必须将AllowFiltering设置为False。请看我的答案。不幸的是(正如在我的原始帖子的编辑中所解释的),这不起作用,仍然允许排序。我真的不知道为什么这对我来说确实有效。我编辑了这篇文章,也许你遗漏了什么?我肯定我什么也没遗漏。我已经自己编写了代码并尝试了。当这不起作用时,我复制粘贴了你的,但它仍然不能阻止排序。它是否会抛出任何错误,或者只是不起作用?还有:你使用什么版本的Excel?没有错误,只是仍然允许排序。我目瞪口呆,因为所有的东西都指向那个解决方案是正确的(如此之多以至于我自己在测试它之前把它作为一个答案贴出来,然后在它不起作用时删除了这个答案)是的,很抱歉这个打字错误。我在代码中更正了它,然后忘记了
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