我正在使用以下代码来锁定某些单元格的内容
Sub LockCell(ws As Worksheet, strCellRng As String)
With ws
.Unprotect
.Cells.Locked = False
.Range(strCellRng).Locked = True
.Protect Contents:=True, AllowFormattingCells:=True, AllowFormattingColumns:=True, AllowFormattingRows:=True, AllowInsertingColumns:=True, AllowInsertingRows:=True, AllowSorting:=True, AllowFiltering:=True, AllowUsingPivotTables:=True, DrawingObjects:=True
End With
End Sub
Run Code Online (Sandbox Code Playgroud)
它可以很好地锁定那些特定列的内容.问题是,在电子表格本身上工作时,用户既不能过滤也不能对单元格应用边框,因为这些excel菜单项被禁用.我想AllowSorting:=True,AllowFiltering:=True并DrawingObjects:=True允许以同样的方式,AllowFormattingColumns:=True并AllowFormattingRows:=True允许调整大小.
预先感谢您的帮助.
此致,罗纳德
有很多人都有这种困难.流行的答案是,在不允许无阻碍排序的情况下,您无法保护内容不被编辑.你的选择是:
1)允许编辑和排序:(
2)应用保护并创建带代码的按钮以使用VBA进行排序.还有其他帖子解释了如何执行此操作.我认为有两种方法,或者(1)获取代码以取消保护工作表,应用排序,然后重新保护工作表,或(2)使用保护工作表UserInterfaceOnly:=True.
3)Lorie的答案,不允许用户选择单元格(/sf/answers/1077348891/)
4)我未讨论的一个解决方案是使用VBA提供一些基本保护.例如,使用检测和还原更改Worksheet_Change.然而,它远非理想的解决方案.
5)当用户选择数据时,您可以保护工作表,当用户选择了标题时,可以不受保护.这留下了无数种方式,用户可能会弄乱数据,同时也会导致一些可用性问题,但至少可以降低讨厌的同事不假思索地做出不必要的更改的几率.
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If (Target.row = HEADER_ROW) Then
wsMainTable.Unprotect Password:=PROTECTION_PASSWORD
Else
wsMainTable.Protect Password:=PROTECTION_PASSWORD, UserInterfaceOnly:=True
End If
End Sub
Run Code Online (Sandbox Code Playgroud)
小智 6
这对我来说是一个主要问题,我发现以下链接的答案相对简单.谢谢Voyager !!!
请注意,我命名了我希望其他人能够排序的范围
http://answers.yahoo.com/question/index?qid=20090419000032AAs5VRR
我只是想出了一个棘手的方法来获得几乎相同的功能。不是以正常方式保护工作表,而是使用事件处理程序来撤消用户尝试执行的任何操作。
将以下内容添加到工作表的模块中:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Locked = True Then
Application.EnableEvents = False
Application.Undo
Application.EnableEvents = True
End If
End Sub
Run Code Online (Sandbox Code Playgroud)
如果用户执行任何操作来更改锁定的单元格,该操作将立即撤消。临时禁用事件是为了防止撤消本身触发此事件,从而导致无限循环。
排序和过滤不会触发 Change 事件,因此这些功能保持启用状态。
请注意,此解决方案会阻止更改或清除单元格内容,但不会阻止更改格式。一个坚定的用户可以通过简单地设置要解锁的单元格来绕过它。