删除列循环VBA

我通过While循环表,所以当我在第一行中findstring“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 

删除行或列时,您总是需要向后循环。 否则当前的行/列位置在删除期间改变。

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

 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 

我还build议声明所有variables,并始终使用 Option Explicit

答案已经发布,你需要从最后删除,而不是从开始。 但为什么? 让图像你有五列,你想删除列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(而且我们正在倒退),这并不重要。 希望有助于理解一下:-)