2017-04-17 16 views
3

約1000行を含む範囲の行を削除するサブルーチンがあります。 行はcriteraで削除されます。 以下のコードは動作します。Excel VBAは、forループの行を削除する行を逃します。

しかし、マクロを実行すると、通常は削除基準を含むすべての行が削除される前に4回実行する必要があります。

これは、行を削除するときに行が突然消えてしまったときにforループがインデックスを見落としているためです。

私の最初のコードはこのように見えます。

Set StatusRange = Range("B2", Range("B2").End(xlDown)) 

     For Each StatusCell In StatusRange 
        If StatusCell = "FG" Then 
         StatusCell.EntireRow.Delete 
        ElseIf StatusCell = "QC" Then 
         StatusCell.EntireRow.Delete 
        ElseIf StatusCell = "CS" Then 
         StatusCell.EntireRow.Delete 
        Else 
       End If 
    Next StatusCell 

各ループの範囲を更新しようとすると、まだ動作しません。

Set StatusRange = Range("B2", Range("B2").End(xlDown)) 
    For Each StatusCell In StatusRange 
      If StatusCell = "FG" Then 
       StatusCell.EntireRow.Delete 
      ElseIf StatusCell = "QC" Then 
       StatusCell.EntireRow.Delete 
      ElseIf StatusCell = "CS" Then 
       StatusCell.EntireRow.Delete 
      Else 
     End If 

     Set StatusRange = Range("B2", Range("B2").End(xlDown)) 
     Next StatusCell 

これにsloutionを知っている人はいますか?ありがとう。

+1

作業tehのボトムアップから。あなたが行を削除すると、すべてが上に移動し、上の行をスキップyuou次の繰り返しです – Jeeped

+1

これはほぼ確実に重複した質問ですが、適切な重複が見つかったらそれをマークします。コレクションからアイテムを削除するときは、必ずRows.Countから1ステップ-1を削除する必要があります –

+0

この@DavidZemensを欺く - 複数の比較のためにCaseステートメントを表示することによっていくつかの価値を追加しましたが、これは依然として欺瞞です。 – Jeeped

答えて

6

下から上に向かって作業します。行を削除すると、すべてが上に移動し、次の反復でその行をスキップします。

ここでは、下から処理するコードの '勇気'です。

With Worksheets("Sheet1") 
    For rw = .Cells(.Rows.Count, "B").End(xlUp).Row To 2 Step -1 
     Select Case UCase(.Cells(rw, "B").Value2) 
      Case "FG", "QC", "CS" 
       .Rows(rw).EntireRow.Delete 
     End Select 
    Next rw 
End With 
+0

私は文字通り同じ答えを書いていました( 'Case'文で完全)haha:D –

+0

ちょっと、ちょうど同じコードを入力して投稿したところです。 –

1

あなたがわずかに異なるアプローチを使用する必要がFor Eachのためのリバースループはありませんので。また、あなたの複数持つコードIf sおよびORは「Select Caseの使用のために叫んさ

Dim StatusRange As Range 
Dim i As Long 

Set StatusRange = Range("B2", Range("B2").End(xlDown)) 

' loop backward when deleting Ranges, Rows, Cells 
For i = StatusRange.Rows.Count To 1 Step -1 
    Select Case StatusRange(i, 1).Value 
     Case "FG", "QC", "CS" 
      StatusRange(i, 1).EntireRow.Delete 
     Case Else ' for the future if you need it 

    End Select 
Next i 
関連する問題