【VBA入門】配列の初期化(ReDim、Preserve、Array、Erase)

配列って使ってますか?

配列は同じ型のデータを大量に扱う場合に一つのかたまりとして扱うことができるので便利ですよね。

この記事では、配列について

  • 固定長配列と可変長配列
  • 配列の宣言と定義
  • 配列を初期化する方法
  • 配列を解放(再初期化)する方法
  • 配列の要素数を変更する方法
  • 1次元から2次元配列に変更する場合

など基本的な内容から、応用的な使い方についても解説していきます。

今回は配列について、使い方をわかりやすく解説します。

目次

固定長配列と可変長配列

配列では同じデータ型の変数をたくさん扱う場合に、一つのかたまりとして扱うことができます。

配列内のひとつひとつのデータを要素といいます。それぞれの要素にはインデックス番号(添字)を指定することでアクセスすることができます。

配列を宣言する際に、要素数と次元数が決まっている配列を固定長配列といいます。

これに対して、要素数と次元数が決まっていない配列を可変長配列や動的配列といいます。

配列の宣言と定義

それでは配列を宣言、定義する方法についてみていきましょう。

固定長配列と可変長配列で宣言の方法が少々異なります。

固定長配列の場合

まずは、固定長配列を宣言、定義する方法について説明します。

固定長変数は配列名のあとに「()」(カッコ)を使って下記のように宣言します。

Dim 配列名(添字の下限値 To 添字の上限値) As データ型名

データ型名は要素のデータ型になります。

添字の下限値は下記のように省略して記述することもできます。

Dim 配列名(添字の上限値) As データ型名

省略した場合の下限値は通常0(ゼロ)となります。

なお、固定長配列はこのあと説明するReDimステートメントを使って要素数や次元数を変更することはできませんのでご注意ください!

2次元以上の多次元配列を宣言する場合

2次元以上の多次元の配列を宣言する場合は、次元ごとに「,」(カンマ)で区切って「()」に並べます。

Dim 配列名(添字の上限値, 添字の上限値, ・・・) As データ型名

可変長配列の場合

可変長配列の場合は、宣言時には要素数や次元数は指定しません

処理中に要素数などを再設定します。

可変長配列の宣言と定義は、配列名のあとに「()」を記述し、「()」内には何も記述しません。

Dim 配列名() As データ型名

処理中に配列の要素数や次元数を変更したい場合、ReDimステートメントを使用します。

ReDimステートメントを使った配列の要素数や次元数を指定する方法は下記のとおりで、固定長配列の宣言と同じになります。

ReDim 配列名(添字の上限値, ・・・)

ReDimステートメントを使って配列の要素数などを変更した場合、元のデータはすべて消えてしまいますので注意してください!

また、データ型の変更が可能なのは可変長配列の宣言時にバリアント型で宣言した場合だけになります。データの値を保持したまま配列の要素数を変更したい場合はReDim Preserveステートメントを使用します。

ReDim Preserveステートメントについては後ほど解説します。

配列を初期化する方法

配列は宣言、定義のあとで要素にそれぞれの値を入れて初期化して使う場合が多いです。

配列の初期化の方法についてみていきましょう。

配列を初期化する方法には主に2つの方法があります。

Eraseステートメントを使う方法とArray関数を使う方法です。

Eraseを使って初期化する場合

Eraseステートメントの引数には初期化する配列名を指定します。

Erase 配列名

それぞれのデータ型によって初期値が違います。

  • 数値配列:0(ゼロ)
  • 文字列配列:長さ0(ゼロ)の文字列
  • オブジェクト配列:Nothing
  • バリアント配列:Empty

それぞれの初期値で全要素が設定されます。

それではサンプルコードで確認していきましょう。

Sub macro1()
    Dim arr_int(2) As Integer
    Dim arr_str(2) As String
    
    'Eraseで初期化
    Erase arr_int
    Erase arr_str
    
    '要素の取得と表示
    Dim i As Integer, str As String
    str = "arr_int"
    For i = 0 To 2
        str = str & ", " & arr_int(i)
    Next i
    str = str & vbCrLf & "arr_str"
    For i = 0 To 2
        str = str & ", " & arr_str(i)
    Next i
    
    MsgBox str, vbInformation
End Sub

実行結果:
arr_erase

このサンプルコードでは、Integer型の配列arr_intとString型の配列arr_strを宣言し、Eraseステートメントで初期化しています。

なお配列のそれぞれの要素の値は配列名のあとの「()」内にインデックス番号(添字)を指定すると参照することができます。

Arrayを使って初期化する場合

Eraseステートメントで初期化する場合は、すべての要素が決まった値での初期化でした。

それに対して、Array関数を使う場合は要素の値を別々に指定することができます。

ただし、可変長配列でデータ型はバリアント型に限ります。

Dim 配列名() As Variant
配列名 = Array(要素(0), 要素(1), ・・・)

サンプルコードで確認していきましょう。

Sub macro2()
    Dim arr_int() As Variant
    Dim arr_str() As Variant
    
    'Arrayで初期化
    arr_int = Array(0, 1, 2)
    arr_str = Array("Tokyo", "Osaka", "Nagoya")
    
    '要素の取得と表示
    Dim i As Integer, str As String
    str = "arr_int"
    For i = 0 To 2
        str = str & ", " & arr_int(i)
    Next i
    str = str & vbCrLf & "arr_str"
    For i = 0 To 2
        str = str & ", " & arr_str(i)
    Next i
    
    MsgBox str, vbInformation
End Sub

実行結果:
arr_array

このサンプルコードでは、Variant型の配列arr_intとarr_strを宣言し、Array関数で初期化しています。

それぞれの要素の値を別々に設定できています。

配列を解放(再初期化)する方法

先ほど可変長配列はReDimステートメントを使って要素数などを再設定できると説明しました。

これを使って配列を再初期化することができます。

サンプルコードで確認していきましょう。

Sub macro3()
    Dim arr_str() As Variant
    
    'Arrayで初期化
    arr_str = Array("Tokyo", "Osaka", "Nagoya")
    
    '要素の取得と表示
    Dim i As Integer, str As String
    str = "arr_str"
    For i = 0 To 2
        str = str & ", " & arr_str(i)
    Next i
    
    '再初期化
    ReDim arr_str(3)
    str = str & vbCrLf & "arr_str"
    For i = 0 To 2
        str = str & ", " & arr_str(i)
    Next i
    
    MsgBox str, vbInformation
End Sub

実行結果:
arr_redim

このサンプルコードでは、Variant型の配列をArray関数を使って初期化したあと、ReDimステートメントを使って再初期化しています。

配列の要素数を変更する方法

先ほどReDimステートメントを使ってデータの値を保持したまま配列の要素数を変更したい場合は、ReDim Preserveステートメントを使用すると述べました。

サンプルコードで確認していきましょう。

Sub macro4()
    Dim arr_str() As Variant
    
    'Arrayで初期化
    arr_str = Array("Tokyo", "Osaka", "Nagoya")
    
    '要素の取得と表示
    Dim i As Integer, str As String
    str = "arr_str"
    For i = 0 To 2
        str = str & ", " & arr_str(i)
    Next i
    
    '要素数の変更
    ReDim Preserve arr_str(4)
    str = str & vbCrLf & "arr_str"
    For i = 0 To 4
        str = str & ", " & arr_str(i)
    Next i
    
    MsgBox str, vbInformation
End Sub

実行結果:
arr_redim_preserve

このサンプルコードでは、Variant型の配列をArray関数を使って初期化したあと、ReDim Preserveステートメントを使って要素の値を保持したまま配列の要素数を変更しています。

1次元から2次元配列に変更する場合

ReDimステートメントを使用すると、1次元配列から2次元配列へのように次元を変更することも可能です。

次元の変更前:

Dim arr(3) As Integer

次元の変更後:

ReDim arr(3, 3)

ただし、要素の値は保持されませんので注意しましょう。

まとめ

ここでは配列の初期化について説明しました。

固定長か可変長か、要素のデータ型がバリアント型かそうでないかによって、初期化や再初期化でできることとできないことが分かれますので、注意が必要です。

使いこなすことができるように、この記事を何度も参考にして下さいね!

この記事を書いた人

熊本在住のフリープログラマ兼ライターです。C/C++/C#、Java、Python、HTML/CSS、PHPを使ってプログラミングをしています。専門は画像処理で最近は機械学習、ディープラーニングにはまっています。幅広くやってきた経験を活かしてポイントをわかりやすくお伝えしようと思います。
お問合せはこちらでも受け付けています。
info@sss-lab.com

目次