Excel VBAでCurrentRegionを使わず可変行だけClearContentsする方法|列を限定して安全に削除するコツ

Visual Basic

Excel VBAでデータ範囲を一括クリアしたい時、よく使われるのがCurrentRegionです。しかし、表の右側に別データが存在する場合、想定外の列までClearContentsされてしまうことがあります。

特に「B列の行数が増減する」「E列からJ列だけ消したい」「K列以降は残したい」といったケースでは、CurrentRegionだけに頼ると危険です。

この記事では、可変行に対応しながら必要な列だけ安全にClearContentsする方法を整理します。

CurrentRegionでK列まで消えてしまう理由

CurrentRegionは、空白行・空白列で囲まれた範囲全体を取得します。

つまり、E列から始めても途中に空白列が無ければK列まで同じ「ひとつの表」と判定されます。

例えば以下のコード

Range("E3").CurrentRegion.ClearContents

この場合、E3を含む連続範囲全体が対象になります。

CurrentRegionは便利ですが、「必要な列だけ消す」用途には向かない場合があります。

可変行に対応する基本的な考え方

B列の行数が増減するなら、最終行を取得して範囲を指定する方法が定番です。

例えば、B列の最終行を取得するコードです。

Dim lastRow As Long
lastRow = Cells(Rows.Count, "B").End(xlUp).Row

これでB列の最終データ行を取得できます。

その後、E列からJ列だけを対象にClearContentsします。

おすすめのClearContents方法

実際によく使われる書き方は以下です。

Dim lastRow As Long

lastRow = Cells(Rows.Count, "B").End(xlUp).Row

Range("E3:J" & lastRow).ClearContents

これなら、B列のデータ量に合わせてE〜J列だけクリアできます。

K列以降には影響しません。

なぜこの方法が安全なのか

CurrentRegionは「表全体」を自動判定しますが、列範囲指定なら対象を固定できます。

方法 特徴
CurrentRegion 範囲自動取得で便利
列指定Range 必要列だけ安全に処理可能

業務VBAでは、後者の「列を明示する方法」がよく使われます。

色付きセルだけ消したい場合

質問内容に「色のついた部分」とある場合、セル色を条件に処理したいケースもあります。

その場合はFor Eachでセルを回す方法があります。

Dim c As Range

For Each c In Range("E3:J" & lastRow)
    If c.Interior.ColorIndex <> xlNone Then
        c.ClearContents
    End If
Next

これなら色付きセルだけ内容を消せます。

ただし、大量データでは処理速度が少し落ちます。

UsedRangeを使う方法との違い

VBAではUsedRangeを使う方法もありますが、不要セルまで認識していることがあります。

そのため、「どこまでデータがあるか」を明確にしたい場合は、特定列の最終行取得が安定しやすいです。

実務でよくある失敗

初心者がよくやる失敗として、以下があります。

  • CurrentRegionで別表まで消す
  • EntireRowで行全体を消す
  • Clearで書式まで消す
  • 最終行取得列を間違える

特にClearとClearContentsは意味が違います。

メソッド 内容
Clear 書式も削除
ClearContents 値だけ削除

通常はClearContentsの方が安全です。

今後さらに安定化するならテーブル化も便利

もしデータ範囲が頻繁に増減するなら、Excelテーブル(ListObject)化する方法もあります。

テーブル化すると、データ範囲管理がかなり楽になります。

ただし、既存VBAとの兼ね合いもあるため、まずは最終行取得+列指定から始めるのがおすすめです。

まとめ

CurrentRegionは便利ですが、右側の列まで含まれてしまうため、部分的なClearContentsには向かない場合があります。

特に「B列の行数が変動する」「E〜J列だけ消したい」という場合は、最終行を取得して列範囲を明示する方法が安全です。

まずは以下の形を基本として使うと、想定外の列削除を防ぎやすくなります。

Range("E3:J" & lastRow).ClearContents

コメント

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