对于循环删除行不起作用,需要多次运行macros

工作环境:Excel 2013
目标:通过过滤第2行中的内容来删除不必要的列。

我的想法是,只要第2行的内容是

  • Physical Location
  • PLC Tag Name
  • Test Step1/2/3/4/5/6/7

保留这些列,否则删除它。

我的问题是,我需要运行这个macros多次删除所有不必要的列。 它应该从1到40循环,只留下我想要的列。 我不知道为什么它不起作用。 谁能帮我? 谢谢!

我的代码:

 Sub Reorder() Rows(1).Insert shift:=xlShiftDown For i = 1 To 40 WY = Worksheets("Sheet4").Cells(2, i) Select Case WY Case "Physical Location" Worksheets("Sheet4").Cells(1, i) = 1 Case "PLC Tag Name" Worksheets("Sheet4").Cells(1, i) = 1 Case "Test Step1" Worksheets("Sheet4").Cells(1, i) = 1 Case "Test Step2" Worksheets("Sheet4").Cells(1, i) = 1 Case "Test Step3" Worksheets("Sheet4").Cells(1, i) = 1 Case "Test Step4" Worksheets("Sheet4").Cells(1, i) = 1 Case "Test Step5" Worksheets("Sheet4").Cells(1, i) = 1 Case "Test Step6" Worksheets("Sheet4").Cells(1, i) = 1 Case "Test Step7" Worksheets("Sheet4").Cells(1, i) = 1 Case Else Worksheets("Sheet4").Cells(1, i) = 0 End Select Next i For i = 1 To 40 If Worksheets("Sheet4").Cells(1, i) = 0 Then Columns(i).EntireColumn.Delete End If Next End Sub 

如果您在循环中删除行,则需要从底部开始。 否则,实际删除的行下面的行的行数减less一个, i得到一个(从循环)增加,所以总之你错过了一条线。

代替

 For i = 1 To 40 

使用

 For i = 40 To 1 Step -1 If Worksheets("Sheet4").Cells(1, i) = 0 Then Columns(i).EntireColumn.Delete End If Next 

向后循环。


附注: (thx to @ASH)
您应该使用完全限定的范围/单元格/行/列,并且不要假定工作表。 同时使用选项显式声明所有的variables。

因此

 Rows(1).Insert shift:=xlShiftDown '... Columns(i).EntireColumn.Delete 

应该

 Worksheets("Sheet4").Rows(1).Insert shift:=xlShiftDown '... Worksheets("Sheet4").Columns(i).EntireColumn.Delete 

总之,我们结束了

 Option Explicit 'first line in module Public Sub Reorder() Dim i As Long Dim WY As Worksheet Set WY = Worksheets("Sheet4") WY.Rows(1).Insert shift:=xlShiftDown For i = 1 To 40 Select Case WY.Cells(2, i) Case "Physical Location", "PLC Tag Name", "Test Step1", "Test Step2", _ "Test Step3", "Test Step4", "Test Step5", "Test Step6", "Test Step7" WY.Cells(1, i) = 1 Case Else WY.Cells(1, i) = 0 End Select Next i For i = 40 To 1 Step -1 If WY.Cells(1, i) = 0 Then WY.Columns(i).EntireColumn.Delete End If Next End Sub 

或者如果我们只使用一个更快的循环:

 Option Explicit 'first line in module Public Sub Reorder() Dim i As Long Dim WY As Worksheet Set WY = Worksheets("Sheet4") WY.Rows(1).Insert shift:=xlShiftDown For i = 40 To 1 Step -1 Select Case WY.Cells(2, i) Case "Physical Location", "PLC Tag Name", "Test Step1", "Test Step2", _ "Test Step3", "Test Step4", "Test Step5", "Test Step6", "Test Step7" WY.Cells(1, i) = 1 Case Else WY.Columns(i).EntireColumn.Delete End Select Next i End Sub