2017-07-24 66 views
0

我有清除4个不同页面上不同范围的未受保护单元格的内容的代码。这是缓慢的,并给我一个“联盟'全球失败的方法”。有什么建议么?我的代码被附加以下按钮清除未受保护的单元格太慢/无法正常工作

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 

感谢

+1

尝试设置rKlear =每个表单循环前都没有。并且我相信rclear与其他代码不匹配rklear。 – TJYen

+0

要做的第一件事就是将'rclear'改为'rKlear'。 (把'Option Explicit'作为每个代码模块的第一行 - 它会帮助检测错别字。)我怀疑这是否能解决你的问题,但它可能会阻止未来的问题。 – YowE3K

回答

2

不是一个答案,但你的代码太多的重复受到影响。这将是更容易调试,并进行了同样的事情:

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 

这些都是大范围的,所以性能也不会很大。

+0

@ YowE3K - 'Next c' - 谢谢,修正 –

+0

我通常只使用没有变量名称的'Next',这样我就不必改变'Next'语句,如果我改变'For'中的变量名称声明。 (但是我确实承认,如果变量名在循环的开始和结束处明确指出,尤其是在使用多个循环的情况下,它会使代码稍微容易理解。) – YowE3K

+0

P.S.这个代码可能**会解决问题 - 我怀疑它是跨多张表创建'Union',这是问题(请参阅TJYen提出的原始评论),并且您的代码会自动修复此问题。 – YowE3K

2

ozgrid有一个整洁(哈克)解决了这个:

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

它试图清除一切从范围(一个或多个),但忽略了锁定的单元格错误。个人而言,由于您似乎对范围有所了解/控制(?),因此我会为每个工作表定义范围名称,其中包括只是未锁定的单元格。对于每张纸,使用Ctrl-拖动来选择所有相关的区域;点击名称框(左上角)并给出名称(不含空格)。然后,

Range("the_name").ClearContents 

(对于每张纸)。

+0

不错!请注意 - 我开始使用ClearContents进行测试,并且*没有为我工作(Excel 2013) –

+0

@TimWilliams我们必须思考 - 我的确和你一样。 :D – YowE3K

+0

奇怪。 (我没有2013.)每个命名范围是否只包含解锁的单元格?并且每次都引用相应的表格? –

相关问题