【VBAリファレンス|実務向け】[VBA実務テクニック] セルの挿入・削除を自動化して動的な表を作成する

スポンサーリンク

導入:なぜVBAで「表のレイアウト」を制御するのか

実務でExcelを扱っていると、毎日届くデータの行数が変わったり、月ごとに列を追加・削除する必要があったりする場面に遭遇します。手動で「右クリックして挿入」を繰り返すのは、ミスの原因になるだけでなく、何より時間がもったいない作業です。
VBAを活用すれば、データ量に応じて自動的に行や列を挿入・削除し、常に最適なレイアウトの表を維持できるようになります。今回は、業務効率を劇的に上げる「表のレイアウト操作」の基本をマスターしましょう。

基礎知識:RangeオブジェクトとInsert・Deleteメソッド

VBAで表のレイアウトを操作する際、中心となるのはRangeオブジェクトです。
行や列を挿入・削除するには、主に以下のメソッドを使用します。

・Insertメソッド:指定した範囲に新しいセル(行・列)を挿入します。
・Deleteメソッド:指定した範囲のセル(行・列)を削除します。

ポイントは「どの範囲を選択して実行するか」です。行全体を操作したい場合は、行の番号を指定したRangeオブジェクトに対してこれらのメソッドを実行します。

実装/解決策:柔軟な行・列操作の考え方

実務では「決まった場所」ではなく、「条件に合致した場所」を操作したいという要望がほとんどです。例えば、「特定のキーワードが見つかったら、その下に新しい行を挿入する」といったロジックです。
これには、Findメソッドで場所を特定し、その位置に対してInsertを実行するという手順を踏みます。

サンプルプログラム:行の挿入・削除を自動化する

以下のコードは、指定したキーワードが含まれる行の「上」に新しい行を挿入し、その後、不要な行を削除する実用的なサンプルです。

Sub LayoutControlSample()
Dim ws As Worksheet
Dim targetRange As Range

Set ws = ThisWorkbook.Sheets(“Sheet1”)

‘ 1. 「合計」という文字が含まれる行を探す
Set targetRange = ws.Columns(“A”).Find(What:=”合計”, LookAt:=xlWhole)

‘ 見つかった場合のみ処理を実行
If Not targetRange Is Nothing Then
‘ 見つかった行の「上」に1行挿入
targetRange.EntireRow.Insert Shift:=xlDown
ws.Cells(targetRange.Row – 1, 1).Value = “新規追加項目”

‘ 2. 「不要」と書かれた行を削除
Dim deleteRange As Range
Set deleteRange = ws.Columns(“A”).Find(What:=”不要”, LookAt:=xlWhole)

If Not deleteRange Is Nothing Then
deleteRange.EntireRow.Delete
End If
End If

MsgBox “レイアウト調整が完了しました。”
End Sub

応用・注意点:現場で陥りやすいバグを回避する

現場で最も多いトラブルは、「ループ処理中に削除を行う際のインデックスズレ」です。
上から順にループして削除していくと、行が詰まってしまい、削除対象を見逃したりエラーになったりします。
注意点:行を削除する場合は、必ず下から上に向かって(Step -1)ループするようにしましょう。また、大量のデータを扱う際は、処理の最後に画面更新を停止する「Application.ScreenUpdating = False」を記述することで、実行速度が格段に向上します。

これらを組み合わせれば、複雑な定型業務も一瞬で終わらせることができます。ぜひ現場の業務に合わせてカスタマイズしてみてください。

タイトルとURLをコピーしました