优化excel vba中删除行的时间

优化excel vba中删除行的时间,excel,vba,Excel,Vba,我想删除一些行-1000/10000基于一个条件,但它需要太长的时间。我还尝试了互联网上所有可用的解决方案,如过滤数据、Application.screenupdate=False、设置计时器等 Private Sub Remove_incomplete_records_Click() Dim n, count As Integer Dim i As Long Dim lastrownum As Integer lastrownum = Sheets("Master_Data").Cells(

我想删除一些行-1000/10000基于一个条件,但它需要太长的时间。我还尝试了互联网上所有可用的解决方案,如过滤数据、
Application.screenupdate=False
、设置计时器等

Private Sub Remove_incomplete_records_Click()
Dim n, count As Integer
Dim i As Long
Dim lastrownum As Integer

lastrownum = Sheets("Master_Data").Cells(Rows.count, 1).End(xlUp).Row

Dim varCalcmode

Do While (lastrownum)
    Application.ScreenUpdating = False    
    'for NB,FO etc if field your refernence is not present then delete the entire row.    
    For i = 2 To lastrownum    
        If (Sheets("Master_Data").Cells(i, 2).Value <> "YC" And Sheets("Master_Data").Cells(i, 2).Value <> "YK" And Sheets("Master_Data").Cells(i, 2).Value <> "MK" And Cells(i, 2).Value <> "WK" And Sheets("Master_Data").Cells(i, 2).Value <> "AN") Then
            If (Sheets("Master_Data").Cells(i, 4).Value = "") Then
                On Error Resume Next
                Sheets("Master_Data").Rows(i).EntireRow.Delete Shift:=xlUp
                varCalcmode = Application.Calculation
                Application.Calculation = xlCalculationManual
                Application.ScreenUpdating = False
            Else
            End If
        Else
        End If
    Next i
Loop

Application.Calculation = varCalcmode
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

End Sub 
Private Sub Remove\u complete\u records\u Click()
Dim n,计数为整数
我想我会坚持多久
将lastrownum设置为整数
lastrownum=工作表(“主数据”)。单元格(Rows.count,1)。结束(xlUp)。行
Dim可变电容模式
执行时(lastrownum)
Application.ScreenUpdating=False
'对于NB、FO等字段,如果您的引用不存在,则删除整行。
对于i=2到lastrownum
如果(表(“主数据”).单元格(i,2).值“YC”和表(“主数据”).单元格(i,2).值“YK”和表(“主数据”).单元格(i,2).值“MK”和单元格(i,2).值“WK”和表(“主数据”).单元格(i,2).值“AN”),则
如果(表(“主数据”)单元格(i,4).Value=“”),则
出错时继续下一步
图纸(“主数据”)。行(i)。EntireRow.Delete Shift:=xlUp
varCalcmode=Application.Calculation
Application.Calculation=xlCalculationManual
Application.ScreenUpdating=False
其他的
如果结束
其他的
如果结束
接下来我
环
Application.Calculation=varCalcmode
Application.Calculation=xlCalculationAutomatic
Application.ScreenUpdating=True
端接头

请建议执行此操作的更快方法。

尝试一下。它不是逐个删除行,而是查找符合删除条件的每一行,并一次性删除它们。效率更高

Private Sub Remove\u complete\u records\u Click()
Dim i和LastRowNum一样长
Dim DeleteRng As范围
Dim varCalcmode作为XLC计算
应用
.ScreenUpdate=False
varCalcmode=.Calculation
.Calculation=xlCalculationManual
以
带图纸(“主数据”)
LastRowNum=.Cells(Rows.count,1).End(xlUp).Row
'对于NB、FO等字段,如果您的引用不存在,则删除整行。
对于i=2到LastRowNum
If.Cells(i,2).Value2“YC”和.Cells(i,2).Value2“YK”和_
.单元格(i,2).值2“MK”和单元格(i,2).值2“WK”和_
.Cells(i,2).Value2“AN”和.Cells(i,4).Value2=vbNullString然后
如果DeleteRng什么都不是,那么
设置DeleteRng=图纸(“主数据”)。行(i)
其他的
设置DeleteRng=Union(DeleteRng,shets(“主数据”)。第(i)行)
如果结束
如果结束
如果结束
接下来我
以
如果Not DeleteRng为Nothing,则DeleteRng.EntireRow.Delete Shift:=xlUp
应用
.Calculation=varCalcmode
.ScreenUpdate=True
以
端接头
此方法速度更快

Private Sub Remove_incomplete_records_Click()
Dim n, count As Integer
Dim i As Long
Dim lastrownum As Integer
Dim rngU As Range

    lastrownum = Sheets("Master_Data").Cells(Rows.count, 1).End(xlUp).Row

    Dim varCalcmode
    Application.ScreenUpdating = False

    Do While (lastrownum)

        'for NB,FO etc if field your refernence is not present then delete the entire row.
        For i = 2 To lastrownum
            If (Sheets("Master_Data").Cells(i, 2).Value <> "YC" And Sheets("Master_Data").Cells(i, 2).Value <> "YK" And Sheets("Master_Data").Cells(i, 2).Value <> "MK" And Cells(i, 2).Value <> "WK" And Sheets("Master_Data").Cells(i, 2).Value <> "AN") Then
                If (Sheets("Master_Data").Cells(i, 4).Value = "") Then
                    'On Error Resume Next
                    With Sheets("Master_Data")
                        If rngU Is Nothing Then
                            Set rngU = .Range("a" & i)
                        Else
                            Set rngU = Union(rngU, .Range("a" & i))
                        End If
                    End With
                    'Sheets("Master_Data").Rows(i).EntireRow.Delete Shift:=xlUp
                    'varCalcmode = Application.Calculation
                    'Application.Calculation = xlCalculationManual
                    'Application.ScreenUpdating = False
                Else
                End If
            Else
            End If
        Next i
    Loop
    rngU.EntireRow.Delete
    'Application.Calculation = varCalcmode
    'Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True

End Sub
Private Sub Remove\u complete\u records\u Click()
Dim n,计数为整数
我想我会坚持多久
将lastrownum设置为整数
暗rngU As范围
lastrownum=工作表(“主数据”)。单元格(Rows.count,1)。结束(xlUp)。行
Dim可变电容模式
Application.ScreenUpdating=False
执行时(lastrownum)
'对于NB、FO等字段,如果您的引用不存在,则删除整行。
对于i=2到lastrownum
如果(表(“主数据”).单元格(i,2).值“YC”和表(“主数据”).单元格(i,2).值“YK”和表(“主数据”).单元格(i,2).值“MK”和单元格(i,2).值“WK”和表(“主数据”).单元格(i,2).值“AN”),则
如果(表(“主数据”)单元格(i,4).Value=“”),则
'出现错误时,请继续下一步
带图纸(“主数据”)
如果rngU什么都不是
设置rngU=.Range(“a”&i)
其他的
设置rngU=Union(rngU、.Range(“a”&i))
如果结束
以
'工作表(“主数据”).行(i).EntireRow.Delete Shift:=xlUp
'varCalcmode=Application.Calculation
'Application.Calculation=xlCalculationManual
'Application.ScreenUpdate=False
其他的
如果结束
其他的
如果结束
接下来我
环
rngU.EntireRow.Delete
'Application.Calculation=varCalcmode
'Application.Calculation=xlCalculationAutomatic
Application.ScreenUpdating=True
端接头

从最后一行开始向上工作是实现优化的廉价方法。最佳解决方案。感谢没有问题-如果答案解决了您的问题,请不要忘记单击答案旁边的勾号