我正在使用以下代码来锁定某些单元格的内容
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:=True
和 DrawingObjects:=True
会以同样的方式允许 AllowFormattingColumns:=True
和 AllowFormattingRows:=True
允许调整大小。
预先感谢您的帮助。
问候,
罗纳德
有很多人都有这种困难。流行的答案是,在不允许无阻碍排序的情况下,您无法保护内容不被编辑。你的选择是:
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
这对我来说是一个主要问题,我发现以下链接的答案相对简单。谢谢旅行者!
请注意,我命名了我希望其他人能够排序的范围
- 取消保护工作表
- 转到“保护”---“允许用户编辑范围”(如果Excel 2007,“审核”选项卡)
- 添加“新”范围
- 选择要允许用户排序的范围
- 点击“保护表”
- 这次, *不允许用户选择“锁定的单元格”**
- 好
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
如果用户做了任何更改已锁定的单元格的操作,则该操作将立即撤消。临时禁用事件是为了使撤消本身不会触发此事件,从而导致无限循环。
排序和过滤不会触发Change事件,因此这些功能仍保持启用状态。
请注意,此解决方案可防止更改或清除单元格内容,但不会阻止更改格式。确定的用户可以通过简单地设置要解锁的单元来绕过它。
这篇文章解释了问题和解决方案,有更多细节:
在受保护的工作表中对锁定的单元格进行排序
需要了解的是,锁定单元格的目的是防止它们被更改,并且排序会永久地更改单元格值。您可以编写宏,但更好的解决方案是使用“允许用户编辑范围”功能。这使得单元格可以编辑,因此排序可以工作,但由于单元格在技术上仍处于锁定状态,因此可以阻止用户选择它们。
如果自动过滤是子程序操作的一部分,您可以使用
BioSum.Unprotect "letmein"
'<Your function here>
BioSum.Cells(1, 1).Activate
BioSum.Protect "letmein"
暂时取消保护片材,过滤细胞,然后重新保护。
我知道这是超级老了,但每当我谷歌这个问题时都会出现。您可以取消保护上面单元格中给出的范围,然后将数据验证添加到未受保护的单元格以引用像“423fdgfdsg3254fer”这样令人发指的内容,然后如果用户尝试编辑任何这些单元格,它们将无法进行,但您将排序现在可以使用过滤了。
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
在Excel 2007中,解锁要输入数据的单元格。转到评论
> Protect Sheet
> Select Locked Cells (already selected)
> Select unlocked Cells (already selected)
> (and either) select Sort (or) Auto Filter
不需要VB