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