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


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

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:=TrueAllowFiltering:=True 和 DrawingObjects:=True 会以同样的方式允许 AllowFormattingColumns:=True 和 AllowFormattingRows:=True 允许调整大小。

预先感谢您的帮助。

问候, 罗纳德


3344
2018-04-17 19:24


起源

我建议你重新阅读Excel帮助 Worksheet Proptect,特别是关于 允许 受保护的参数 工作表 并锁定 细胞。 AllowSorting:“排序范围中的每个单元格都必须解锁或不受保护”AllowFiltering:“用户可以更改过滤条件,但无法启用或禁用自动过滤器” - chris neilsen
谢谢,这很难过,因为我需要能够阻止某些内容,但允许用户进行排序和过滤。有任何想法吗? - Ronald Valdivia
1.)确保您的范围与其他范围不重叠。 2.)在对您的范围施加锁定之前,解锁工作表中的所有单元格。 3.)“当纸张受到保护时,必须解锁要过滤的细胞。” ...所以只是不要将那些“过滤单元”作为锁定范围的一部分。 msdn.microsoft.com/en-us/library/office/ff839866.aspx - Leo Gurdian


答案:


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

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

8
2018-05-06 23:53





这对我来说是一个主要问题,我发现以下链接的答案相对简单。谢谢旅行者!

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

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

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


5
2018-03-13 16:15





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

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

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

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


2
2018-03-26 21:55



正是我在寻找 - 这是一个使用它的巧妙技巧 locked 旗。这应该是答案 - Nick.McDermaid


这篇文章解释了问题和解决方案,有更多细节:

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

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


1
2017-10-23 14:44





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

BioSum.Unprotect "letmein"

'<Your function here>

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

暂时取消保护片材,过滤细胞,然后重新保护。


0
2018-04-08 13:10





我知道这是超级老了,但每当我谷歌这个问题时都会出现。您可以取消保护上面单元格中给出的范围,然后将数据验证添加到未受保护的单元格以引用像“423fdgfdsg3254fer”这样令人发指的内容,然后如果用户尝试编辑任何这些单元格,它们将无法进行,但您将排序现在可以使用过滤了。


0
2017-10-06 17:30





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

Isaac的答案很棒,但如果用户突出显示同时具有锁定和未锁定单元格的范围,则无效。

如果目标范围内的任何单元格被锁定,我会稍微修改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

0
2018-05-23 20:05





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

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

不需要VB


-1
2017-12-02 13:09



问题是如何使用VBA执行该操作。你的答案是对的 - Dragos