VBAで配列を初期化する方法

VBAで配列を初期化する方法

公開: 更新:
CodeCampが提供するDX人材育成が可能なプログラミングやITが学べる公開講座

VBAを用いて大量のデータを処理する際、配列の活用は欠かせない要素です。変数を個別に用意する手間が省けるため、コードの記述量を大幅に削減する効果が期待できます。

この記事では、固定長配列(静的配列)と動的配列の初期化方法に加え、Array関数やForループを使った値の代入方法、Eraseステートメントによる要素のリセット手順まで、VBAの配列操作に必要な知識を一通り解説する記事です。

配列を正しく動作させるには、適切な初期化の手順を踏む必要があります。用途に応じて使い分ける2つの宣言方法を確認しましょう。


VBAで配列を初期化する基本的な方法

VBAで配列を初期化する基本的な方法

VBAの配列には、作成時に要素数を決める静的なタイプと、後から変更できる動的なタイプの2種類が存在します。プログラムの設計に合わせて選択するのが一般的です。

それぞれの初期化における特徴を、以下の表に整理しました。

項目 静的配列 動的配列
要素数の決定 宣言時に固定 実行時に変更可能
主なステートメント Dim ReDim
サイズ変更の可否 不可(宣言後は固定) ReDimで再定義可能

ReDimによる再定義は、既存の配列領域を解放してから新しいサイズを確保する処理です。実行回数が多い処理では負荷につながる場合があるため、要素数や再定義の頻度をあらかじめ検討しておくと安心です。

Dimステートメントで静的配列を定義する

静的配列は、扱うデータの個数があらかじめ確定している場合に利用します。宣言時に括弧内へ要素数を記述し、メモリ領域を確保する仕組みです。

具体的な宣言方法と代入の書き方は、以下のコードの通りです。

Dim numbers(4) As Long
numbers(0) = 10
numbers(4) = 50

要素の番号は基本的に0から始まります。例えば「(4)」と指定した場合は、0番から4番までの合計5つの要素が用意される点に注意しましょう。

ただし、この既定の下限はOption Baseステートメントの指定によって変わるため、0始まりを確実に保証したい場合はDim numbers(0 To 4) As Longのように下限を明示して宣言すると安全です。

下限を明示する書き方には、以下のようなメリットがあります。

  • メモリの管理が容易で予期せぬエラーを防げる
  • コードの記述がシンプルになり読みやすい
  • インデックスの範囲が固定されるため安全性が高い

宣言と同時にデータ型を明示するのが定石です。これにより、配列内に格納されるデータの種類が統一され、デバッグ作業の効率が高まるメリットが得られます。

ReDimステートメントで動的配列を再定義する

取り扱うデータの件数が実行中に変動するケースでは、動的配列を選択します。最初は括弧内を空にして宣言を行い、具体的な数値が決まった段階でサイズを割り当てる手順です。

基本的な宣言とサイズ変更の書き方は、以下のコードの通りです。

Dim numbers() As Long
ReDim numbers(2)
numbers(0) = 1
numbers(1) = 2
numbers(2) = 3

サイズの変更が必要になった際は、再度命令を出すことで領域を拡張します。ただし、通常の再定義では格納済みの値が消去される仕様です。

Preserveキーワードを併用すると、既存のデータを保持したまま要素数を増やせます。具体的な書き方は、以下のコードの通りです。

ReDim Preserve numbers(4)
numbers(3) = 4
numbers(4) = 5

ただし、Preserveを使う際に変更できるのは配列の最後の次元の上限のみという制約があります。多次元配列で先頭側の次元やサイズを変更したい場合は、Preserveを使わずに配列を作り直すか、別の変数へ値を移し替える、以下の手順が必要です。

  1. Dim変数の括弧を空にして動的配列を宣言
  2. プログラムの途中でデータ件数を算出
  3. ReDimを用いて必要なサイズを割り当て

頻繁にサイズを変更すると処理が重くなる傾向にあります。そのため、あらかじめ余裕を持った数を設定するか、変更回数を最小限に抑える工夫が有効です。

これは、頻繁な再定義がメモリ確保のたびに発生し、プログラム全体のパフォーマンスを低下させる要因になるためです。


Python研修一覧はこちら

目的に合うPython研修を一覧形式から探したい方は、ぜひご利用ください。

Python研修を比較する

Java研修一覧はこちら

目的に合うJava研修を一覧形式から探したい方は、ぜひご利用ください。

Java研修を比較する

PHP研修一覧はこちら

目的に合うPHP研修を一覧形式から探したい方は、ぜひご利用ください。

PHP研修を比較する

新入社員研修

目的に合う新入社員研修を一覧形式から探したい方は、ぜひご利用ください。

新入社員研修を比較する

全ての研修からも探したい方はこちら

VBAの配列要素を一括でクリアする手順

VBAの配列要素を一括でクリアする手順

配列内のデータを整理する際は、個別に値を代入するよりも専用の命令を使うほうが、コードの記述量を抑えられて効率的だといえます。

Eraseステートメントで値をリセットする

VBAには配列全体を一度に初期化するための専用コマンドが用意されています。これを使用すると、要素数が多い場合でも一瞬で処理が完了するのがメリットです。

具体的な書き方は、以下のコードの通りです。

Dim numbers(4) As Long
numbers(0) = 10
Erase numbers

Eraseステートメントを実行すると、以下のような挙動を示します。

  • 固定長配列の場合は各要素の値が初期値(数値型なら0、可変長文字列なら長さ0の文字列)に戻ります
  • 動的配列の場合はメモリ領域そのものが解放される仕組みです
  • 個別のループ処理が不要なため、コードの記述を簡略化できます

ただし、String * 10のように長さを指定した固定長文字列の要素は、空文字列になるのではなく指定した長さを保ったままヌル文字でリセットされる仕様です。オブジェクト型など他のデータ型の初期値も、代表的な例として押さえておくと想定外の挙動を防げます。

大量のデータを扱うマクロでは、処理の節目でこの命令を使いデータをリセットするのが一般的です。メモリの効率的な利用にもつながります。

配列変数のメモリを完全に解放する

プログラムの実行速度や安定性を保つためには、不要になった配列のメモリを適切に管理することが求められます。配列の種類によってクリア後の状態が異なる点に注意が必要です。

配列の種類 Erase実行後の挙動 再利用時の注意点
固定長配列 要素の値のみが初期化される 要素数は変わらずそのまま維持されます。
動的配列 メモリ領域が完全に解放される 再度使用する前にReDimでの再定義が必須です。

動的配列をクリアした後は、配列に割り当てられていたメモリ領域が解放され、要素へアクセスできない未割り当ての状態です。そのため、再利用時には必ずReDimでサイズを再指定する必要があります。

解放後に再利用する場合の書き方は、以下のコードの通りです。

Dim numbers() As Long
ReDim numbers(2)
numbers(0) = 1
Erase numbers
ReDim numbers(4)
numbers(0) = 100

このように配列の状態を正しく把握することが、エラーのないスムーズなプログラム開発の土台となります。適切なタイミングでのリセットを習慣化しましょう。


Python基礎・実践(Django)

企業・法人向けのPython研修では、基礎から応用まで体系的に学べます。

Python研修の詳細

DX社員研修

企業・法人向けのDX研修では、実務に繋がるリスキリングでITレベルを向上させます。

DX研修の詳細

Javaエンジニア育成研修

企業・法人向けのJavaエンジニア育成研修では、Javaの基礎から応用まで確実に習得できます。

Java研修の詳細

新卒・新入社員向け研修

企業・法人に新入社員・新卒社員に向けたプログラミング研修を提供しています。

新入社員研修の詳細

コードキャンプのIT研修を全て見る

VBAで特定の値を代入して配列を初期化する

VBAで特定の値を代入して配列を初期化する

配列を作成した直後は、要素の中に具体的な値が入っていない状態です。特定の値をあらかじめ準備しておく初期化作業には、主に2つのアプローチが存在します。

用途に応じて手法を使い分けるのが、スムーズなプログラム作成のコツです。それぞれの特徴を整理した比較表を確認しましょう。

初期化の手法 適したケース メリット
Array関数 項目名や定数など、決まった値を少数入れるとき 記述が短く直感的に値を指定できる
Forループ 連番や規則的なデータ、大量の要素を扱うとき 柔軟な代入処理を自動化できる

扱うデータの性質や件数に合わせてどちらかを選べば、無駄のない初期化処理を実装できます。以降のH3で、それぞれの具体的な書き方を確認しましょう。

Array関数を使って要素を生成する

Array関数は、引数に指定した値を順番に格納した配列を生成する仕組みです。Variant型の変数に対して、複数のデータを一括で割り当てる際に重宝します。

具体的な書き方は、以下のコードの通りです。

Dim fruits As Variant
fruits = Array("apple", "orange", "banana")
Debug.Print fruits(0)

利用時の主な特徴は以下の通りです。

  • カンマ区切りで値を並べるだけで代入が完了する
  • 添字(インデックス)の最小値はOption Baseステートメントの指定によって変わる
  • 文字列や数値など、異なる種類のデータを混在させる運用も可能

Option Baseを指定していない場合、添字は0から始まりますが、モジュールにOption Base 1が記述されているとArray関数の下限も1に変わります。常に0始まりを保証したい場合は、VBA.Arrayを使用するか、LBound関数で実際の下限を確認してから処理する方法が安全です。

コードの行数を抑えつつ、少ない手順で決まった初期値をまとめてセットしたい場面に適した選択肢だといえるでしょう。

Forループで各要素に初期値を格納する

決まった規則に基づいて値を代入したい場合は、Forループによる繰り返し処理が力を発揮します。インデックス番号を変数として扱い、各要素へ順番にアクセスする手法です。

具体的な書き方は、以下のコードの通りです。

Dim numbers(4) As Long
Dim i As Long
For i = LBound(numbers) To UBound(numbers)
    numbers(i) = i * 10
Next i

この方法には次のような利点があります。

  • 1から100までの連番など、規則的な数値を一瞬で格納できる
  • 条件分岐と組み合わせて、特定の要素のみ値を変更する制御が容易
  • 動的配列のサイズが実行時に決まる場合でも柔軟に対応できる

一括処理による効率化が、この手法の最大の魅力です。ループの範囲をLBoundUBoundで取得しておけば、Option Baseの設定に関わらず代入漏れを防ぐ構造を構築できます。

VBAの配列初期化に関するよくある質問

配列をNothingで初期化することは可能ですか?

VBAの配列はオブジェクト変数と異なり、Nothingを代入して初期化することはできません。参照を破棄するNothingの代入は、クラスインスタンスなどオブジェクト型変数専用の操作です。

配列のメモリ領域そのものを完全に解放したい場合は、Nothingではなく代わりにEraseステートメントを使用してください。

多次元配列を一度に初期化する方法はありますか?

宣言済みの多次元配列を一括で埋める標準機能はVBAにありません。基本的には、ネストしたForループを使って各要素へ値を代入する必要があります。

1次元の範囲で足りる場合はArray関数でも代用できますが、多次元配列を直接生成する機能ではない点に注意してください。

動的配列の要素数だけをリセットしたい場合はどうすればよいですか?

動的配列の要素数を維持または変更しながら中身をすべて空にするには、Preserveキーワードを付けずにReDimを実行してください。この操作により、配列内のすべての値がデータ型に応じた初期値にリセットされます。

ITやプログラミングに関するコラム


ITやプログラミングに関するニュース

ブログに戻る

コメントを残す

コメントは公開前に承認される必要があることにご注意ください。

企業・法人向けのIT・プログラミング・生成AI研修を探す、比較する - IT・プログラミングを知って学べるコネクトメディア CodeCampが提供するDX人材育成が可能なプログラミングやITが学べる公開講座 - IT・プログラミングを知って学べるコネクトメディア コードキャンプが提供する無料で学べるプログラミングスクール講座 - IT・プログラミングを知って学べるコネクトメディア コードキャンプDX人材育成研修 - IT・プログラミングを知って学べるコネクトメディア 3.5日の研修で、年間1,600時間の削減効果が見込まれる。東京きらぼしフィナンシャルグループのDX人材育成事例 - IT・プログラミングを知って学べるコネクトメディア 配属3ヶ月で30%の生産性向上を実現するいよぎんコンピュータサービスの新人研修に迫る - IT・プログラミングを知って学べるコネクトメディア 金融業界の業務効率化を加速するニッセイアセットマネジメントの生成AI×GAS活用研修事例 - IT・プログラミングを知って学べるコネクトメディア 【製造業のDX人材育成事例】デジタル人材の即戦力化を実現する、日本ガイシ株式会社の異動者向オンボーディング研修 - ITやプログラミングを知って学べるコネクトメディア フューチャーアーキテクト株式会社が実現した新入社員向けIT研修プログラムでタスクフォース制度が主体的な学びと成長を生み出す - IT・プログラミングを知って学べるコネクトメディア コードキャンプDX人材育成研修 - IT・プログラミングを知って学べるコネクトメディア コードキャンプIT・プログラミング研修事例/【IT新入社員研修】オンラインとオフラインの最適バランスを実現したFutureOneの導入事例 - IT・プログラミングを知って学べるコネクトメディア コードキャンプIT・プログラミング研修事例/【新入社員研修】柔軟なハイブリッド型Java研修で実現した新卒20名の成長と成果|サークレイス株式会社 - ITやプログラミングを知って学べるコネクトメディア コードキャンプIT・プログラミング研修事例/現場により近いところにデジタルを根付かせるDX基礎講座研修|株式会社ブリヂストン - ITやプログラミングを知って学べるコネクトメディア コードキャンプIT・プログラミング研修事例/業務の効率化・DX推進に向けたIT人材育成への第一歩|株式会社カナエ - ITやプログラミングを知って学べるコネクトメディア 企業・法人向けのIT・プログラミング研修 - ITやプログラミングを知って学べるコネクトメディア

新着記事

対象者別で探す

子供(小学生・中学生・高校生)向け
プログラミング教室検索する

子供(小学生・中学生・高校生)がロボットやプログラミング言語を学ぶことができるオフラインからオンラインスクールを検索、比較することが可能です。

子供(小学生・中学生・高校生)
プログラミング教室検索する

ITやプログラムなどの
最新情報を検索する

日々、新しいITやプログラミング言語の情報が流れていきますが、特定の情報を時系列でニュースやコラムを確認することができます。

ITやプログラムなどの
最新情報を検索する