从Excel工作表中删除空行

时间:2012-08-21 08:37:14

标签: c# excel worksheet

我已经做了一些搜索,但我似乎无法找到一种快速方法来摆脱工作表中的所有BLANK行。我不希望它占用太多时间。有这样的方式吗?

我尝试过一些不太棒的方法,包括在所有列中过滤空白然后删除屏幕上的内容。也许在excel中有一个我在这里缺少的功能?

我正在寻找像UsedRange.RemoveDuplicates()这样的功能,它可以在一两秒钟内完成很多工作。

4 个答案:

答案 0 :(得分:2)

以下两种删除活动工作表上所有空白行的方法......

1 VBA 。这种方式应该比循环遍历行快得多:

cells.RowDifferences(cells(rows.Count,columns.Count)).rows.Hidden=true
cells.SpecialCells(xlCellTypeVisible).EntireRow.Delete
cells.Rows.Hidden=false

2个键盘。这种方式只是撤消列表中的三个步骤,因此可以轻松撤消/撤消。

enter image description here

步骤1.选择数据单元格。 点击左上角标题以选择所有单元格,然后按Shift+Tab Ctrl+\

步骤2.隐藏和删除剩余的行。Ctrl + 9 Ctrl + A Alt+; Ctrl + -

步骤3.取消隐藏选定的行并选择第一个单元格。按:Ctrl + Shift + 9 Ctrl + Home

<强>之前

enter image description here

<强>后

enter image description here

答案 1 :(得分:1)

如果您需要在excel中快速运行函数,则应设置全局Excel应用程序变量,例如“Visible = false”,“ScreenUpdating = false”。过滤空白并删除它们应该是最快的方法,尽管我会手动制作要删除的行列表,然后在一次调用中删除它们

RowsToDelete = "2:2;4:4;8:8";
Range = Sheet.Range()
Range.Delete()

答案 2 :(得分:1)

对于非常大的数据集(100k +行),我总是发现大量更快地按空白排序然后删除比过滤和删除大量分离的行。 如果空白行在整个文件中展开,则可以快5到10倍。

答案 3 :(得分:1)

遍历每一行需要永远,但这只是因为FOR循环开销。 WorksheetFunction.CountA和Range.EntireRow.Delete的主要操作实际上不需要很长时间。

我发现的最佳解决方案是从100K行的块开始并删除所有没有值的行,然后以10的幂向下移动,直到你处于单行级别。

无论您是尝试删除数据周围多余的空格,还是在主数据范围内删除单行,这都很快。

Public Sub removeblankrows()
Dim ws As Worksheet: Set ws = ActiveSheet

With WorksheetFunction
    Dim pow As Long

    For pow = 6 To 0 Step -1

        Dim chunkSize As Long: chunkSize = 10 ^ pow

        Dim chunks As Long: chunks = (ws.UsedRange.Rows.Count \ chunkSize) + 1

        Dim c As Long
        For c = chunks To 1 Step -1
            Dim last As Long, first As Long

            last = .Min(c * chunkSize, ws.Rows.Count)
            first = .Max(1, (c - 1) * chunkSize)

            Dim c1 As Range, c2 As Range, rng As Range
            Set c1 = ws.Cells(first, 1)
            Set c2 = ws.Cells(last, ws.UsedRange.Columns.Count)

            Set rng = ws.Range(c1, c2)

            If .CountA(rng) = 0 Then rng.EntireRow.Delete

        Next c

    Next pow
End With

End Sub