"For Each... を使用してセルを削除します。Excel の [次へ] ループ

概要

Microsoft Excel 2002 以降のバージョンの Excel では、"For Each... のセルが削除されます。次に、Microsoft Excel 97 以前のバージョンの Excel とは異なる方法でループします。

この記事では、違いについて説明し、ループ内のセルを削除する方法を示すVisual Basic for Applicationsマクロの例を示します。

詳細

Microsoft は、例示のみを目的としてプログラミング例を提供しており、明示または黙示にかかわらず、いかなる責任も負わないものとします。 これには、市販性または特定の目的との適合性についての黙示の保証も含まれますが、これに限定はされません。 この記事は、説明されているプログラミング言語、手順を作成およびデバッグするために使用されているツールに読者が精通していることを前提にしています。 Microsoft のサポート エンジニアが、特定の手順の機能をわかりやすく説明します。 ユーザー固有の要件に合わせた機能の追加、プロシージャの作成などの内容変更は行っておりません。

サンプル データ

この記事のマクロを使用するには、ワークシートに次のサンプル データを入力します。

A1: a B1: 1
A2: b B2: 2
A3: x B3: 3
A4: x B4: 4
A5: c B5: 5
A6: x B6: 6
A7: d B7: 7
A8: x B8: 8
A9: x B9: 9
A10: e B10: 10

サンプル マクロ

新しいマクロ モジュールで、次のマクロを入力します。

Sub DeleteCells()

     'Loop through cells A1:A10 and delete cells that contain an "x."
     For Each c in Range("A1:A10")
        If c = "x" Then c.EntireRow.Delete
    Next

End Sub

Excel 2002 以降のバージョンの Excel でのサンプル マクロの動作

Excel 2002 以降のバージョンの Excel で DeleteCells マクロを実行すると、行 3、6、8 のみが削除されます。 行 4 と 9 には列 A に "x" が含まれますが、マクロでは行は削除されません。 マクロの結果は次のとおりです。

A1: a B1: 1
A2: b B2: 2
A3: x B3: 4
A4: c B4: 5
A5: d B5: 7
A6: x B6: 9
A7: e B7: 10

Microsoft Excel が行 3 を削除すると、すべてのセルが 1 行上に移動します。 たとえば、セル A3 はセル A4 の内容を想定し、セル A4 はセル A5 の内容を前提とします。 For Each..の後。次のループはセルを評価し、次のセルを評価します。したがって、セルがシフトされると、ループによってスキップされる可能性があります。

Microsoft Excel 5.0 および Microsoft Excel 7.0 でのサンプル マクロの動作

Excel 5.0 と Excel 7.0 で DeleteCells マクロを実行すると、"x" を含むすべての行が削除されます。マクロの結果は次のとおりです。

A1: a B1: 1
A2: b B2: 2
A3: c B3: 5
A4: d B4: 7
A5: e B5: 10

行 3 が削除されると、すべてのセルが 1 行上に移動します。 次に、セル A3 はセル A4 の内容を想定し、セル A4 はセル A5 の内容を想定します。

ただし、Excel 2002 以降のバージョンの Excel でのループの動作とは異なり、"For Each...[次へ] ループは Excel 5.0 のセルを評価し、Excel 7.0 では、ループ内で削除されたセルが再評価されます。 したがって、セルはスキップされません。

ループを使用してセルを削除する場合は、次のマクロを使用します。

Sub DeleteCells2()

     Dim rng As Range
     Dim i As Integer, counter As Integer
    
     'Set the range to evaluate to rng.
     Set rng = Range("A1:A10")
    
     'initialize i to 1
     i = 1
    
     'Loop for a count of 1 to the number of rows
     'in the range that you want to evaluate.
     For counter = 1 To rng.Rows.Count
    
          'If cell i in the range contains an "x",
           'delete the row.
           'Else increment i
            If rng.Cells(i) = "x" Then
                rng.Cells(i).EntireRow.Delete
            Else
                i = i + 1
            End If
    
     Next

End Sub

すべてのバージョンの Excel でのこのマクロの結果は次のとおりです。

A1: a B1: 1
A2: b B2: 2
A3: c B3: 5
A4: d B4: 7
A5: e B5: 10

ループを使用してセルを削除するための追加のメソッド

これは、上記のメソッドに代わりの方法です。 このメソッドは同じ結果を生成します。

 Sub DeleteCells3()

     Dim rng As Range, i As Integer

     'Set the range to evaluate to rng.
     Set rng = Range("A1:A10")

     'Loop backwards through the rows
     'in the range that you want to evaluate.
     For i = rng.Rows.Count To 1 Step -1
    
             'If cell i in the range contains an "x", delete the entire row.
             If rng.Cells(i).Value = "x" Then rng.Cells(i).EntireRow.Delete
     Next

End Sub