Vba 使用自动筛选删除该行中有多个空白单元格的行
我们有一个超过550000行的Excel文件,我的任务是“清理”这张工作表。此文件包含我们从不同供应商处获得的所有产品,以及随附的所有数据 我遇到的具体任务是如何删除列A和列B都为空的所有行 使用小得多的excel文件,可以很容易地通过以下方式完成:Vba 使用自动筛选删除该行中有多个空白单元格的行,vba,performance,excel,autofilter,Vba,Performance,Excel,Autofilter,我们有一个超过550000行的Excel文件,我的任务是“清理”这张工作表。此文件包含我们从不同供应商处获得的所有产品,以及随附的所有数据 我遇到的具体任务是如何删除列A和列B都为空的所有行 使用小得多的excel文件,可以很容易地通过以下方式完成: Dim j As Long, i As Long j = Cells(Rows.Count, "C").End(xlUp).Row For i = j To 1 Step -1 If Cells(i, "A") = "" And Cell
Dim j As Long, i As Long
j = Cells(Rows.Count, "C").End(xlUp).Row
For i = j To 1 Step -1
If Cells(i, "A") = "" And Cells(i, "B") = "" Then
Cells(i, "A").EntireRow.Delete
End If
Next I
不幸的是,由于文件的大小太大,这样做不起作用
在此之前,我使用以下代码成功地删除了C列中具有空白单元格的所有行:
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
Dim oldWs As Worksheet, newWs As Worksheet
Dim wsName As String, lastRow As Range
Set oldWs = Worksheets(2)
wsName = oldWs.Name
lastRow = ActiveSheet.UsedRange.Rows.Count
If lastRow.Rows.Count > 1 Then
Set newWs = Sheets.Add(After:=oldWs)
With lastRow
.AutoFilter Field:=3, Criteria1:="<>"
.Copy
End With
With newWs.Cells
.PasteSpecial xlPasteColumnWidths
.PasteSpecial xlPasteAll
.Cells(1, 1).Select
.Cells(1, 1).Copy
End With
oldWs.Deletesheet
newWs.Name = wsName
End If
Application.ScreenUpdating = True
Application.EnableEvents = True
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdate=False
Application.EnableEvents=False
Application.Calculation=xlCalculationManual
将旧WS设置为工作表,将新WS设置为工作表
将wsName设置为字符串,将lastRow设置为范围
设置oldWs=工作表(2)
wsName=oldWs.Name
lastRow=ActiveSheet.UsedRange.Rows.Count
如果lastRow.Rows.Count>1,则
设置newWs=Sheets.Add(后面:=oldWs)
和拉斯特罗
.自动筛选字段:=3,标准1:=“”
复制
以
使用newWs.Cells
.Paste特殊XLPaste柱宽
.Paste特殊xlPasteAll
.单元格(1,1)。选择
.单元格(1,1)。复制
以
oldWs.Deletesheet
newWs.Name=wsName
如果结束
Application.ScreenUpdating=True
Application.EnableEvents=True
Application.Calculation=xlCalculationAutomatic
我一直在研究如何在多个列上使用.AutoFilter,但似乎没有什么能正常工作
任何加速第一个提到的过程的方法,允许输入多个字段。自动筛选,或者任何其他一般的方法都会有很大的帮助
p、 我看了几乎每一个相关的问题/答案,都找不到适合我的东西,但我觉得我越来越接近了什么是
N
?你哪儿都不用
Dim j As Long, i As Long
j = Cells(Rows.Count, "C").End(xlUp).Row
For i = j To 1 Step -1
If Range("A" & i).Value = vbNullString And Range("B" & i).Value = vbNullString Then Rows(i).Delete
Next i
应该行得通。请记住,处理500000行需要一段时间
您可以通过将
With Application
.ScreenUpdating = False
.EnableEvents = False
.DisplayAlerts = False
End With
开始时(并将所有内容放回
True
末尾)这将帮助您“删除列A和列B均为空的所有行”
谢谢你发现了这一点,我已经重新命名了一些变量W,真的很简单。。非常感谢你!!你能解释一下包含小计(103)的那一行吗?不客气。它统计指定范围内可见(即未过滤)单元格的数量(在本例中为
.Columns(3)
,即引用范围的第三列)
Option Explicit
Sub main()
With Worksheets("Products") ' change "Products" to your actual sheet name
With .Range("A1", .Cells(.Rows.Count, "C").End(xlUp))
.AutoFilter Field:=1, Criteria1:="="
.AutoFilter Field:=2, Criteria1:="="
MsgBox .Address
If Application.WorksheetFunction.Subtotal(103, .Columns(3)) > 1 Then .Resize(.Rows.Count - 1).Offset(1).SpecialCells(xlCellTypeVisible).EntireRow.Delete
End With
.AutoFilterMode = False
End With
End Sub