静的配列と動的配列
静的配列とは「最初に配列の大きさを指定しておくこと」であり,動的配列とは「最初に配列の大きさを指定せず,プログラムの途中で変更(指定)していくこと」である。
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) これが動的配列を使う上での肝で,最初に宣言した時点では配列の大きさが指定されていなかったが,ここで新たに配列の大きさを指定しているのである。