我目前有一个宏,用于删除记录,如果ID不存在于我从XML文档创建的ID列表中。它确实按照我想要的方式工作,但是电子表格中有超过1000列(每年的每一天都有一列,直到2015年底),因此删除行需要很长时间,而且只能执行1或2次,然后会显示“Excel耗尽了资源并必须停止”。以下是我用于宏的代码,是否有其他方法可以做到这一点,使Excel不会耗尽资源?
Sub deleteTasks()
Application.ScreenUpdating = False
Dim search As String
Dim sheet As Worksheet
Dim cell As Range, col As Range
Set sheet = Worksheets("misc")
Set col = sheet.Columns(4)
ActiveWorkbook.Sheets("Schedule").Activate
ActiveSheet.Range("A4").Select
ActiveSheet.Unprotect
ActiveSheet.Range("A:C").EntireColumn.Hidden = False
Do While ActiveCell.Value <> ""
search = ActiveCell.Value
Set cell = col.Find(What:=search, LookIn:=xlValues, _
LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False)
If cell Is Nothing Then 'If the taskID is not in the XML list
Debug.Print "Deleted Task: " & ActiveCell.Value
Selection.EntireRow.Delete
End If
ActiveCell.Offset(1, 0).Select 'Select next task ID
Loop
ActiveSheet.Range("A:B").EntireColumn.Hidden = True
ActiveSheet.Protect
End Sub
在尝试了包括下面列出的所有答案在内的许多不同选项后,我意识到无论使用什么方法,在我的普通笔记本电脑上(2.20 Ghz,4GB RAM)删除一个具有约1100列的行都需要一段时间。由于大多数行为空,我找到了一种更快的替代方法。我只清除包含数据的单元格(A:S),然后调整表格大小以删除刚刚删除数据的行。这个最终结果与 entireColumn.Delete
完全相同。以下是我现在正在使用的代码。
'New method - takes about 10 seconds on my laptop
Set ws = Worksheets("Schedule")
Set table = ws.ListObjects(1)
Set r = ws.Range("A280:S280")
r.Clear
table.Resize Range("A3:VZ279")
如果使用EntireColumn.Delete
或手动选择行并删除,这些操作在我的笔记本电脑上大约需要20-30秒。当然,只有当您的数据在表格中时,此方法才有效。
ActiveSheet.Range(DelStr).Delete
,其中DelStr="15:15"
,如果您想删除包括所有列等的第15行。 - hnk