【问题标题】:Quickest way to clear all sheet contents VBA清除所有工作表内容的最快方法 VBA
【发布时间】:2015-07-10 03:16:44
【问题描述】:

我有一张大表,我需要删除其中的所有内容。当我尝试在没有 VBA 的情况下简单地清除它时,它会进入无响应模式。使用宏时,例如:

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

  Sheets("Zeroes").Cells.ClearContents

 Application.ScreenUpdating = True
End Sub

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

【问题讨论】:

  • 工作表是否包含条件格式?
  • 不是条件格式,没有。
  • 试试Application.EnableEvents = False: Sheets("Zeroes").Cells.Delete: Application.EnableEvents = True

标签: vba excel


【解决方案1】:

.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做它,只是突出显示一个sn-p(200行,5000列)并删除它,然后冻结它。然后我放了一个循环,只是尝试循环遍历 1000 行,但也没有用。我可以手动循环它并按住 F8...
  • @hc91 - 有趣。听起来有足够的数据表明 Excel 会导致问题,而不是 VBA。您始终可以删除工作表并重新添加它。查看编辑。
  • 提醒未来的读者,如果它是工作簿中的最后一个/唯一一个,则不能删除它。在这种情况下,您可以先添加新的空白工作表,删除旧工作表,最后将新工作表重命名为旧工作表的名称。
  • 另外,请注意,如果这是一个问题,删除工作表会删除所有关联的 VBA 代码。我只是在我正在开发的 VBA 实用程序中删除和重新创建工作表,当我开始向这些工作表添加事件时,这让我陷入了困境。我的推荐是Sheets("Zeroes").Cells.Delete xlShiftUp,这对我来说似乎是即时的。
  • 另请注意,删除工作表会与引用最近删除的工作表的其他工作表中的公式产生冲突,重新创建工作表可能无法解决该问题。
【解决方案2】:

从技术上讲,根据共产国际公认的解决方法, 我相信您实际上想要删除工作表中的所有单元格。它删除了格式(请参阅脚注以了解例外情况)等以及单元格内容。 IE。 Sheets("Zeroes").Cells.Delete

结合 UsedRange、ScreenUpdating 和 Calculation 跳过它应该几乎是瞬时的:

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

脚注:如果对整列应用了格式设置,则它不会被删除。 这包括字体颜色、填充颜色和边框、格式类别(如常规、日期、文本等),也许还有其他属性,但是

条件格式被删除,整行格式也是如此。

整列格式在您将原始数据重复导入工作表时非常有用,因为如果完成了简单的仅粘贴值类型导入,它将符合最初应用的格式。)

【讨论】:

    【解决方案3】:

    您可以使用 .Clear 方法:

    Sheets("Zeros").UsedRange.Clear
    

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

    【讨论】:

      【解决方案4】:

      试试这个:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-08
        • 1970-01-01
        • 1970-01-01
        • 2016-05-12
        • 1970-01-01
        • 2010-12-15
        相关资源
        最近更新 更多