Performance 用于在大型excel工作表中有条件删除行的高效VBA代码

Performance 用于在大型excel工作表中有条件删除行的高效VBA代码,performance,excel,vba,Performance,Excel,Vba,我的excel表格有40列,超过100000行。我想删除任何列中包含字符串为“NA”的单元格的所有行。我正在努力寻找一个高效的VB代码,它不会导致excel崩溃。 我当前的VBA代码(如下所述)需要很长时间才能运行(在Intel Xenon和16 GB RAM上超过5分钟),在速度较慢的机器上(i5,4 GB RAM)会崩溃。有什么建议可以简化流程并加快速度吗 另外,行和列的确切数量事先不知道。而且,我是VBA新手,任何帮助都将不胜感激 有关档案的连结- 我的VBA代码: Sub DeleteR

我的excel表格有40列,超过100000行。我想删除任何列中包含字符串为“NA”的单元格的所有行。我正在努力寻找一个高效的VB代码,它不会导致excel崩溃。 我当前的VBA代码(如下所述)需要很长时间才能运行(在Intel Xenon和16 GB RAM上超过5分钟),在速度较慢的机器上(i5,4 GB RAM)会崩溃。有什么建议可以简化流程并加快速度吗

另外,行和列的确切数量事先不知道。而且,我是VBA新手,任何帮助都将不胜感激

有关档案的连结-

我的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

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

解决此问题的最快方法如下:()

由于这是一个CSV文件,在命令行中解析为文本可能是最有效的方法

如果您在Unix机器(Linux或OS X)上,则可以从终端使用SED(流编辑器)。这将在一秒钟内处理更改

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

我相信您可以在Windows上使用PowerShell来执行类似的操作,下面的命令似乎可以工作,尽管大约需要7秒钟


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

能否提供一个示例VB代码?提前感谢:)将取决于您的桌子布局。使用一个小副本,比如说表格的前100行,完成所有步骤并用宏记录器记录。对于“NA”的检查,只需在一行的单元格中循环。@AkashMalhotra spoonfeedme.stackexchange.com尚未联机。@a.S.H能否为上述建议的组合提供一个VB代码示例Is
NA
整个单元格内容?或者只是“包含”
NA
?寻求调试帮助的问题(“为什么此代码不工作?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅.Protip:与其“在堆栈溢出上查找此问题的代码”,不如编写自己的代码并理解自己在做什么?感谢您添加代码,这是让您的问题回到正轨的良好第一步。现在你需要一个清晰的问题陈述。描述您的代码如何无法完成您希望它做的事情=)