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の違いを正しく理解する
配列を初期化したいとき、
Erase と ReDim のどちらを使うべきか迷うことがあります。
・Eraseを使うべきケース
- 配列の役割が完全に終わった
- サイズを含めてリセットしたい(動的配列)
- 再度ReDimする前提の処理
・ReDimを使うべきケース
- サイズを指定し直したい
- 初期化と同時に要素数を決めたい
- 処理の流れを明示したい
ReDim data(1 To 10)
は、
「ここからこのサイズで使います」
という意思表示としても機能します。
可読性の観点では、
Erase → ReDim をセットで使う設計が好まれます。
Erase や ReDim をどう使い分けるかは、
配列を「どこで宣言し、どこまで生かすか」という設計判断と密接に関係します。
変数のスコープを曖昧にしたまま配列を再定義すると、
意図しない初期化やデータ消失を招くことがあります。Dim・Private・Public の違いを整理し、
配列や変数の寿命を正しく設計する考え方は、こちらで詳しく解説しています。
【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 と組み合わせる 配列再設計パターン や
実務でよくある失敗例 も深掘りできますが、いかがでしょうか。