VBA Excel - 如何锁定特定单元格但允许过滤和排序

Ron*_*via 14 excel vba

我正在使用以下代码来锁定某些单元格的内容

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:=TrueDrawingObjects:=True允许以同样的方式,AllowFormattingColumns:=TrueAllowFormattingRows:=True允许调整大小.

预先感谢您的帮助.

此致,罗纳德

Woo*_*tty 9

有很多人都有这种困难.流行的答案是,在不允许无阻碍排序的情况下,您无法保护内容不被编辑.你的选择是:

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 !!!

请注意,我命名了我希望其他人能够排序的范围

  • 取消保护工作表
  • 转到"保护"---"允许用户编辑范围"(如果Excel 2007,"审核"选项卡)
  • 添加"新"范围
  • 选择要允许用户排序​​的范围
  • 点击"保护表"
  • 这次,*不允许用户选择"锁定的单元格"**

http://answers.yahoo.com/question/index?qid=20090419000032AAs5VRR


Isa*_*ses 5

我只是想出了一个棘手的方法来获得几乎相同的功能。不是以正常方式保护工作表,而是使用事件处理程序来撤消用户尝试执行的任何操作。

将以下内容添加到工作表的模块中:

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 事件,因此这些功能保持启用状态。

请注意,此解决方案会阻止更改或清除单元格内容,但不会阻止更改格式。一个坚定的用户可以通过简单地设置要解锁的单元格来绕过它。