清除所有工作表内容的最快方法 VBA

51

我有一份很大的表格,需要删除所有内容。当我尝试不使用VBA简单清除它时,它会进入无响应模式。当使用类似以下的宏时:

Sub ClearContents ()
 Application.Calculation = XlManual
 Application.ScreenUpdating = False

  Sheets("Zeroes").Cells.ClearContents

 Application.ScreenUpdating = True
End Sub

它也没有响应。最快的方法是什么?


该表格是否包含条件格式? - Gary's Student
不是条件格式化。 - hc91
1
尝试使用以下代码:Application.EnableEvents = False: Sheets("Zeroes").Cells.Delete: Application.EnableEvents = True - omegastripes
4个回答

97

.Cells 范围不仅限于正在使用的单元格,所以您的代码正在清除 1,048,576 行和 16,384 列 - 总共 17,179,869,184 个单元格的内容。这需要一些时间。只需清除 UsedRange

Sheets("Zeros").UsedRange.ClearContents

或者,您可以删除工作表并重新添加:

Application.DisplayAlerts = False
Sheets("Zeros").Delete
Application.DisplayAlerts = True
Dim sheet As Worksheet
Set sheet = Sheets.Add
sheet.Name = "Zeros"

编辑:(@tavnab和@Azura)
提醒未来的读者,如果工作簿中只有一张表格,那么您无法删除该表格。
在这种情况下,您可以先添加新的空白表格,然后删除旧表格,最后将该新表格重命名为旧表格的名称。 还要注意,删除一个表格会在其他引用最近被删除的表格的表格公式中创建冲突,重新创建该表格可能无法解决该问题。


我不确定那样做会有效。我已经尝试过使用VBA并仅突出显示一个片段(200行,5000列)然后删除,但那会导致它冻结。我接着加入了一个循环,只是尝试循环1000行,但那也没有起作用。我可能只能手动循环并按住F8键... - hc91
@hc91 - 有趣。听起来似乎是Excel导致了问题,而不是VBA。您可以随时删除工作表并重新添加它。请参见编辑。 - Comintern
9
提醒未来的读者,如果工作簿中只剩下一个表格,无法删除该表格。此时,您可以先添加一个新的空白表格,删除旧表格,最后将该新表格重命名为旧表格的名称。 - tavnab
1
请注意,如果这是一个问题,则删除工作表会删除所有关联的VBA代码。我选择在开发VBA实用程序时只删除和重新创建工作表,但当我开始为这些工作表添加事件时,这使我进退两难了。我的建议是Sheets("Zeroes").Cells.Delete xlShiftUp,在我看来似乎瞬间完成。 - user1274820
2
还要注意,删除一个工作表会导致其他引用最近被删除的工作表中的公式发生冲突,重新创建该工作表可能无法解决这个问题。 - Azura
如果您的文件已经数字签名:请注意,在插入和删除新的工作表时,数字签名会被破坏 - 即使没有任何VBA代码。 - undefined

12

从技术上讲,并根据共产国际所接受的解决方法,我认为您实际上想要删除工作表中的所有单元格。这将删除格式(有关例外情况,请参见脚注)以及单元格内容。即 Sheets("Zeroes").Cells.Delete

再结合 UsedRange、ScreenUpdating 和 Calculation skipping,它几乎可以瞬间完成:

Sub DeleteCells ()
    Application.Calculation = XlManual
    Application.ScreenUpdating = False
    Sheets("Zeroes").UsedRange.Delete
    Application.ScreenUpdating = True
    Application.Calculation = xlAutomatic
End Sub

或者,如果你更喜欢尊重Excel当前的计算状态:

Sub DeleteCells ()
    Dim SaveCalcState
    SaveCalcState = Application.Calculation
    Application.Calculation = XlManual
    Application.ScreenUpdating = False
    Sheets("Zeroes").UsedRange.Delete
    Application.ScreenUpdating = True
    Application.Calculation = SaveCalcState
End Sub

注:如果对整个列应用了格式,则不会删除该格式。这包括字体颜色、填充颜色和边框、格式类别(如常规、日期、文本等),以及可能的其他属性,但是

条件格式将被删除,整行格式也会被删除。

(如果您将原始数据反复导入工作表,则应用整列格式非常有用,因为它将符合最初应用的格式,如果执行简单的“仅粘贴数值”类型的导入操作。)


7
您可以使用.Clear方法:
Sheets("Zeros").UsedRange.Clear

使用此功能,您可以删除单元格或范围的内容格式,而不会影响工作表的其余部分。

0

试试这个:

Sub clear_sht
  Dim sht As Worksheet
  Set sht = Worksheets(GENERATOR_SHT_NAME)
  col_cnt = sht.UsedRange.Columns.count
  If col_cnt = 0 Then
    col_cnt = 1
  End If

  sht.Range(sht.Cells(1, 1), sht.Cells(sht.UsedRange.Rows.count, col_cnt)).Clear
End Sub

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接