我正在尝试编写一个将锁定任何大于0的单元格的宏。当我运行下面的代码时,它可以工作,但锁定第一行,我有一个下拉箭头,用于排序和数字过滤器。有没有办法添加到这个代码,以便第一行不被锁定?
Sub Test()
Dim Cell As Range
Dim MyPlage As Range
With ThisWorkbook.ActiveSheet
.Unprotect
.Cells.Locked = False
Set MyPlage = .Range("J2:AA1074")
For Each Cell In MyPlage
If Not IsError(Cell) Then
If Cell.Value > "0" Then
Cell.Locked = True
End If
End If
Next
.Protect
End With
End Sub
答案 0 :(得分:2)
最简单的方法是定义不包括Top Row的范围:)
更改
.Range("J2:AA1074")
到
.Range("J3:AA1074")
此外,您可以直接使用SpecialCells
,而不是遍历范围中的每个单元格并检查该单元格是否有错误。例如( TRIED AND TESTED )
Sub Sample()
Dim Cell As Range, MyPlage As Range, FinalRange As Range
With ThisWorkbook.ActiveSheet
.Unprotect
.Cells.Locked = False
On Error Resume Next
Set MyPlage = .Range("J3:AA1074").SpecialCells(xlCellTypeConstants)
On Error GoTo 0
If Not MyPlage Is Nothing Then
For Each Cell In MyPlage
If Cell.Value > 0 Then Cell.Locked = True
Next
End If
.Protect DrawingObjects:=True, _
Contents:=True, _
Scenarios:=True, _
AllowFiltering:=True, _
AllowSorting:=True
.EnableSelection = xlUnlockedCells
End With
End Sub
要确保自动过滤和排序有效,请按照我上面的说法在.Protect
中指定。
在运行上述代码之前,您还需要采取一个额外的步骤。
<强>截图强>
答案 1 :(得分:1)
您可以将以下代码添加到Sheet module
(使用自动过滤器将Range("J1:AA1")
更改为范围):
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Application.Intersect(Target, Range("J1:AA1")) Is Nothing Then
ActiveSheet.Protect
Else
ActiveSheet.Unprotect
End If
End Sub