15

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

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

它锁定那些特定列的内容。问题是用户无法对单元格进行排序、过滤或应用边框,因为这些 Excel 菜单项已禁用。

我认为AllowSorting:=True,AllowFiltering:=TrueDrawingObjects:=True允许以相同的方式AllowFormattingColumns:=TrueAllowFormattingRows:=True允许调整大小。

4

10 回答 10

9

有很多人有这个困难。普遍的答案是,您不能在允许不受阻碍的排序的同时保护内容不被编辑。您的选择是:

1) 允许编辑和排序:(

2) 应用保护并使用代码创建按钮以使用 VBA 进行排序。还有其他帖子解释了如何做到这一点。我认为有两种方法,或者(1)获取代码以取消保护工作表,应用排序,然后重新保护工作表,或者(2)使用保护工作表UserInterfaceOnly:=True

3) Lorie 的回答不允许用户选择单元格 ( https://stackoverflow.com/a/15390698/269953 )

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
于 2013-05-06T23:53:10.340 回答
6

这对我来说是一个主要问题,我发现下面的链接有一个相对简单的答案。感谢航海者!!!

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

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

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

于 2013-03-13T16:15:18.780 回答
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

如果用户对已锁定的单元格进行任何更改,则该操作将立即撤消。临时禁用事件是为了防止撤消本身触发该事件,从而导致无限循环。

排序和过滤不会触发 Change 事件,因此这些功能保持启用状态。

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

于 2014-03-26T21:55:52.277 回答
1

这是一篇更详细地解释问题和解决方案的文章:

对受保护工作表中的锁定单元格进行排序

要理解的是锁定单元格的目的是防止它们被更改,并且排序会永久更改单元格值。您可以编写宏,但更好的解决方案是使用“允许用户编辑范围”功能。这使得单元格可编辑,因此可以进行排序,但由于单元格在技术上仍处于锁定状态,因此您可以阻止用户选择它们。

于 2013-10-23T14:44:54.887 回答
1

我知道这是超级旧的,但每当我用谷歌搜索这个问题时就会出现。您可以取消保护上述单元格中给出的范围,然后将数据验证添加到未受保护的单元格以引用诸如“423fdgfdsg3254fer”之类的令人发指的内容,然后如果用户尝试编辑任何这些单元格,他们将无法编辑,但您正在排序过滤现在可以工作了。

于 2017-10-06T17:30:21.497 回答
1

Lorie 的回答很好,但是如果用户选择了包含锁定和未锁定单元格的范围,则可以删除锁定/受保护单元格中的数据。

艾萨克的回答很好,但如果用户突出显示一个同时具有锁定和解锁单元格的范围,则不起作用。

如果目标范围内的任何单元格被锁定,我稍微修改了 Isaac 的代码以撤消更改。它还显示一条消息,解释为什么撤消该操作。结合 Lorie 的回答,我能够实现对受保护工作表进行排序/过滤的预期结果,同时仍允许用户对未受保护的单元格进行更改。

按照 Lorie 的答案中的说明,然后将以下代码放入工作表模块中:

Private Sub Worksheet_Change(ByVal Target As Range)
    For Each i In Target
       If i.Locked = True Then
            Application.EnableEvents = False
            Application.Undo
            Application.EnableEvents = True
            MsgBox "Your action was undone because it made changes to a locked cell.", , "Action Undone"
        Exit For
        End If
    Next i
End Sub
于 2018-05-23T20:05:00.037 回答
0

这是一个非常古老但仍然非常有用的线程。我最近带着同样的问题来到这里。我建议在适当的时候保护工作表,并在选择过滤器行(例如第 1 行)时取消保护它。我的解决方案不使用密码保护 - 我不需要它(它是一种保护措施,而不是安全功能)。我找不到识别过滤器按钮选择的事件处理程序 - 所以我向我的用户指示首先选择过滤器单元格然后单击过滤器按钮。这是我提倡的,(我只在需要更改时更改保护,这可能会也可能不会节省时间 - 我不知道,但它“感觉”正确):

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  Const FilterRow = 1
  Dim c As Range
  Dim NotFilterRow As Boolean
  Dim oldstate As Boolean
  Dim ws As Worksheet
  Set ws = ActiveSheet
  oldstate = ws.ProtectContents
  NotFilterRow = False
  For Each c In Target.Cells
     NotFilterRow = c.Row <> FilterRow
     If NotFilterRow Then Exit For
  Next c
  If NotFilterRow <> oldstate Then
     If NotFilterRow Then
        ws.Protect
     Else
        ws.Unprotect
     End If
  End If
  Set ws = Nothing
End Sub
于 2019-03-28T10:44:59.060 回答
0

如果自动过滤是子程序操作的一部分,您可以使用

BioSum.Unprotect "letmein"

'<Your function here>

BioSum.Cells(1, 1).Activate
BioSum.Protect "letmein" 

暂时取消保护工作表,过滤单元格,然后重新保护。

于 2016-04-08T13:10:45.153 回答
-1

我有一个类似的问题。我希望用户能够在受保护的工作表中过滤“Table3”。但用户无法编辑表格。我在上面完成了,使用下面的 vba 代码:

Range("Table3").Select
Selection.Locked = True
Selection.FormulaHidden = False 
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
    , allowfiltering:=True

在以下代码中,我使用 VBA 过滤了代码:

Range("Table3[[#Headers],[Aantal4]]").Select
ActiveSheet.ListObjects("Table3").Range.AutoFilter Field:=8, Criteria1:= _
    Array("1", "12", "2", "24", "4", "6"), Operator:=xlFilterValues
于 2020-11-18T09:10:29.560 回答
-1

在 Excel 2007 中,解锁要在其中输入数据的单元格。去评论

 > Protect Sheet
 > Select Locked Cells (already selected)
 > Select unlocked Cells (already selected)
 > (and either) select Sort (or) Auto Filter 

不需要 VB

于 2016-12-02T13:09:13.340 回答