2017-07-24 48 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.)每個命名範圍是否只包含解鎖的單元格?並且每次都引用相應的表格? –