ReDim ステートメント (Visual Basic)

更新 : 2007 年 11 月

配列変数のストレージ領域を再割り当てします。

ReDim [ Preserve ] name(boundlist) [ , name(boundlist) [, ... ] ]

指定項目

  • Preserve
    省略可能です。最後の次元の大きさを変更するときに、配列に既に格納されている値をそのまま保持しておく必要がある場合に指定する修飾子です。

  • name
    必ず指定します。配列変数の名前を指定します。宣言された要素の名前 を参照してください。

  • boundlist
    必ず指定します。再定義する配列の各次元の境界を示すリストを指定します。

解説

ReDim ステートメントを使用すると、既に宣言された配列の 1 つ以上の次元のサイズを変更できます。使用している大きな配列の一部の要素が不要になった場合、ReDim を使って配列のサイズを減らし、メモリを解放できます。逆に、配列の要素を増やす必要がある場合は、ReDim を使って要素を追加できます。

ReDim は、配列だけに使用するためのステートメントです。スカラ (1 つの値のみを格納する変数) 、コレクション、または構造体に使用することはできません。変数を Array 型で宣言する場合、新しい配列を作成するための十分な型情報は ReDim ステートメントにありません。

ReDim キーワードを使用できるのはプロシージャ レベルだけです。つまり、変数の宣言コンテキストはプロシージャであることが必要で、ソース ファイル、名前空間、インターフェイス、クラス、構造体、モジュール、またはプロシージャでは宣言できません。詳細については、「宣言コンテキストと既定のアクセス レベル」を参照してください。

規則

  • 修飾子Preserve 修飾子だけを指定できます。この修飾子を指定する場合は、ReDim キーワードを省略できません。

  • **複数の変数。**同じ宣言ステートメントで複数の配列変数のサイズを変更できます。配列変数ごとに name および boundlist の各項目を指定します。複数の変数を指定するときは、コンマ (,) で区切ります。

  • **配列の境界。**boundlist の各エントリには、次元の下限と上限を指定できます。下限は、指定してもしなくても、常に 0 です。上限は、次元のサイズではなく添え字に指定できる最大の値です (次元のサイズは上限に 1 を加えた値です)。添え字には、0 から上限値までの値を使用できます。

    boundlist 内の次元数は、元の配列のランクと一致している必要があります。

  • 空の配列。-1 を使って配列の次元の上限を宣言できます。これは、配列は空であるが、Nothing (Visual Basic) ではないことを意味します。詳細については、「方法 : 要素を持たない配列を作成する」を参照してください。ただし、Visual Basic のコードではこのような配列に正しくアクセスできません。アクセスしようとすると、実行時に IndexOutOfRangeException エラーが発生します。

  • データ型ReDim ステートメントは、配列変数または配列要素のデータ型を変更できません。

  • 初期化ReDim ステートメントには、配列要素を初期化する新しい値を指定できます。

  • **ランク。**ReDim ステートメントで配列のランク (次元数) を変更することはできません。

  • **Preserve を使ったサイズ変更。**Preserve キーワードを使用すると、配列の最後の次元だけをサイズ変更できます。他の各次元については、既存の配列と同じ境界を指定する必要があります。

    たとえば、次元が 1 つしかない配列の場合、その次元はただ 1 つの次元なので、その次元のサイズを変更しても配列の内容を保持できます。しかし、次元が 2 つ以上ある配列の場合に Preserve キーワードを指定すると、最後の次元のサイズだけを変更できます。

  • **プロパティ。**ReDim ステートメントは、値の配列を保持するプロパティに対して使用できます。

動作

  • **配列の置換。**ReDim ステートメントは既存の配列を解放し、同じランクを持つ配列を新規作成します。配列変数の中で、新しい配列は、解放された配列に置き換わります。

  • **Preserve を使わない初期化。**Preserve を指定しない場合、ReDim は、新しい配列の要素をそのデータ型の既定値で初期化します。

  • **Preserve を使った初期化。**Preserve 修飾子を指定した場合、Visual Basic では、既存の配列から新しい配列に要素がコピーされます。

使用例

まず配列内の既存のデータを保持しながら動的配列の最後の次元のサイズを増加し、次に一部のデータを喪失しながらサイズを小さくするコード例は、次のとおりです。最終的に、このコードではサイズを元の値にまで縮小し、すべての配列要素を再初期化します。

Dim intArray(10, 10, 10) As Integer
ReDim Preserve intArray(10, 10, 20)
ReDim Preserve intArray(10, 10, 15)
ReDim intArray(10, 10, 10)

最初の ReDim は、新しい配列を作成し、変数 intArray 内の既存の配列に置き換えます。ReDim は、既存の配列からすべての要素を新しい配列にコピーします。また、各次元においてすべての行の最後に 10 列を追加し、それらの列の要素を 0 (この配列の要素の型である Integer の既定値) に初期化します。

2 番目の ReDim ステートメントでは、別の配列を新規作成し、そこに収まるすべての要素をコピーします。ただし、各次元の各行の最後から 5 列分が失われます。これらの列が未使用の場合は問題ありません。大規模な配列のサイズを縮小することで、不要になったメモリを解放できます。

3 番目の ReDim は、別の新しい配列を作成し、各次元においてすべての行の最後からさらに 5 列分を削除します。今回は、既存の要素をコピーしません。これで、配列は元のサイズに戻り、すべての要素は元の既定値に戻ります。

参照

処理手順

方法 : 要素を持たない配列を作成する

概念

ReDim ステートメント (Visual Basic 6.0 ユーザー向け)

配列サイズの宣言 (Visual Basic 6.0 ユーザー向け)

参照

Const ステートメント (Visual Basic)

Dim ステートメント (Visual Basic)

Erase ステートメント (Visual Basic)

Nothing (Visual Basic)

IndexOutOfRangeException