条件锁定单元格,无法排序

时间:2014-01-28 19:03:45

标签: excel vba excel-vba

我正在尝试编写一个将锁定任何大于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

2 个答案:

答案 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. 如果工作表已受到保护,则取消保护
  2. 在“审核标签”下,单击“允许用户编辑范围”
  3. 添加“新”范围
  4. 选择您希望用户排序的范围
  5. <强>截图

    enter image description here

答案 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

enter image description here