Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 对于循环,删除行不会';无法工作,需要多次运行宏_Vba_Excel_For Loop - Fatal编程技术网

Vba 对于循环,删除行不会';无法工作,需要多次运行宏

Vba 对于循环,删除行不会';无法工作,需要多次运行宏,vba,excel,for-loop,Vba,Excel,For Loop,工作环境:Excel 2013 目标:通过过滤第2行中的内容来删除不必要的列 我的想法是,只要第2行中的内容是 物理位置或 PLC标签名称或 测试步骤1/2/3/4/5/6/7 保留这些列,否则将其删除 我的问题是,我需要多次运行此宏以删除所有不必要的列。它应该从1循环到40,只留下我想要的列。我不知道为什么它不起作用。 有人能帮我吗?谢谢 我的代码: Sub Reorder() Rows(1).Insert shift:=xlShiftDown For i = 1 To

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

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

  • 物理位置
  • PLC标签名称
  • 测试步骤1/2/3/4/5/6/7
保留这些列,否则将其删除

我的问题是,我需要多次运行此宏以删除所有不必要的列。它应该从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

如果删除循环中的行,则需要从底部开始。否则,实际删除行下面的行数将减少一行,而
i
将增加一行(从循环中),因此总的来说,您将错过一行

而不是

For i = 1 To 40
使用

向后循环


旁注:(thx至@A.S.H)
您应该使用完全限定的范围/单元格/行/列,并且永远不要使用工作表。还可以使用OptionExplicit声明所有变量

所以

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

循环从40到1。只是为了完整性;限定第一行
工作表(“Sheet4”)。第(1)行。插入shift:=xlShiftDown
(以避免另一个问题;)@Peh谢谢!我甚至没有意识到我需要向后循环。现在我知道了。@A.S.H也谢谢你!在开始时保持良好的习惯对每个人都是好的。再次感谢你们两位!哈,还有改进的地方;我刚刚意识到完全没有必要有两个循环,这样我们可以大大减少运行时间。因此,如果这只是一个helper列,您甚至可以省略将
1
写入第1列。
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