【问题标题】:Excel : Need to delete about 1 million blank rowsExcel:需要删除大约 100 万个空白行
【发布时间】:2015-03-04 15:20:03
【问题描述】:

我有一个来自我们的一位客户的 excel 文件,该文件有近 100 万行空白行。

我确实尝试在 C 列(称为项目)上过滤它,它是空白的,然后选择所有行并尝试删除。它几乎冻结了近几个小时,但最后我杀死了 excel 进程。

我也在 VBA 脚本下尝试过,但它显示“r.rows(i).Delete”的实际行只是冻结了。这是第一个删除实例本身。

我也将 Excel 文件设置为手动进行公式计算。

我不介意整个工作需要几个小时。我可以把它留一夜,然后早上检查。

如果有 VB.NET 或 C# 也可以。

更新 1:我无法批量删除 1 到 1048576 行之间的行,我需要删除 C 列为空白的那些行(这意味着该行为空白)。

更新 2:我将以下删除标记为答案,但我最终通过将 GOOD 行复制到另一个工作表来解决问题。

请提出处理这种情况的最佳方案。

VBA 源代码

Sub BlankRowDelete()

Dim r As Range, rows As Long, i As Long
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
ActiveSheet.DisplayPageBreaks = False
ActiveSheet.AutoFilterMode = False

Set r = ActiveSheet.Range("A1:A1048576")
rows = r.rows.Count
For i = rows To 1 Step (-1)
    If WorksheetFunction.CountA(r.rows(i)) = 0 Then
        r.rows(i).Delete
        RowDeleted = RowDeleted + 1
    Else
        NotDeleted = NotDeleted + 1
    End If
    totalcnt = totalcnt + 1
    If RowDeleted = 100 Then
       TotalDeleted = TotalDeleted + RowDeleted
       RowDeleted = 0
       Debug.Print "count now is " + totalcnt
    End If
    Application.StatusBar = "Row count is " + totalcnt
Next
Application.ScreenUpdating = False
Application.DisplayStatusBar = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
ActiveSheet.DisplayPageBreaks = True
ActiveSheet.AutoFilterMode = True

结束子

【问题讨论】:

  • 如何将它们一起删除,例如Rows(“[1:1048576]”).EntireRow.Delete?
  • 首先,在Next上方插入一个DoEvents
  • @RickTeachey :我不能在 1 到 1048576 行之间进行批量删除,我需要删除 C 列为空白的那些行。在调试时,我发现当我单步执行 .delete 命令时,它只是冻结(永远)。我保留了大约 45 分钟,当我稍后检查时,它仍然是冻结的。
  • 不,r 只是 A 列,您可以使用 r.rows(i).EntireRow.Delete。同样,如果 C 是您的关键列,则按 C 排序,一步手动向下标记空行并删除...?
  • 不如将所有要保留的行写到一个新文件/电子表格中?

标签: c# excel filtering delete-row vba


【解决方案1】:

按 C 列升序对文档进行排序。空行会到最后,所以应该很容易删除。

【讨论】:

  • :这就是我所做的,但手动删除只会冻结几个小时。所以我要走 VBA 路线,但到目前为止有问题。
  • @pnuts :我第一次尝试过。它只是冻结了。现在这对我来说很有意义,因为 VBA 脚本在过去 14 小时内仅删除了 130000 行。
  • @pnuts:该文件对我来说似乎很好,但也需要将任何公式应用于列。我将尝试为 GOOD 行创建新工作表的方法。
  • @pnuts:我猜想将 GOOD 行复制到新工作表的新 VBA 脚本即使在更新版本时也应该可以工作。对吗?
【解决方案2】:

我对您的代码进行了一些更新,例如 doevents,打开状态栏,因为 oyu 正在写入它,并在需要时更新屏幕并在您写出数值时添加 cstr()。我运行这个没有问题。如 cmets 所述,这只会删除单元格 A 而不是整行

Sub BlankRowDelete()
On Error GoTo myError
Dim r As Range, rows As Long, i As Long
Application.ScreenUpdating = False
Application.DisplayStatusBar = True
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
ActiveSheet.DisplayPageBreaks = False
ActiveSheet.AutoFilterMode = False

Set r = ActiveSheet.Range("C1:C1048576") 
rows = r.rows.Count
For i = rows To 1 Step (-1)
    If WorksheetFunction.CountA(r.rows(i)) = 0 Then
        r.rows(i).EntireRow.Delete
        RowDeleted = RowDeleted + 1
    Else
        NotDeleted = NotDeleted + 1
    End If
    totalcnt = totalcnt + 1
    If RowDeleted = 100 Then

       Application.ScreenUpdating = True
       TotalDeleted = TotalDeleted + RowDeleted
       RowDeleted = 0
                   'you can uncomment this but since this is a dup since writting to statusbar (imo)
      'Debug.Print "count now is " + CStr(totalcnt)

       Application.ScreenUpdating = False
    End If
    Application.StatusBar = "Row count is " + CStr(totalcnt)
    DoEvents
Next
myError:
If Err.Number <> 0 Then
MsgBox CStr(i) & ": " & Err.Description
End If
Application.ScreenUpdating = False
Application.DisplayStatusBar = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
ActiveSheet.DisplayPageBreaks = True
ActiveSheet.AutoFilterMode = True
End Sub

【讨论】:

  • :我以为它会一次性删除整行。我正在做的是从底部步进所有行。如果该行是空白的,那么我将发出删除命令。正如OP中所说,它在这里冻结。您提到它会删除单元格 A。那么删除整行的命令是什么?
  • 只需要告诉它整行。我更新了上面的代码; r.rows(i).EntireRow.Delete。我还更新了它以检查 C 列
  • 我现在就去试试。
  • 在上面的代码中我需要做些什么来自动保存吗?还是我需要为“保存”运行任何命令?
  • 最后添加 ActiveWorkbook.Save
猜你喜欢
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 2021-03-03
  • 1970-01-01
  • 1970-01-01
  • 2012-09-07
  • 1970-01-01
相关资源
最近更新 更多