对于循环删除行不起作用,需要多次运行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