2017-05-12 11 views
1

作業環境で実行する必要があります。Excelを2013
対象:行のコンテンツをフィルタリングすることにより、不要な列を削除します。2.
は、マクロを複数回

私の考えはようにということです長い行2中の含有量は

  • Physical Location又は
  • PLC Tag Name又は
  • のいずれかであるように、

は、そうでない場合はそれを削除し、それらの列を保持します。

私の問題は、私はすべての不要な列を削除するには、このマクロを複数回実行する必要があるということです。 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 
+1

ループ。 。最初の行 'ワークシート( "シート4")を修飾する行(1)シフト.Insert:= xlShiftDown'(別の質問を避けるために;)) – BrakNicku

答えて

3

あなたがループ内の行を削除した場合、あなたは下から開始する必要があります。それ以外の場合は、実際削除された行ずつ減少し、i下の行の行番号が(ループから)1つ増加しますので、合計で次の行を欠場します。

代わりのループに

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 

下位。


サイドノート:あなたは完全修飾範囲/セル/行/列を使用してワークシートを想定するべきではありません
(@ A.S.HにTHX)。また、明示的なオプションを使用してすべての変数を宣言します。

したがって

Rows(1).Insert shift:=xlShiftDown 
'... 
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
+0

から –

+0

@Pehの感謝を!私は後ろ向きにループする必要があることに気づいていません。今私は知っている。 –

+1

@ A.S.H良い習慣をいくつか改善しました。 –