Return to VBA Code Examples

VBA 動的配列(ReDim & ReDim Preserve)

このチュートリアルでは、VBAで動的配列(redimおよびredim preserve)を使用する方法を説明します。

動的配列

動的配列は、サイズを変更できる配列です。(サイズを変更できない静的配列とは対照的です。)

動的配列を宣言するには、サイズを省略して配列を宣言します。

Dim strNames() As String

次に、配列に値を代入する前に、ReDim ステートメントを使用して、配列を希望のサイズに設定する必要があります。

ReDim strNames(1 to 3)

これで、配列のサイズを変更したくなったら、いつでもReDim(または後述するReDim Preserve)を使用すればよいことになります。

動的なVariant配列

注意:Variant配列は少し違います。Variant配列では、値を代入する前にReDimで配列のサイズを設定する必要はありません。

Sub TestArray()
'変数を宣言
    Dim varNames() As Variant
'配列に値を入れる
    varNames() = Array("Fred", "Wilma", "Barney", "Betty")
'値を返す
    MsgBox Join(varNames, ",")
End Sub

RedimとRedim Preserveの比較

ReDimステートメントは配列のサイズを変更し、既存の値をすべてクリア します。 ReDim Preserveステートメントは、配列のサイズを変更しますが、既存のすべての値を保持(preserve)します。

ReDimの使用

実際に、ReDimを使って配列のサイズを変更すると、次のようになります。

Sub TestReDim()
'文字列配列を宣言する
   Dim strNames() As String
'文字列配列を3つの値を保持できるようにリサイズする
   ReDim strNames(1 to 3)
'配列に3つの名前を入力する
   strNames(1) = "佐藤"
   strNames(2) = "山田"
   strNames(3) = "高橋"
'結果をイミディエイトウィンドウに表示する
   Debug.Print Join(strNames, vbCrLf)
End Sub

vba redim output 1

ReDim Preserveの使用

この例では、ReDimを使って動的配列の初期値を設定し、ReDim Preserveを使って元の値を 維持したまま配列のサイズを変更します。

Sub TestReDim()
'文字列配列を宣言する
   Dim strNames() As String
'文字列配列を3つの値を保持できるようにリサイズする
   ReDim strNames(1 to 3)
'配列に値を入れる
   strNames(1) = "佐藤"
   strNames(2) = "山田"
   strNames(3) = "高橋"
'結果をイミディエイトウィンドウに表示する
   Debug.Print Join(strNames, vbCrLf)
'ReDimを行うが、データを保存する
   ReDim Preserve strNames(1 To 4)
   strNames(4) = "鈴木"
'結果をイミディエイトウィンドウに表示する
   Debug.Print Join(strNames, vbCrLf)
End Sub

vba redim output 2

PRESERVEステートメントを使わないと、それまで配列に入っていたデータが失われてしまいます。

vba redim output 3

上のウィンドウでは、配列に佐藤、山田、高橋が格納されていましたが、再宣言すると、これらの値は削除され、代わりに3つの空白と、値「鈴木」が返されました。 これはPRESERVEステートメントが省略されていたためです。

vba-free-addin

VBA Code Examples Add-in

Easily access all of the code examples found on our site.

Simply navigate to the menu, click, and the code will be inserted directly into your module. .xlam add-in.

(No installation required!)

Free Download

Return to VBA Code Examples