[VBA]逆順に後ろから前に回すFor Next Step-1

Excel VBAのコードを書くとき、行や列を処理する際に**逆順(後ろから前)**で操作することが必要になることがあります。特に、行の削除のような処理では、逆順にループを回すことがエラーを防ぎ、効率的に動作させる秘訣です。本記事では、実際に行削除のVBAコードを例にして、初心者にもわかりやすく解説します。

なぜ逆順にループを回すのか?

Excel VBAで行を削除する場合、行を削除するとその下の行が繰り上がるため、通常の順番でループを回すと誤動作が起こります。

たとえば、以下のようなデータがあるとします。

この状態で、上から順番に「部長」を含む行を削除しようとすると、3行目を削除した時点で、4行目のデータが3行目に繰り上がり、処理対象から漏れてしまいます。

これを防ぐために、最終行から最初の行に向かって逆順でループを回す方法が効果的です。

実際のコード例

以下に、逆順ループを使って特定の文字列を含む行を削除するコード例を示します。

Sub DeleteRowsContainingText()

Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
Dim searchText As String

' 使用するシートを指定
Set ws = ThisWorkbook.Sheets("Sheet1")

' 検索する文字列
searchText = "部長"

' 最終行を取得
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

' 下から順番に検査
For i = lastRow To 1 Step -1
    If InStr(ws.Cells(i, 1).Value, searchText) > 0 Then
        ws.Rows(i).Delete
    End If
Next i

MsgBox "文字列を含む行の削除が完了しました。"

End Sub

コードの解説

1.初期設定

Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
Dim searchText As String

  • ws: 操作対象のシートを格納する変数
  • lastRow: A列の最終行番号を格納する変数
  • i: ループ用のカウンター
  • searchText: 検索する文字列(ここでは「部長」)

2.使用するシートを指定

Set ws = ThisWorkbook.Sheets(“Sheet1”)

処理対象のシートをSheet1に設定しています。

3. 最終行を取得

lastRow = ws.Cells(ws.Rows.Count, “A”).End(xlUp).Row

このコードは、A列のデータがある最後のセルを見つけ、その行番号を取得します。最終行を正確に把握することで、不要な行まで処理してしまうミスを防ぎます。

4. 逆順にループを回す

For i = lastRow To 1 Step -1
    If InStr(ws.Cells(i, 1).Value, searchText) > 0 Then
        ws.Rows(i).Delete
    End If
Next i
  • For i = lastRow To 1 Step -1: ループを最終行から1行目まで、1つずつ減らしながら実行します。
  • InStr: セル内に指定した文字列(searchText)が含まれているかを調べます。含まれていれば0以外を返します。
  • ws.Rows(i).Delete: 該当行を削除します。

コードを実行する際の注意点

  1. データをバックアップ
    • 行削除は取り消しができないため、必ず処理前にデータを保存してください。
  2. 対象列の確認
    • このコードはA列を対象にしています。他の列を対象にする場合は、列番号を変更してください。
  3. パフォーマンスの考慮
    • 大量のデータを処理する場合、行削除が遅くなることがあります。この場合は配列を使うなど、代替手段も検討してください。

※離れた行を削除するやり方はこちら

おわりに

この記事では、逆順ループを使った行削除の方法を紹介しました。このテクニックを覚えることで、効率的かつ安全にデータ処理が行えるようになります。**「逆順にループを回す」**という概念は他の場面でも応用可能ですので、ぜひ活用してください!

1件のコメント

コメントは受け付けていません。