Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 根据单元格值删除多行,删除滞后_Vba_Excel - Fatal编程技术网

Vba 根据单元格值删除多行,删除滞后

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

我试图创建一个按钮宏,根据“b”列中的真/假值删除行。删除的问题是,一旦删除完毕,“for udo”将跳过后面的一个,因为下面范围内的单元格变为当前单元格。我提出了这个替代方案,但如果大量使用,它会非常滞后。任何建议。另外,我尽量保持代码的简单和干净,我不喜欢太多的变量,因为当我将来不得不回顾和调整时,它会变得混乱。塔克斯

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