Vba 案例循环在删除所有值之前终止

Vba 案例循环在删除所有值之前终止,vba,excel,Vba,Excel,我是VBA新手,我试图让我的代码在K行中循环大约10000行整数,并根据值删除行。我的代码可以工作,但一次只能完成一小部分。请告知 'Delete unwanted accounts Dim Lcell As Long Application.ScreenUpdating = False Lcell = TransSheet.Cells(Rows.Count, "K").End(xlUp).Row For a = 1 To Lcell Step 1 Select Case Cells(a,

我是VBA新手,我试图让我的代码在K行中循环大约10000行整数,并根据值删除行。我的代码可以工作,但一次只能完成一小部分。请告知

'Delete unwanted accounts
Dim Lcell As Long
Application.ScreenUpdating = False
Lcell = TransSheet.Cells(Rows.Count, "K").End(xlUp).Row
For a = 1 To Lcell Step 1
   Select Case Cells(a, 11).Value
      Case "1200", "652", "552"
         Cells(a, 11).EntireRow.Delete
   End Select
Next a
Application.ScreenUpdating = True

试着从最后一行到第一行。您正在删除行,因此您的编号被取消:

'Delete unwanted accounts
Dim Lcell As Long
Application.ScreenUpdating = False
Lcell = TransSheet.Cells(Rows.Count, "K").End(xlUp).Row
For a = Lcell To 1 Step -1
   Select Case Cells(a, 11).Value
      Case "1200", "652", "552"
         Cells(a, 11).EntireRow.Delete
   End Select
Next a
Application.ScreenUpdating = True

将这一行添加到代码中

Cells(a, 11).EntireRow.Delete
a = a - 1
这将处理由于行消失而发生的移位


另一方面,我个人使用以下方法删除多行。e、 g.我要删除的行存储在
变量
数组
DelRows()
中。您可以在运行时动态获取它们。这里我手动分配一些随机行

Sub DeleteRows()
    Dim DelRows() As Variant
    ReDim DelRows(1 To 3)

    DelRows(1) = 15
    DelRows(2) = 18
    DelRows(3) = 21

    '--- How to delete them all together?

    Dim i As Long
    For i = LBound(DelRows) To UBound(DelRows)
        DelRows(i) = DelRows(i) & ":" & DelRows(i)
    Next i

    Dim DelStr As String
    DelStr = Join(DelRows, ",")

    ' DelStr = "15:15,18:18,21:21"

    ActiveSheet.Range(DelStr).Delete
End Sub

您可以对所有标识的行执行单个删除:

'Delete unwanted accounts
Dim rngDel as range
Dim Lcell As Long, v

Lcell = TransSheet.Cells(Rows.Count, "K").End(xlUp).Row

For a = 1 To Lcell 
   v = Cells(a, 11).Value
    If v = "1200" or v = "652" or v = "552" Then
        If Not rngDel is Nothing Then
            Set rngDel = Application.Union(rngDel, Cells(a, 11).EntireRow)
        Else
            Set rngDel = Cells(a, 11).EntireRow    
        End If
    End If
Next a

If Not rngDel Is Nothing Then rngDel.Delete

与其操纵迭代器变量,不如向后迭代:)我认为这是一种有效的方法:递减增量变量使其与行集合保持同步(每个
.Delete
.Count
减少1),但我认为这是低效的(循环内不必要的额外操作)这也可能是一个坏习惯,因为我们通常只对i=…执行一个
,并使用一个迭代器
i
作为索引对多个对象并行执行不同的操作,在这种情况下,您可能会得到不想要的结果,除非您为每个被迭代的对象添加另一个变量。当然,这是另一种方法,但就我个人而言,我不会使用它。
For/Each
构造是通用的,因此无论是删除工作表中的行、字典中的键或集合中的项等,您都会使用相同/类似的方法。此外,除非您事先知道需要删除的内容,否则您似乎必须对集合进行迭代。是的,因此,与此示例不同,生产代码首先遍历工作表以创建要删除的行的通用字符串,然后在单个操作中删除它。这比逐行执行要复杂一些,但是在Excel中删除是一个非常昂贵的操作,对于性能密集型的内容,它有时会有所帮助。但是+1 abt点regd对/Each
构造重新定义
的值。您看到timwilliams的答案了吗?这是另一个简洁的方法。重复:使用
Application.Union()的漂亮步骤