Excel VBAで配列を動的に変更する方法のまとめ

Excel VBAで配列を動的に変更する方法のまとめ

Posted at April 8,2014 12:55 AM
Tag:[Excel, VBA]

Excel VBAで配列を動的に変更する方法のまとめです。

1.配列の基本

動的変更の説明の前に、静的な配列変数の定義は次のように行います。

Sub Test()
    Dim foo(2) As String
    foo(0) = "a"
    foo(1) = "b"
    foo(2) = "c"
End Sub

通常の変数宣言と同様、Dimで宣言し、変数名の直後に配列変数の「0から数えたときの上限値」を指定します。

    Dim foo(2) As String

上記の例では「2」を設定しているので、配列のサイズは「3」になります。

宣言時に上限値を設定しているので、処理の中でいつでも配列に値を設定することができます。

    foo(0) = "a"
    foo(1) = "b"
    foo(2) = "c"

2.ReDimで配列のサイズを設定する

処理の途中で配列のサイズを設定する場合、DimとReDimを組み合わせます。

Sub Test()
    Dim foo() As String
 
    '処理...
 
    ReDim foo(2)
    foo(0) = "a"
    foo(1) = "b"
    foo(2) = "c"
End Sub

ReDimを使って要素数を指定する場合、最初の宣言ではカッコのみ記述し、上限値は設定しません。

    Dim foo() As String

上限値を設定して後続のReDimを行うと「配列は既に宣言されています」というコンパイルエラーになります。

コンパイルエラー

その後、ReDimで上限値を指定します。

    ReDim foo(2)

上限値を設定すれば配列に値を設定することができます。

    foo(0) = "a"
    foo(1) = "b"
    foo(2) = "c"

3.Preserveで変更前の内容を保持する

処理の途中で配列のサイズを動的に増やす場合、サイズを変更したときに、

  • 配列の内容を保持する
  • 配列の内容を保持しない

の2通りを選択できます。

サイズを変更したときに配列の内容を保持する場合、ReDimにPreserveを与えます(赤色部分)。

Sub Test()
    Dim foo() As String
 
    ReDim foo(2)
    foo(0) = "a"
    foo(1) = "b"
    foo(2) = "c"
 
    ReDim Preserve foo(5)
    MsgBox foo(0)
End Sub

上記のサンプルを実行すると、MsgBoxで指定したfoo(0)の内容「a」が表示されます。

逆に、サイズを変更したときに配列の内容を保持しない場合、ReDimにPreserveを与えません。

Sub Test()
    Dim foo() As String
 
    ReDim foo(2)
    foo(0) = "a"
    foo(1) = "b"
    foo(2) = "c"
 
    ReDim foo(5)
    MsgBox foo(0)
End Sub

上記のサンプルを実行すると、MsgBoxで指定したfoo(0)では何も表示されません。

4.配列のサイズを動的に減らす

3項の逆で、ReDimを使って配列のサイズを動的に減らすことも可能です。

Sub Test()
    Dim foo() As String
 
    ReDim foo(2)
    foo(0) = "a"
    foo(1) = "b"
    foo(2) = "c"
 
    ReDim Preserve foo(1)
End Sub

減らす場合、上限値を超えた元の要素にアクセスすることはできません。

上記の例では、上限値「2」を「1」に減らしたあと、foo(2)にアクセスすることはできません。

また、Preserveの使い方は動的に増やす場合と同様です。

5.配列のサイズを動的に増やすサンプル1

for文の中で配列のサイズを動的に増やすサンプルを示します。

Sub Test()
    Dim i As Integer
    Dim foo() As String
 
    For i = 0 To 9
        ReDim Preserve foo(i)
        foo(i) = i
    Next i
 
    For i = 0 To UBound(foo)
        MsgBox foo(i)
    Next i
End Sub

6.配列のサイズを動的に増やすサンプル2

処理の中で配列のサイズが不明な場合、UBoundを使って配列のサイズを1つ増やすサンプルを示します。

Sub Test()
    Dim i As Integer
    Dim foo() As String
 
    '処理...
 
    Dim size As Integer
    size = UBound(foo)
    ReDim Preserve foo(size + 1)
    foo(size + 1) = "OK"
End Sub

UBound関数で配列変数fooの上限値を取得し、変数sizeに保持します。

    size = UBound(foo)

「上限値+1」でReDimを実行します。

    ReDim Preserve foo(size + 1)

「上限値+1」の要素に値を設定します。

    foo(size + 1) = "OK"
関連記事
zenback
人気エントリー
トラックバックURL


コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字イタリックアンダーラインハイパーリンク引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)