2012-04-17 105 views
11

我用下面的代码来锁定某些细胞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:=True,AllowFiltering:=TrueDrawingObjects:=True将允许与AllowFormattingColumns:=TrueAllowFormattingRows:=True允许调整大小相同的方式。

非常感谢您的帮助。

问候, 罗纳德

+1

我建议你重新阅读Excel工作表Proptect的帮助文件,特别是关于_Allow_参数保护_worksheets_和locked_cells_。 AllowSorting:“排序范围内的每个单元格必须解锁或不受保护”AllowFiltering:“用户可以更改过滤条件,但不能启用或禁用自动过滤器” – 2012-04-17 19:43:36

+0

谢谢,虽然这很让人伤心,因为我需要能够阻止某些内容,但允许用户排序​​和过滤。有任何想法吗? – 2012-04-17 22:13:42

+0

1.)确保你的范围不与其他范围重叠。 2)解锁表格中的所有单元格,然后将锁定应用于范围。 3.)“当表单受到保护时,必须解锁要过滤的单元格。” ...所以只是不要将这些'过滤器单元'作为锁定范围的一部分。 https://msdn.microsoft.com/en-us/library/office/ff839866.aspx – 2016-06-29 17:28:22

回答

5

这对我来说是一个大问题,我发现有一个相对简单的答案下面的链接。谢谢Voyager !!!

注意,我指定的范围内,我想其他人能够进行排序

  • 撤消工作表
  • 进入“保护” ---“允许用户编辑区域”(如Excel 2007中,“评论”选项卡)
  • 添加‘新’范围
  • 选择要允许的范围内的用户进行排序
  • 单击‘保护工作表’
  • 这一次,* 不允许用户选择 “锁定单元格” **
  • OK

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

7

有许多人用这个困难。主要的答案是,你无法保护内容不被编辑,同时允许无阻碍的排序。您的选项是:

1)允许编辑和排序:(

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

3)罗瑞的答案,不允许用户选择单元格(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 
1

这里是解释问题和解决方案有很多更详细的文章:

Sorting Locked Cells in Protected Worksheets

明白的事情是,锁定细胞的目的是为了防止它们被改变,并永久排序更改单元格值。您可以编写一个宏,但更好的解决方案是使用“允许用户编辑范围”功能。这使得单元格可以编辑以便进行排序,但是由于单元格在技术上仍处于锁定状态,因此可以防止用户选择它们。

2

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

以下添加到工作表的模块:

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

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

+0

正是我在找的东西 - 这是使用'locked'标志的巧妙方法。这应该是答案 – 2017-12-14 11:48:43

0

如果自动筛选是一个子程序操作的一部分,你可以使用

BioSum.Unprotect "letmein" 

'<Your function here> 

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

瞬间取消保护板,过滤单元,并重新保护之后。

-1

在Excel 2007中,解锁要将数据输入到的单元格。去查看

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

没有VB需要

+1

问题是如何使用VBA执行该操作。你的回答是错误的 – Dragos 2016-12-02 13:16:55

0

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