【发布时间】: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