2016-06-28 140 views
0

我有下面的代碼,它有效地刪除指定的工作表(查找範圍等)內的三行。這個代碼我用了至少一年沒有任何問題。不過,我最近將這些代碼轉移到了新的工作簿中,並建立了一個與以前的工作簿完全相同的工作表。當刪除一個選定的行時運行時錯誤1004

哪裏出現錯誤消息

運行時錯誤「1004」

範圍類的刪除方法失敗

任何人都可以說明爲什麼會發生這種錯誤下面突出的代碼錯誤?

Sub DeleteRowPIC() 

Application.ScreenUpdating = False 
Application.Calculation = xlManual 
ActiveSheet.Unprotect Password:="Projects123" 
ActiveSheet.Range("Total").Select 
If Selection.Row = 12 Then 
Else 
ActiveSheet.Range("Total").Select 
Selection.Offset(-2, 0).Select 
ActiveCell.EntireRow.Delete 

ActiveSheet.Range("Total_1").Select 
Selection.Offset(-2, 0).Select 
ActiveCell.EntireRow.Delete **ERROR OCCURS HERE** 

ActiveSheet.Range("Total_2").Select 
Selection.Offset(-2, 0).Select 
ActiveCell.EntireRow.Delete 

End If 
Range("K2").Select 
Application.Calculation = xlAutomatic 
With ActiveSheet 

     .Protect Password:="Projects123", UserInterfaceOnly:=True 
     .EnableOutlining = True 
End With 
+1

你有沒有在新的工作表中命名範圍「Total_1」? – Clusks

+0

@Sean Bailey是否將您的「Total_1」命名範圍從第1行或第2行開始? –

+0

你真的不應該使用'.Select',它非常慢並且容易產生錯誤。 –

回答

0

正如在評論中提到的,您應該始終從最後一行開始,在刪除行時工作到第一行。我懷疑你的問題是由此造成的。沒有看到你的數據,我建議從Total_2回到Total。此外,您應儘可能避免使用Select。嘗試將代碼修改爲:

Sub DeleteRowPIC() 

Dim ws As Worksheet 

Application.ScreenUpdating = False 
Application.Calculation = xlManual 

Set ws = ActiveSheet 
With ws 
    .Unprotect Password:="Projects123" 
    If .Range("Total").Row <> 12 Then 
     .Range("Total_2").Offset(-2, 0).EntireRow.Delete 
     .Range("Total_1").Offset(-2, 0).EntireRow.Delete 
     .Range("Total").Offset(-2, 0).EntireRow.Delete 
    End If 
    Application.Calculation = xlAutomatic 
    .Protect Password:="Projects123", UserInterfaceOnly:=True 
    .EnableOutlining = True 
End With 

確保您在某個時刻也將Application.ScreenUpdating設置爲true。

+1

*確保將Application.ScreenUpdating設置爲true * - 這實際上不是必需的,它會自動翻轉回復後模塊運行 –

+0

好點@ScottHoltzman – TheEngineer

+0

謝謝,這比我現在的代碼更好,並已解決了這個問題。:) –