高效的VBA代码,用于有条件地删除大型Excel工作表中的行

时间:2017-07-05 19:29:30

标签: excel performance excel-vba vba

我的Excel工作表有40列和超过1,00,000行。我想删除所有包含带字符串的单元格的行" NA"在任何一列中。我正在努力为此找到一个有效的VB代码,这不会导致excel崩溃。 我当前的VBA代码(如下所述)需要永远运行(在Intel Xenon和16 GB RAM上大于5分钟)并在较慢的机器(i5,4 GB RAM)上崩溃。有什么建议可以简化并加快速度吗?

P.S。确切的行数和列数是先验的。而且,我是VBA的新手,非常感谢任何帮助。

链接到相关文件 - https://drive.google.com/file/d/0Bzl56SYDK-iRdTE1LTlYZGsxSE0/view?usp=sharing

我的VBA代码:

Sub DeleteRowWithContents()

'Finds the last non-blank cell on a sheet/range.

Dim lRow As Long
Dim lCol As Long

    lRow = Cells.Find(What:="*", _
                    After:=Range("A1"), _
                    LookAt:=xlPart, _
                    LookIn:=xlFormulas, _
                    SearchOrder:=xlByRows, _
                    SearchDirection:=xlPrevious, _
                    MatchCase:=False).Row

    lCol = Cells.Find(What:="*", _
                    After:=Range("A1"), _
                    LookAt:=xlPart, _
                    LookIn:=xlFormulas, _
                    SearchOrder:=xlByColumns, _
                    SearchDirection:=xlPrevious, _
                    MatchCase:=False).Column

        'MsgBox "Last Row: " & lRow
        'MsgBox "Last Column: " & lCol


     For j = lCol To 1 Step -1
     For i = lRow To 1 Step -1
        If (Cells(i, j).Value) = "NA" Then
            Cells(i, "A").EntireRow.Delete
        End If
    Next i
    lRow = Cells.Find(What:="*", _
                    After:=Range("A1"), _
                    LookAt:=xlPart, _
                    LookIn:=xlFormulas, _
                    SearchOrder:=xlByRows, _
                    SearchDirection:=xlPrevious, _
                    MatchCase:=False).Row
    Next j


End Sub

2 个答案:

答案 0 :(得分:1)

我的建议是1.创建一个额外的列并让宏写入“NA”,只要在行和行号中找到“NA”。 2.使用该列对表进行排序,并将所有“NA”行删除为块。 3.使用行号计算表格,然后删除额外的列。

答案 1 :(得分:0)

最快的解决方案如下:(Source

因为这是一个CSV文件,所以在命令行解析为文本可能是最有效的方式;

如果你在Unix机器(Linux或OS X)上,那么你可以从终端使用SED(流编辑器)。这会在一秒钟内处理变化!

sed'/ NA / d'ahs-comb-madhya_pradesh-dhar.csv> AHS-梳madhya_pradesh-dhar_CLEAN.csv

我相信你可以在Windows上使用PowerShell做类似的事情,下面的命令似乎可以工作,虽然大约需要7秒

获取内容。\ ahs-comb-madhya_pradesh-dhar.csv | Where-Object {$ _ -CNotMatch'NA'} | Set-Content ahs-comb-madhya_pradesh-dhar_CLEAN.csv