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