button清除不受保护的单元太慢/不能正常工作

我有代码清除4个不同范围的不受保护的单元格的内容。 这是缓慢的,并给我一个“联盟的方法”全球失败“。 有什么build议么? 我的代码附在下面

Sub ClearAllUnLocked() Application.ScreenUpdating = False Dim r As Range, rKlear As Range Set rclear = Nothing For Each r In ThisWorkbook.Worksheets("A").Range("F7:AA832") If r.Locked = False Then If rKlear Is Nothing Then Set rKlear = r Else Set rKlear = Union(rKlear, r) End If End If Next r rKlear.ClearContents For Each r In ThisWorkbook.Worksheets("B").Range("D7:Y806") If r.Locked = False Then If rKlear Is Nothing Then Set rKlear = r Else Set rKlear = Union(rKlear, r) End If End If Next r rKlear.ClearContents For Each r In ThisWorkbook.Worksheets("E").Range("F7:AA855") If r.Locked = False Then If rKlear Is Nothing Then Set rKlear = r Else Set rKlear = Union(rKlear, r) End If End If Next r rKlear.ClearContents For Each r In ThisWorkbook.Worksheets("X").Range("F7:AA3006") If r.Locked = False Then If rKlear Is Nothing Then Set rKlear = r Else Set rKlear = Union(rKlear, r) End If End If Next r rKlear.ClearContents Application.ScreenUpdating = True End Sub 

谢谢

不是一个答案,但你的代码遭受了太多的重复。 这将更容易debugging,并做同样的事情:

 Sub ClearAllUnLocked() Application.ScreenUpdating = False ClearUnlocked ThisWorkbook.Worksheets("A").Range("F7:AA832") ClearUnlocked ThisWorkbook.Worksheets("B").Range("D7:Y806") ClearUnlocked ThisWorkbook.Worksheets("E").Range("F7:AA855") ClearUnlocked ThisWorkbook.Worksheets("X").Range("F7:AA3006") Application.ScreenUpdating = True End Sub Sub ClearUnlocked(rng As Range) Dim rngClear As Range, c As Range For Each c In rng.Cells If Not c.Locked Then If rngClear Is Nothing Then Set rngClear = c Else Set rngClear = Union(rngClear, r) End If End If Next c rngClear.ClearContents End Sub 

这些都是很大的范围,所以performance不会很好。

ozgrid有一个整洁的(哈克)解决scheme:

 Sub EmptyUnlocked() ActiveSheet.Protect On Error Resume Next ActiveSheet.Range("A1:F14") = "" On Error GoTo 0 ActiveSheet.Unprotect End Sub 

它试图清除范围内的所有内容,但忽略locking单元格的错误。

就个人而言,因为您似乎对范围有了知识/控制(?),所以我将为每个表单定义范围名称,其中包括解锁的单元格。 对于每个工作表使用Ctrl-拖动来select所有相关的区域; 点击名称框(左上angular)并给出名称(不含空格)。 然后,

 Range("the_name").ClearContents 

(每张)。