第12講 配列その2
第3話 1次元配列と高次元配列の関係

まず、次のプログラムを開いて頂きたいと思います。
2次元と1次元の関係を示すプログラム例

プログラムソースは次のようになっています。
Dim h1(10, 10), h2(100) As Integer
Private Sub CommandButton1_Click()

  syori1
  syori2

End Sub

Sub syori1()

  Dim i As Integer, j As Integer

  For i = 1 To 10
    For j = 1 To 10
      h1(i, j) = 10 * (i - 1) + j
    Next
  Next

  For i = 1 To 10
    For j = 1 To 10
      Cells(5 + i, j) = h1(i, j)
    Next
  Next

End Sub

Sub syori2()

  Dim i As Integer, j As Integer, s As Integer, a As Integer

  For i = 1 To 100
    h2(i) = i
  Next

  For i = 1 To 100
    a = (i - 1) Mod 10
    s = Int((i - 1) / 10)
    Cells(6 + s, 12 + a) = h2(i)
  Next

End Sub

プログラム実行してみてください。
syori1とsyori2で処理された結果は全く同じです。
実は、2次元配列は1次元配列でも表現できるのです。
同様に3次元以上の高次元配列であっても1次元配列で扱えます。

2次元配列を1次元配列に代入するには、
例えば、次のようにすればよいのです。
  For i = 1 To 10
    For j = 1 To 10
      h2(10 * (i ー 1) +j ) = h1(i, j)
    Next
  Next
なぜこれでよいか、表を使ってみてみましょう。
次の表はi、jと10 * (i ー 1) +jの関係を示すものです。

10
10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30

ピンクの部分が10 * (i ー 1) +j を表しています。
重複なく連続しした整数になることがおわかりいただけると思います。

見事に(i,j)の2次元とピンクの1次元が対応しています。

逆に、1次元配列を2次元配列に代入するためには、
  For i = 1 To 100
    a = (i - 1) Mod 10
    s = Int((i - 1) / 10)
    h1(i, j) = h2(s + 1,a + 1)
  Next
とすればよいのです。
a = (i - 1) Mod 10はiから1引いた整数を10で割ったときの余り、
s = Int((i - 1) / 10)はiから1引いた整数を10で割ったときの商で
対応表は

a+1 10
s+1
10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30

となります。ピンクがiを表しています。
1次元iが2次元(s+1,t+1)に対応していることがおわかりかと思います。

C言語あたりでは基本的に多次元配列は使いません。
すべて1次元配列で済むからです。

では皆さん、3次元配列と1次元配列の場合で代入を考え、
同様なプログラムを作ってみてください。

第2話へ 第4話へ