基于Excel VBA中的词典值删除Excel中的行

时间:2017-05-03 12:11:13

标签: excel vba excel-vba dictionary

我仍然进入VBA,目前我正在尝试执行以下操作: - 根据存储在字典中的值删除Excel工作表中的行。

我有这段代码:

For Each Key In dict.Keys
    i = Key
    Cells.Rows(i).Delete
Next

之前我填写了字典。这个想法是"键"存储存储特定值的所有行号,例如" 1"。

使用for each我想删除存储在字典中的所有行,但是一旦删除Excel中的行,数字就会改变。例如,字典中的第一个存储值是5,因此每个将删除第5行。字典中的第二个值是10,现在当每个试图删除第10行时,它删除第10行,它在原始文件曾经是第11行。基本上每个都无法删除正确的行。

正如我所说,我是VBA的新手,我甚至不确定这是否是正确的方法,或者在这种情况下有比词典更好的东西。我期待着听到您的想法和建议。

提前谢谢!

更新:由Ambie和sktneer解决。检查答案。

2 个答案:

答案 0 :(得分:2)

您可以尝试这样的事情......

Dim rng As Range
Dim it

For Each it In dict.keys
    If rng Is Nothing Then
        Set rng = Range("A" & it)
    Else
        Set rng = Union(rng, Range("A" & it))
    End If
Next it
If Not rng Is Nothing Then
    rng.EntireRow.Delete
End If
End Sub

答案 1 :(得分:1)

我不确定我是否会对Dictionary感到烦恼。毕竟,Range是一个集合,所以可能只考虑将所有目标行放入一个范围内并在该范围内运行“批量”删除。它比通过循环行删除要快得多:

Dim delRng As Range, srcRng As Range, cell As Range

'Loop through the range containing your criterion test
With Sheet1
    Set srcRng = .Range(.Cells(1, "A"), .Cells(.Rows.Count, "A").End(xlUp))
End With

For Each cell In srcRng.Cells
    If cell.Value2 = 1 Then 'change to your criterion
        'It's a hit so add the cell to our delete range
        If delRng Is Nothing Then
            Set delRng = cell
        Else
            Set delRng = Union(delRng, cell)
        End If
    End If
Next

'Delete the rows
If Not delRng Is Nothing Then delRng.EntireRow.Delete