<<目次へ


静的配列と動的配列



 静的配列とは「最初に配列の大きさを指定しておくこと」であり,動的配列とは「最初に配列の大きさを指定せず,プログラムの途中で変更(指定)していくこと」である。

Dim dat(1 to 5) As Double とするのが静的配列
Dim dat() As Double とするのが動的配列

 少々,まわりくどい説明になってしまうが以下のプログラムコードをみて欲しい。今回はセル範囲A1:A5に数値データが入力されているものとする。

'サンプルコード1(静的配列)
Sub sample()
    Dim dat(1 To 5) As Double
    Dim i As Integer
    
    For i = 1 To 5
        dat(i) = Cells(i, 1).Value
        MsgBox dat(i)
    Next
End Sub

 これは最初に dat(1 To 5) という風に「1番から5番までの5つの箱を用意しなさい」という命令を出しているわけである。そしてfor構文の中で

dat(1) へ Cells(1,1) に入力されているデータを代入。
dat(2) へ Cells(2,1) に入力されているデータを代入。
dat(3) へ Cells(3,1) に入力されているデータを代入。
dat(4) へ Cells(4,1) に入力されているデータを代入。
dat(5) へ Cells(5,1) に入力されているデータを代入。

という繰り返し処理が行われているのである。これはあらかじめデータの長さ(行数)が分かっている場合は有効である。しかし,データが大量であったりしてデータの長さが分からないときは不都合である。


'サンプルコード2(動的配列)
Sub sample2()
    Dim dat() As Double
    Dim i As Integer, nrow As Integer
    Dim myRange As Range
    Dim myName As String
    
    myName = "Table1"
    Set myRange = Application.InputBox(prompt:="データ範囲を指定", Title:="main", Type:=8)
    ThisWorkbook.Names.Add myName, myRange
    nrow = myRange.Rows.Count
    ReDim dat(nrow)
    For i = 1 To nrow
        dat(i) = Range("Table1").Cells(i, 1).Value
        MsgBox dat(i)
    Next
End Sub

 サンプルコード1に対してこれはデータの長さが分からない場合において有効である。つまり,実質的にはこちらの方法が用いられることになる。コードが少々長いが,1つずつ説明していこう。

myName = "Table1" はmyNameという変数にTable1という文字列を代入している。

Set myRange = Application.InputBox(prompt:="データ範囲を指定", Title:="main", Type:=8) はInputBoxを使用してデータが入力されているセル範囲をmyRangeという変数に代入している。

ThisWorkbook.Names.Add myName, myRange はデータが入力されているセル範囲(つまりInputBoxで取得したセル範囲)を1つのテーブルとして名前をつけているのである。

nrow = myRange.Rows.Count はセル範囲の行数をカウントしてnrowという変数に代入している。

ReDim dat(nrow) これが動的配列を使う上での肝で,最初に宣言した時点では配列の大きさが指定されていなかったが,ここで新たに配列の大きさを指定しているのである。