VBAで自動化 VBA一覧 配列 配列・データ操作

【VBA】VBAの配列内容を削除するEraseステートメント

Excel VBAで配列を使った処理を書いていると、
「一度使った配列をリセットしたい」「次の処理で前回のデータを持ち越したくない」
と感じる場面が必ず出てきます。

このとき、
変数に空文字を代入したり、
配列を再宣言したりして対応していませんか。

VBAには、配列専用に用意された削除(初期化)命令として
Erase ステートメントがあります。
ただし、この Erase
使い方を誤るとエラーや意図しない挙動を招きやすい のも事実です。

この記事では、
Excel VBAにおける Erase ステートメントの基本から、
動的配列・固定長配列での違い、
実務で安全に使うための設計判断までを、丁寧に解説します。

✅ Eraseステートメントとは何か

Erase ステートメントは、
配列の内容を削除(初期化)するためのVBA専用命令です。

一見すると単純ですが、
「配列そのものが消えるのか」
「中身だけが消えるのか」
を正しく理解していないと、後工程でつまずきます。

特に実務では、
ループ処理・再利用・例外処理と組み合わさるため、
理解が曖昧なまま使うと、原因不明の不具合になりがちです。

・Eraseの基本的な役割

Erase は、
配列変数に格納されている要素の値を初期状態に戻す命令です。

  • 数値型 → 0
  • 文字列型 → 空文字
  • オブジェクト型 → Nothing

というように、型ごとの既定値に戻されます。


✅ 固定長配列でのEraseの挙動

まずは、サイズが決まっている固定長配列から見ていきます。

固定長配列では、
Erase配列のサイズを維持したまま、中身だけを初期化します。

・固定長配列の基本例

Dim numbers(1 To 5) As Long

numbers(1) = 10
numbers(2) = 20

Erase numbers

この場合、

  • 配列の要素数(1 To 5)はそのまま
  • 各要素の値がすべて 0 に戻る

という挙動になります。

・なぜサイズが維持されるのか

固定長配列は、
コンパイル時点でメモリサイズが確定しています。

そのため Erase では、
領域を解放せず、中身だけを初期化する設計になっています。

実務では、
「同じ構造の配列を何度も使い回す」
といった場面で、この挙動が有効です。


✅ 動的配列でのEraseの挙動

ここが最も誤解されやすいポイントです。

動的配列に対する Erase は、
配列の中身だけでなく、サイズ情報そのものも破棄します。

・動的配列の基本例

Dim data() As String
ReDim data(1 To 10)

data(1) = "A"

Erase data

この処理後、
data は「未割り当て状態」に戻ります。

つまり、

  • 要素数は存在しない
  • 再利用するには ReDim が必要

という状態になります。

・この挙動を知らないと起きるトラブル

Erase の後に、

data(1) = "B"

のようなコードを書くと、
インデックスが有効範囲にありません というエラーが発生します。

実務では、
「配列を消したつもりが、そのまま使ってしまう」
というミスが非常に多いので注意が必要です。


✅ EraseとReDimの違いを正しく理解する

配列を初期化したいとき、
EraseReDim のどちらを使うべきか迷うことがあります。

・Eraseを使うべきケース

  • 配列の役割が完全に終わった
  • サイズを含めてリセットしたい(動的配列)
  • 再度ReDimする前提の処理

・ReDimを使うべきケース

  • サイズを指定し直したい
  • 初期化と同時に要素数を決めたい
  • 処理の流れを明示したい
ReDim data(1 To 10)

は、
「ここからこのサイズで使います」
という意思表示としても機能します。

可読性の観点では、
EraseReDim をセットで使う設計が好まれます。

EraseReDim をどう使い分けるかは、
配列を「どこで宣言し、どこまで生かすか」という設計判断と密接に関係します。
変数のスコープを曖昧にしたまま配列を再定義すると、
意図しない初期化やデータ消失を招くことがあります。
DimPrivatePublic の違いを整理し、
配列や変数の寿命を正しく設計する考え方は、こちらで詳しく解説しています。
【VBA】Dim・Private・Publicの使用方法|変数・プロシージャのスコープを理解


✅ 複数配列をまとめてEraseする方法

Erase は、
複数の配列を一度に初期化することもできます。

・複数指定の例

Dim arr1() As Long
Dim arr2() As Long

ReDim arr1(1 To 5)
ReDim arr2(1 To 3)

Erase arr1, arr2

このように記述することで、
関連する配列をまとめてリセットできます。

実務では、
「同じ処理単位で使っている配列」を
セットで管理すると、保守性が高まります。


✅ 実務で安全にEraseを使うための設計ポイント

Erase は便利ですが、
使いどころを誤るとコードが壊れやすくなります。

・処理の区切りで使う

ループの途中や、
条件分岐の奥深くで Erase を使うと、
後続処理が配列を前提にしている場合に事故が起きます。

Erase は、

  • 処理の開始前
  • 処理の終了後

など、区切りの良い場所で使うのが基本です。

・Nothing代入との使い分け

オブジェクト配列の場合、
個別に Nothing を代入するより、
Erase を使った方が意図が明確になります。

「配列としての役割が終わった」
という意味をコードで表現できるためです。

Nothing を代入する場面では、
「そもそも今の変数がどの状態なのか」を正しく把握しておくことが重要です。
未初期化なのか、Null なのか、Nothing なのかを誤解したまま処理を書くと、
予期せぬエラーや判定ミスにつながります。
IsEmpty / IsNull / IsNothing の違いと正しい使い分けは、
以下の記事で詳しく整理しています。
【VBA】IsEmpty / IsNull / IsNothing の違いを徹底解説|未初期化・Null・Nothingを正しく見分けよう


✅ 応用:配列を使い回す設計か、破棄する設計か

実務では、
配列を「毎回作り直す」か
「使い回す」かの判断が重要です。

  • サイズが固定で高速性重視 → 使い回し(固定長+Erase)
  • データ量が変動する → 破棄+ReDim(動的配列)

この判断を曖昧にすると、
処理速度・可読性・保守性のすべてが中途半端になります。


 

✅ まとめ:Eraseは「配列の役割終了」を示す命令

  • Erase は配列専用の初期化命令
  • 固定長配列 → サイズ維持・中身のみ初期化
  • 動的配列 → サイズ情報ごと削除される
  • ReDim との使い分けが設計の要
  • 処理の区切りで使うと安全性が高い

Erase を正しく使えるようになると、
配列処理の設計が一段クリアになります。

「とりあえず消す」ではなく、
「この配列の役割はここで終わる」
とコードで示せるようになると、
VBAの保守性と再利用性は確実に向上します。

必要であれば、
Erase と組み合わせる 配列再設計パターン
実務でよくある失敗例 も深掘りできますが、いかがでしょうか。

    -VBAで自動化, VBA一覧, 配列, 配列・データ操作