Vba 根据单元格值删除多行,删除滞后
我试图创建一个按钮宏,根据“b”列中的真/假值删除行。删除的问题是,一旦删除完毕,“for udo”将跳过后面的一个,因为下面范围内的单元格变为当前单元格。我提出了这个替代方案,但如果大量使用,它会非常滞后。任何建议。另外,我尽量保持代码的简单和干净,我不喜欢太多的变量,因为当我将来不得不回顾和调整时,它会变得混乱。塔克斯Vba 根据单元格值删除多行,删除滞后,vba,excel,Vba,Excel,我试图创建一个按钮宏,根据“b”列中的真/假值删除行。删除的问题是,一旦删除完毕,“for udo”将跳过后面的一个,因为下面范围内的单元格变为当前单元格。我提出了这个替代方案,但如果大量使用,它会非常滞后。任何建议。另外,我尽量保持代码的简单和干净,我不喜欢太多的变量,因为当我将来不得不回顾和调整时,它会变得混乱。塔克斯 Dim inps As Integer Sub delline() inps = MsgBox("Are you sure you wish to delete the s
Dim inps As Integer
Sub delline()
inps = MsgBox("Are you sure you wish to delete the selected rows?", vbYesNo, "Point Of No Return")
If inps = vbYes Then
For Each b In Range("B12", Range("B12").End(xlDown))
For Each a In Range("B12", Range("B12").End(xlDown))
If a.Value = True Then
a.EntireRow.Delete
End If
Next a
Next b
End If
End Sub
从最后一个删除到第一个<代码>对于RowIndex=RowIndexMax到RowIndexMin步骤-1 工作代码 使用最大-最小行的子delline() Const RowIndexMin长度=12'顶部第一行。B12=>第12行。 Const ColumnB_索引长度=2 只要你决定 将RowIndexMax设置为底部最后一行的“长” Dim RowIndex作为每个循环中的Long“已更改 返回复位时出错 UserDecision=MsgBox(“您确定要删除所选行吗?”,vbYesNo+vbQuestion,“不返回点”)“您可以组合vb-枚举;) 如果是,那么 退出Sub只是我避免不必要嵌套的方法。 如果结束 '一些speet增强设置 Application.ScreenUpdating=False Application.Calculation=xlCalculationManual Application.EnableEvents=False RowIndexMax=单元格(RowIndexMin,ColumnB_索引)。结束(xlDown)。行 对于RowIndex=RowIndexMax到RowIndexMin步骤-1'步骤-1将每个循环的RowIndex减少1 如果单元格(行索引、列索引).Value2=True,则 调试。打印“删除行:”&行索引 行(行索引)。删除 如果结束 下一个 “真的应该消失了。假象应该浮到顶部。 重置: Application.EnableEvents=True Application.Calculation=xlCalculationAutomatic'假设它在开始时是自动的 Application.ScreenUpdating=True 端接头
在您的代码中,您应该将
应用程序设置为。屏幕更新
为假
,这会对性能产生巨大的影响,但一定要在完成后将其设置回真
Sub delline()
Application.ScreenUpdating = False
If (MsgBox("Are you sure you wish to delete the selected rows?", _
vbYesNo, "Point Of No Return") = vbYes) Then
For Each b In Range("B12", Range("B12").End(xlDown))
For Each a In Range("B12", Range("B12").End(xlDown))
If a.Value = True Then
a.EntireRow.Delete
End If
Next a
Next b
End If
Application.ScreenUpdating = True
End Sub
编辑
如果您所要做的只是严格删除列B中值为FALSE的行,则可以使用以下代码。我已经测试过了,效果很好。它将删除B12之前(包括B12)的所有行
编辑2
这是使用直接值复制方法,与上述所有方法相比速度非常快
Sub test1()
Dim LastRow As Long
Dim LastRow2 As Long
Application.ScreenUpdating = False
With ActiveSheet
LastRow = .Cells(.Rows.Count, "B").End(xlUp).Row
For i = LastRow To 12 Step -1
If (.Range("B" & i).Value = False) Then
LastRow2 = Sheets("Sheet2").Cells(.Rows.Count, "B").End(xlUp).Row + 1
Sheets("Sheet2").Range("B" & LastRow2).Value = .Range("B" & i).Value
' .Range("B" & i).EntireRow.Delete
End If
Next i
End With
Application.ScreenUpdating = True
End Sub
除非您需要行中的所有数据,否则我建议使用这个;或者也可以将这些行中的其他数据添加到循环中。哪种方法会快得多查看这个问题的答案,了解多种方法:我还是有点新,以前从未见过这种方法。你能再解释一下吗?谢谢,我试试看。这是否意味着我可以摆脱第二个“for”语句,或者我只是在完成之前禁用尝试更新屏幕?@benmazor我已经更新了我的答案请查看编辑,这更有效,可以消除您的错误我已经测试了2433行,耗时约55秒,如果您真的想要高效的东西,我建议做一个直接的值提取并用它创建一个新的表,它的速度非常快,可能不到2秒。编辑:我刚刚测试了我在这里提到的提取方法,它花费了0.2秒
第一次编辑效果最好,第二次编辑不起作用,我将sheet2固定到Main,但什么都没有发生,但是您的第一次编辑效果非常好,谢谢
Sub test1()
Dim LastRow As Long
Application.ScreenUpdating = False
If (MsgBox("Are you sure you wish to delete the selected rows?", _
vbYesNo, "Point Of No Return") = vbYes) Then
With ActiveSheet
LastRow = .Cells(.Rows.Count, "B").End(xlUp).Row
For i = LastRow To 12 Step -1
If (.Cells(i, "B").Value = True) Then
.Cells(i, "B").EntireRow.Delete
End If
Next i
End With
End If
Application.ScreenUpdating = True
End Sub
Sub test1()
Dim LastRow As Long
Dim LastRow2 As Long
Application.ScreenUpdating = False
With ActiveSheet
LastRow = .Cells(.Rows.Count, "B").End(xlUp).Row
For i = LastRow To 12 Step -1
If (.Range("B" & i).Value = False) Then
LastRow2 = Sheets("Sheet2").Cells(.Rows.Count, "B").End(xlUp).Row + 1
Sheets("Sheet2").Range("B" & LastRow2).Value = .Range("B" & i).Value
' .Range("B" & i).EntireRow.Delete
End If
Next i
End With
Application.ScreenUpdating = True
End Sub