删除列循环VBA

时间:2017-07-31 12:59:38

标签: excel vba excel-vba

我通过片段循环播放片段,所以当我找到字符串" Out"在第一行中我删除了该行。 问题是,当我删除该列时,下一个列将进入删除位置,因此循环将通过并且不会删除它。

你能帮助我吗?

由于

Sub DeleteCol()

xx = 37
Do While Worksheets("Data").Cells(1, xx) <> ""

Agrup = Worksheets("Data").Cells(1, xx)
Rubri = Worksheets("Data").Cells(2, xx)
If Agrup = "Out" Then
    'Worksheets("Data").Columns(xx).Clear
    Worksheets("Data").Columns(xx).Delete Shift:=xlShiftToLeft
End If
xx = xx + 1
Loop

End Sub

2 个答案:

答案 0 :(得分:3)

删除行或列时,您始终需要向后循环。否则,删除期间当前行/列位置会发生变化。

这是因为删除始终会影响当前行/列之后的行/列的位置,但不会影响之前的位置。因此,向后循环不会影响我们的循环,因为未处理的行/列在 当前行/列之前 受删除影响。

Option Explicit 'very first line to ensure all variable are declared

Public Sub DeleteColumns()
    Dim ws As Worksheet
    Set ws = Worksheets("Data") 'define worksheet

    Dim Argup As Range, Rubri As Range
    Dim iCol As Long, lCol As Long 'iteration column, last column
    Const fCol = 37 'first column

    With ws '<-- use With statement
        lCol = .Cells(1, .Columns.Count).End(xlToLeft).Column 'find last used column

        For iCol = lCol To fCol Step -1 'loop from last column backwards to column 37
            Agrup = .Cells(1, iCol)
            Rubri = .Cells(2, iCol)

            If Argup = "Out" Then
                .Columns(iCol).Delete Shift:=xlShiftToLeft
            End If
        Next iCol
    End With

End Sub

我还建议声明所有变量并始终使用 Option Explicit

答案 1 :(得分:0)

答案已经发布,你需要从最后删除,而不是从开始。但为什么?让图像有五列,并且您想要删除第2列和第4列。在删除之前,这就是列的外观:

Column index in loop:   | 1 | 2 | 3 | 4 | 5 |
Original column number: | 1 | 2 | 3 | 4 | 5 |

现在你从开始......

开始
  • 索引1:什么都不做(按预期)
  • 索引2:删除(按预期)

让我们暂停一会儿。现在让我们看看删除第2列如何改变图片:

                        Loop direction ---->
Column index in loop:   | 1 | 2 | 3 | 4 | 5 |
Original column number: | 1 | 3 | 4 | 5 |

现在你可能会发现出了问题。但是为了这个例子,让我们继续循环:

  • 索引3:什么都不做(但这本来是第4列,应该已删除)
  • 索引4:删除(但最初是第5列,已被删除)
  • 索引5:什么都不做(取决于你的代码,你可能会得到并超出界限错误)

让我们试着倒退,也许这会有所帮助:

  • 索引5:什么都不做(按预期)
  • 索引4:删除

让我们再次暂停,看看它现在的样子

                        <---- Loop direction
Column index in loop:   | 1 | 2 | 3 | 4 | 5 |
Original column number: | 1 | 2 | 3 | 5 |

嗯,确实发生了变化。但是,由于循环的下一步是3(我们正在倒退),它并不重要。希望有助于理解: - )