【问题标题】:VBA delete cell in for each loopVBA删除每个循环中的单元格
【发布时间】:2020-09-22 08:25:31
【问题描述】:

如果单元格的值为 0,我正在尝试删除每个单元格及其左侧的一个单元格。(此外,如果单元格的值大于,则将内部颜色设置为无填充0.)

这是我目前的代码


For Each cell In Range("I2:I" & LastTransaction)
    If cell.Value = 0 Then
        Range(cell.Offset(0, -1).Address, cell.Address).Delete Shift:=xlUp
    ElseIf cell.Value > 0 Then
        cell.Interior.ColorIndex = 0
    End If
Next cell

这里的问题是,每次删除单元格并向上移动时,for each 循环都不会考虑向上移动,而是跳过范围内的下一个单元格。

【问题讨论】:

  • 因此,我建议要么分别自下而上删除单元格(可能更好)Union 一个范围,然后在一个范围内删除去吧。

标签: excel vba


【解决方案1】:

根据@JvdV 的评论,在循环中删除时,您需要使用Step -1 从后到前(或在本例中从下到上)进行删除。
在这种情况下,您的 For 循环看起来像;

For x = LastTransaction to 2 Step -1
    If Range("I" & x).Value = 0 then
        Range("H" & x & ":I" & x).Delete Shift:=xlUp
    ElseIf Range("I" & x).Value > 0 Then
        Range("I" & x).Interior.ColorIndex = 0
    End If
Next

【讨论】:

    【解决方案2】:

    主要问题是,当您遍历范围时,每个 cell 都指向工作表上的特定单元格。

    所以你的循环循环通过I2, I3, I4, ...。如果删除一行,所有其他行都会上移,单元格 Ix 中的内容现在位于单元格 I(x-1) 中,但循环将在单元格 Ix 中,因此一整行将避免已处理。

    一种解决方案是将所有要删除的行存储在Collection 中,然后删除集合。

    'data
    Cells.Clear
    For i = 1 To 15
        Cells(i, 1) = Int(Rnd * 4)
        Cells(1, i + 2) = Cells(i, 1) 
    Next i
    
    'code
    Dim tbd As New Collection 'to be deleted collection
    For Each c In [a1:a15]
        If c = 1 Then tbd.Add c 'adds a row that is to be deleted
    Next c
    For Each c In tbd
        c.Delete 'deletes all rows in tbd
    Next c
    

    代码的第一部分创建了一些要处理的示例数据。然后它定义了一个新的Collection,将要删除的行添加到其中(任何值为 1 的都是这种情况),然后从集合中删除它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-07
      • 2022-01-21
      • 1970-01-01
      相关资源
      最近更新 更多