Excel 保护循环中的工作表

Excel 保护循环中的工作表,excel,vba,Excel,Vba,以下代码用于锁定工作簿每个工作表中符合条件的单元格。代码在单个工作表上运行良好,但当我想应用于整个工作簿时,错误消息“无法将锁定属性设置为range类” 工作簿循环过程也是正确的,有人能告诉我是什么导致了错误吗 非常感谢!代码如下,很抱歉,我不知道如何在此处显示正确的格式: Sub selectnumbers() Dim ws_count As Integer Dim n As Integer ws_count = ActiveWorkbook.Worksheets.Co

以下代码用于锁定工作簿每个工作表中符合条件的单元格。代码在单个工作表上运行良好,但当我想应用于整个工作簿时,错误消息“无法将锁定属性设置为range类”

工作簿循环过程也是正确的,有人能告诉我是什么导致了错误吗

非常感谢!代码如下,很抱歉,我不知道如何在此处显示正确的格式:

Sub selectnumbers()
    Dim ws_count As Integer
    Dim n As Integer
    ws_count = ActiveWorkbook.Worksheets.Count
    For n = 2 To ws_count

        Dim rng As Range
        Dim cell As Range
        Dim i As Range
        Set rng = Nothing

        For Each cell In ActiveSheet.UsedRange
          If IsNumeric(cell) = False Or cell.Interior.Pattern = xlLightUp Or cell = "" Then
           If rng Is Nothing Then
            Set rng = cell
              Else
              Set rng = Application.union(rng, cell)
            End If
          End If
        End If
        Next cell

        If Not rng Is Nothing Then
        rng.Select
        End If

        Selection.Locked = True

        ActiveSheet.Protect Password:="ADARS", DrawingObjects:=True, Contents:=True, Scenarios:=True _
        , AllowSorting:=True, AllowFiltering:=True, AllowUsingPivotTables:=True

    Next n

End Sub

对于.UsedRange中的每个单元格,似乎在嵌套的
关闭之前有一个额外的
结束If

我相信你的主要问题是依赖。n=2到ws_计数的
并没有真正将控制权传递给下一个工作表。焦点和控制权仍保留在ActiveSheet上

Sub selectnumbers()
    Dim ws_count As Long, n As Long
    Dim rng As Range, cell As Range, i As Range

    ws_count = ActiveWorkbook.Worksheets.Count
    For n = 2 To ws_count
        With Worksheets(n)

            Set rng = Nothing

            For Each cell In .UsedRange
                If Not IsNumeric(cell) Or cell.Interior.Pattern = xlLightUp Or cell = "" Then
                    If rng Is Nothing Then
                        Set rng = cell
                    Else
                        Set rng = Application.Union(rng, cell)
                    End If
                End If
            Next cell

            If Not rng Is Nothing Then
                rng.Locked = True
            End If

            .Protect Password:="ADARS", DrawingObjects:=True, Contents:=True, Scenarios:=True, _
                AllowSorting:=True, AllowFiltering:=True, AllowUsingPivotTables:=True

        End With
    Next n

End Sub

我使用了一个将控件传递到下一个工作表。

逐单元测试在我看来很慢,所以我尝试了下面的一个版本,使用
特殊单元和
查找
来加快测试速度

Sub selectnumbers()
    Dim ws_count As Long, n As Long
    Dim rng As Range
    Dim rng1 As Range
    Dim rng2 As Range
    Dim strAddress As String

    ws_count = ActiveWorkbook.Worksheets.Count
    For n = 2 To ws_count
        With Worksheets(n)

            Set rng = Nothing
            .UsedRange

            On Error Resume Next
            Set rng = .UsedRange.SpecialCells(xlBlanks)
            If Not rng Is Nothing Then
                Set rng = Union(rng, .UsedRange.SpecialCells(xlCellTypeFormulas, 22))
            Else
              Set rng = .UsedRange.SpecialCells(xlCellTypeFormulas, 22)
            End If
            On Error GoTo 0


            With Application.FindFormat
                    .Clear
                    .Interior.Pattern = xlLightUp
            End With

            Set rng1 = .UsedRange.Find(vbNullString, , xlFormulas, xlPart, xlByRows, xlNext, , True)
            If Not rng1 Is Nothing Then
                strAddress = rng1.Address
                Set rng2 = rng1
                Do
                    Set rng1 = .UsedRange.Find(vbNullString, rng1, xlFormulas, xlPart, xlByRows, xlNext, , True)
                    Set rng2 = Union(rng2, rng1)
                Loop Until rng1.Address = strAddress
            Set rng = Union(rng, rng2)
            End If

            If Not rng Is Nothing Then rng.Locked = True

            .Protect Password:="ADARS", DrawingObjects:=True, Contents:=True, Scenarios:=True, _
                AllowSorting:=True, AllowFiltering:=True, AllowUsingPivotTables:=True
        End With
    Next n

End Sub

如果
恰好在下一个单元格
之前,则至少有一个额外的
结束。你能澄清一下吗?如果你锁定整个工作表,你不需要单独锁定范围锁定单元格和保护工作表不是一回事-即使工作表受到保护,解锁的单元格也可以更改。非常感谢!!!!现在很好用。我学到了一些新东西。将使用with语句将控制传递到下一个工作表。非常感谢!With语句现在工作得很好:)。