宣言 ReDimステートメント

※より実装に近く表示させる為、コードの改行を避けています。スマホ等で閲覧される際は向きを変えてご覧ください。

※実装するバージョンによってはバージョンアップの仕様により動作しないコードもあります。実装には動作確認の上ご使用下さい。

ReDim ステートメント

動的配列変数に対するメモリ領域の再割り当てを行います。プロシージャ レベルで使用します。

  • 構文

  • ReDim [Preserve] varname(subscripts) [As type] [, varname(subscripts) [As type]] . . .
  • ReDim ステートメントの構文は、次の指定項目から構成されます。
  • 指定項目 内容

  • Preserve
    省略可能です。既存の配列に格納されている値を失うことなく、配列の最後の次元の要素数を変更する場合に使用する、キーワードです。
  • varname
    必ず指定します。宣言する変数の名前です。変数の標準的な名前付け規則に従って指定します。
  • subscripts
    必ず指定します。配列変数の次元を指定します。指定できる次元数の最大値は 60 です。
  • subscripts
  • 引数 subscripts の構文は、次のとおりです。
  • [lower To] upper [,[lower To] upper] . . .
  • 引数 lower を省略した場合
    、配列の添字の最小値は Option Base ステートメントによって制御されます。Option Base ステートメントが記述されていなければ、添字の最小値は 0 になります。
  • type
    省略可能です。変数のデータ型を指定します。バイト型 (Byte)、ブール型 (Boolean)、整数型 (Integer)、長整数型 (Long)、通貨型 (Currency)、単精度浮動小数点数型 (Single)、倍精度浮動小数点数型 (Double)、10 進型 (Decimal) (現在はサポートされていません)、日付型 (Date)、文字列型 (String) (可変長の場合は String、固定長の場合は String * length)、オブジェクト型 (Object)、バリアント型 (Variant)、ユーザー定義型、またはオブジェクトの種類のいずれかを指定できます。As type 節は、宣言する各変数に対して個別に指定します。バリアント型 (Variant) で配列を格納する場合、引数 type で指定するのは配列の各要素のデータ型です。この引数でバリアント型をほかのデータ型に変えることはできません。
  • 解説

  • ReDim ステートメント
    は、動的配列を宣言したり、Private、Public、または Dim の各ステートメントにおいて、次元の添字を省略した空のかっこだけを指定して宣言されている動的配列の、要素数や次元数を変更するときに使います。
  • ReDim ステートメント
    は、配列の要素数や次元数を変更するために何回でも使うことができます。ただし、バリアント型 (Variant) に格納されている配列を除き、一度あるデータ型で宣言された配列のデータ型を ReDim ステートメントで別のデータ型に変更することはできません。配列がバリアント型に格納されている場合、As type 節を使用して要素のデータ型を変更できます。ただし、キーワード Preserve を使用している場合は、データ型の変更は許可されません。
  • キーワード Preserve
    を指定した場合、変更できるのは、動的配列の最後の次元のサイズに限られます。また、次元数は変更できません。たとえば、次元が 1 つしかない動的配列の場合、その次元は最後のただ 1 つの次元なので、その次元のサイズを変更できます。次元が 2 つ以上ある動的配列の場合、最後の次元のサイズのみを変更でき、その配列に格納されている値は保持されます。ただし、ほかの次元の大きさは変更できません。次の例では、既に格納されている値を保持したまま、動的配列の最後の次元のサイズを増やします。
  • ReDim X(10, 10, 10)
  • ReDim Preserve X(10, 10, 15)
  • キーワード Preserve
    を使用した場合、動的配列のサイズを変更するために変えられるのは、添字の上限だけです。添字の下限を変更しようとすると、エラーが発生します。
  • 配列のサイズ
    を小さくすると、削除された配列の要素に格納されていた値は、失われます。プロシージャに配列を参照渡しで引き渡した場合、プロシージャ内で配列の再定義を行うことはできません。
  • 変数の初期化時
    には、数値変数は 0 に、可変長文字列は長さ 0 の文字列 ("") に初期化されて、固定長文字列には 0 が埋められます。また、バリアント型 (Variant) 変数は Empty 値に初期化されます。ユーザー定義型変数の各要素は、個別の変数として初期化されます。オブジェクトを参照する変数には、あらかじめ Set ステートメントで既存のオブジェクトを代入しておく必要があります。既存のオブジェクトを代入するまで、オブジェクト変数には、特殊な値である Nothing が格納されています。これは、オブジェクト変数がオブジェクトの特定のインスタンスを参照していないことを表す値です。
  • メモ

  • 宣言した変数
    がモジュール レベルまたはプロシージャ レベルにない場合、ReDim ステートメントは宣言ステートメントと同様の働きをします。同じ名前を持つほかの変数が後で作成されると、その変数の適用範囲 (スコープ) が広く、Option Explicit ステートメントが指定されている場合でも、ReDim ステートメントは後で作成された変数を参照し、コンパイル エラーは発生しません。このような名前の競合を避けるには、ReDim ステートメントは宣言ステートメントとして使わず、配列を再定義するためだけに使用します。
  • メモ

  • バリアント型 (Variant) に格納された配列のサイズを変更するには、まず最初にバリアント型変数を明示的に宣言する必要があります。

ReDim ステートメントの使用例

次の例では、ReDim ステートメントを使って、動的配列変数を保存するメモリ領域の割り当てと再割り当てを行います。Option Base ステートメントには、1 が設定されているものとします。
Dim MyArray() As Integer        ' 動的配列を宣言します。
ReDim MyArray(5)                ' 5 要素分の領域を割り当てます。
For i = 1 To 5                  ' 5 回、ループします。
    MyArray(i) = i              ' 配列を初期化します。
Next i

次のステートメントは、配列のサイズを変更して、以前の要素を消去します。

ReDim MyArray(10)               ' 配列の要素数を 10 に変更します。
For i = 1 To 10                 ' 10 回、ループします。
    MyArray(i) = i              ' 配列を初期化します。
Next i

次のステートメントでは、以前の要素を消去せずに、配列のサイズを変更します。

ReDim Preserve MyArray(15)
                                ' 配列の要素数を 15 に変更します。

 

2000年01月01日|[VBサンプルコード]:[宣言]