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
: 該当行を削除します。
コードを実行する際の注意点
- データをバックアップ
- 行削除は取り消しができないため、必ず処理前にデータを保存してください。
- 対象列の確認
- このコードはA列を対象にしています。他の列を対象にする場合は、列番号を変更してください。
- パフォーマンスの考慮
- 大量のデータを処理する場合、行削除が遅くなることがあります。この場合は配列を使うなど、代替手段も検討してください。
※離れた行を削除するやり方はこちら
おわりに
この記事では、逆順ループを使った行削除の方法を紹介しました。このテクニックを覚えることで、効率的かつ安全にデータ処理が行えるようになります。**「逆順にループを回す」**という概念は他の場面でも応用可能ですので、ぜひ活用してください!
1件のコメント
コメントは受け付けていません。