🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

Excel VBA の Clear — ClearContents と Clear と Delete、そして空文字列の罠

|

Excel VBA の Clear — ClearContents と Clear と Delete、そして空文字列の罠

TL;DR — 「セルをクリアする」単一の方法はありません。.ClearContents値と数式を消し、書式は 残します — 9 割方これがほしいものです。.Clearすべて を消し、書式も罫線も含むので、セルを 工場出荷時の空白に戻すときだけ使います。.ClearFormats は書式を消して値を残します。cell.Value = "" の設定は空白では ありませんISBLANK が空でないと読む、長さ 0 の文字列が残ります。そして .Clear.Delete ではありません。Clear はセルをその場で空にし、Delete はそれを取り除いて隣接セルを ずらします。

Range("A2:Z1000").ClearContents   ' データは消え、テンプレート(罫線 / 色 / 書式)は残る
Range("A2:Z1000").Clear           ' すべて消える — これから書式を作り直すことになる
Range("A2:Z1000").ClearFormats    ' 書式は消え、値は残る

Range("A2").Value = ""            ' 空白ではない — 空文字列。ISBLANK は False
Range("A2").ClearContents         ' 本当に空白

誰もがまず .ClearContents を覚え、それから不思議に思います。なぜ .Clear が「罫線を消した」のか、なぜ「空白」のセルがまだ COUNTA に引っかかるのか、なぜ範囲をクリアしたら 3 列離れた数式が壊れたのか。すべては、握っておく価値のある 1 つの考えから来ています。セルは独立した層が積み重なったもので、クリアとはどの層を消すかを選ぶことです。 意図した層に合った消しゴムを選べば、驚きは消えます。

この記事で学べること

  • 考え方の軸 — セルは層であり、クリアはどの層を消すかを選ぶこと
  • .ClearContents.Clear.ClearFormats
  • cell.Value = "" が偽の空白である理由と、本当にセルを空にするもの
  • .Clear.Delete が同義語ではなく、異なる操作である理由
  • シート全体や使用範囲を 1 回の高速な呼び出しでクリアする

考え方の軸:セルは層であり、クリアはどれを消すかを選ぶ

セルは 1 つのものではありません。値または数式表示形式フォントと塗りつぶし罫線条件付き書式入力規則、そして コメント を保持します — 同じセルに積み重なった独立した層です。「clear」という名前のメソッドはありません。あるのはメソッドの一族で、それぞれが選ばれた一部を取り除きます。

Range("A1").ClearContents   ' 消す:値 / 数式        残す:それ以外すべて
Range("A1").ClearFormats    ' 消す:表示形式、フォント、塗りつぶし、罫線   残す:値
Range("A1").Clear           ' 消す:上記すべて

層が見えれば、メソッド名はそのまま「何をするか」として読めます。問いは決して「このセルをどうクリアするか」ではなく、「どの層を消したいか」であり、その答えがメソッドを選びます。

ClearContents 対 Clear 対 ClearFormats

.ClearContents は働き者です。データを消し、テンプレートを残す。 値と数式を取り除き、罫線、色、表示形式、入力規則はそのまま残します — これはまさに「今月分を入力できるよう先月の数値を消す」の意味です。

Range("B2:B50").ClearContents   ' 数値は消え、書式設定された表はまだ表のように見える

.Clear は大ハンマーです。中身 すべての書式の層 — 罫線、塗りつぶし、条件付き書式、入力規則、コメント — を取り除きます。これは VBA で最も多い偶発的な破壊です。書式設定された範囲を「空にする」ために .Clear に手を伸ばし、作り込んだ罫線と色まで消えたことに気づく、というものです。

Range("B2:B50").Clear           ' これで B2:B50 は空白、かつ書式なし — 作り直しの時間

.Clear は、本当に「これらのセルを真新しい、書式のない状態に戻す」と意図するときだけ使いましょう。.ClearFormats は逆向きの外科的な道具です — 書式を剥がし、値を残します — そして単一の層を狙う兄弟があります。.ClearComments.ClearHyperlinks.ClearNotes.ClearOutline です。層を選び、メソッドを選びましょう。

空文字列の罠:空文字列は空白ではない

これは静かなやつです。空文字列を代入しても、セルは空に なりません — 長さ 0 の文字列を格納し、それは値であって、値の不在ではありません。

Range("A1").Value = ""          ' A1 は今や長さ 0 の文字列を保持する
' ISBLANK(A1) は False · COUNTA は A1 を数える · IsEmpty(Range("A1")) は False
Range("A1").ClearContents       ' A1 は今や本当に空
' ISBLANK(A1) は True · COUNTA は A1 を無視する · IsEmpty(Range("A1")) は True

"" に設定されたセルは画面上は空白に見えますが、埋まっているかのように振る舞います。COUNTA はそれを数え、ISBLANKIsEmpty は空でないと報告し、Range.End(xlUp) はそこで止まり、グラフやピボットテーブルはそれをデータとして扱います。これが「セルは空なのに Excel が同意しない」という頭を抱えるバグを生みます。セルを空にするには .ClearContents を使う(または Empty を代入する:Range("A1").Value = Empty)のであって、決して = "" ではありません。本当に空のセルと空文字列の区別は、身につけておく価値が最も高いことの 1 つです。値がどう読み戻されるかは VBA Cell Value を参照してください。

Clear は Delete ではない:アドレスを壊すシフト

.Clear.Delete は同義語のように聞こえますが、違います。.Clear はセルを空にしますが、その場に残します。 .Delete はセルを完全に取り除き、隣接セルを 上または左へずらして穴を埋めます — だから削除より下や右のすべてのアドレスが変わり、動いたセルを指す数式は壊れたり #REF! を返したりします。

Range("A5").ClearContents   ' A5 は空。A6、A7、... はそのまま
Range("A5").Delete Shift:=xlUp   ' A5 は消える。A6 が A5 に、A7 が A6 になり、アドレスがずれる

目的が「このセルを空にする」なら、答えはつねに .ClearContents であり、決して .Delete ではありません。セル、行、または列を実際に 消し たくて、そのシフトこそが狙いのとき — 空行の削除などのとき — だけ .Delete に手を伸ばします。行の削除を安全に行うこと(下から上へループする、EntireRow を使う)はそれ自体が別の話題です。VBA Delete Rows を参照してください。両者を混同することが、「掃除」のマクロが静かにシートをぐちゃぐちゃにする原因です。

シート全体や使用範囲を 1 回の呼び出しでクリアする

クリアは範囲の操作なので、セル単位のループではなく 1 回の呼び出し で行いましょう。ループはセルごとに VBA から Excel へ越境し、大きな範囲では這うように遅くなります。範囲全体への 1 回の呼び出しは単一の操作です(値を読むときと同じ往復の原則 — VBA Cell Value を参照)。

ws.UsedRange.ClearContents               ' シート上のすべてのデータをクリアし、書式は残す
ws.Cells.Clear                           ' シート全体を消す、中身も書式も
Range("A2", Range("A2").End(xlDown)).ClearContents  ' ヘッダーの下にある列のデータをクリアする

UsedRangeCurrentRegion は、範囲の高さをハードコードせずに「データがあるすべて」を対象にします。VBA UsedRange を参照してください。私の経験則:既定は .ClearContents .Clear は工場出荷時へのリセットであって消しゴムではなく、.Delete は構造の外科手術であって消しゴムではなく、= "" は偽の空白のバグです。10 回のうち 9 回、ほしい動詞は .ClearContents で、残りの 1 回は .ClearFormats です。

ExcelMaster の活用

本当に時間を奪うクリアのミスは、静かなものです。テンプレートの罫線まで持っていった .Clear、下流の COUNTA が数え続けた = "" の「空白」、列をずらして 2 枚離れたシートの数式を壊した .Delete。どれも何かをします — ただ、あなたが意図した何かではないだけです。

ExcelMaster は、あなたの意図に合った消しゴムに手を伸ばします。「データはクリアしてレイアウトは残して」と頼めば使用範囲に .ClearContents を使い、「このシートを完全にリセットして」と頼めば .Clear を使います。= "" ではなく .ClearContents でセルを空にするので、あなたの空白は本当に空白になり、実際に行を削除したいときのために .Delete を取っておきます — その下で何もずれないよう下から上へ行います。あなたは何が消えるべきかを言うだけ。セルの残りをそのまま保つメソッドを選ぶのは、それがやります。

よくある質問

VBA の Clear と ClearContents の違いは?

.ClearContents は値と数式だけを取り除き、書式、罫線、表示形式、入力規則を残します。.Clear はすべて — 中身 すべての書式の層 — を取り除きます。テンプレートをそのままにデータを消すには .ClearContents を、セルを完全に空白で書式のない状態に戻したいときだけ .Clear を使いましょう。

VBA でセルの内容をクリアしつつ書式を残すには?

.ClearContents を使います。Range("B2:B50").ClearContents は、罫線、色、表示形式、入力規則をそのままに、値と数式を取り除きます。それらの書式もすべて剥がす .Clear は避け、本当に空のセルではなく長さ 0 の文字列を残す = "" も避けましょう。

VBA でセルに空文字列を設定するのはクリアと同じですか?

いいえ。Range("A1").Value = "" は長さ 0 の文字列を格納し、それは値です。ISBLANK は False を返し、COUNTA はそのセルを数え、IsEmpty は空でないと報告します。セルを本当に空白にするには、Range("A1").ClearContentsRange("A1").Value = Empty を使います。空文字列のセルは空白に見えて、埋まっているかのように振る舞います。

VBA の Clear と Delete の違いは?

.Clear(および .ClearContents)はセルを空にしますが、その場に残すので、周囲のアドレスは変わりません。.Delete はセルを完全に取り除き、隣接セルを上または左へずらして隙間を埋めるので、その下や右のすべてのアドレスが変わり、数式を #REF! で壊すことがあります。セルを空にするには .ClearContents を、消したいときだけ .Delete を使いましょう。

VBA でシート全体や使用範囲をクリアするには?

すべてのデータをクリアしつつ書式を残すには ws.UsedRange.ClearContents を使います。書式も含めてシート全体を消すには ws.Cells.Clear を使います。どちらも 1 回の呼び出しで動き、セル単位のループよりはるかに高速で、UsedRange は範囲サイズをハードコードせずにデータを含む領域をちょうど対象にします。

検証環境

検証環境: Excel 365 (Windows 11), VBA 7.1 — 最終確認 2026-09-01。

関連ガイド: VBA Cell Value · VBA Delete Rows · VBA Copy Paste · VBA UsedRange · VBA Number Format