我通过片段循环播放片段,所以当我找到字符串" 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
答案 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 |
现在你从开始......
开始让我们暂停一会儿。现在让我们看看删除第2列如何改变图片:
Loop direction ---->
Column index in loop: | 1 | 2 | 3 | 4 | 5 |
Original column number: | 1 | 3 | 4 | 5 |
现在你可能会发现出了问题。但是为了这个例子,让我们继续循环:
让我们试着倒退,也许这会有所帮助:
让我们再次暂停,看看它现在的样子
<---- Loop direction
Column index in loop: | 1 | 2 | 3 | 4 | 5 |
Original column number: | 1 | 2 | 3 | 5 |
嗯,确实发生了变化。但是,由于循环的下一步是3(我们正在倒退),它并不重要。希望有助于理解: - )