連載
» 2006年11月03日 00時00分 公開

基礎解説 演習方式で身につけるチェック式WSH超入門:第6回 VBScriptの配列を極める (4/5)

[牟田口大介(Microsoft MVP Visual Developer - Scripting),著]

 これまでに登場した配列は、すべてデータが1次元(概念図でいうと直線的に箱がつながっているもの)の1次元配列だったが、VBScriptは2次元をはじめとする、多次元の配列を扱うことができる。2次元配列についての概念図を以下に示す。

2次元配列の概念図
1次元配列が横並びの箱の列だったのに対し、2次元配列は縦横に箱が並べられたものと考えられる。

 このように、1次元配列が横並びのデータ列だったのに対し、2次元配列は縦横に向けて並べられた「表」のようなデータ列である。このような配列をVBScriptで作成するには次のようにする。

Option Explicit
Dim a(4, 3)

 このように宣言することで、a(0, 0)、a(1, 0) 、a(2, 0) 、a(3, 0)、a(4, 0)、a(0, 1)、a(1, 1) 、a(2, 1) 、a(3, 1)、a(4, 1)、a(0, 2)、a(1, 2) 、a(2, 2) 、a(3, 2)、a(4, 2)、a(0, 3)、a(1, 3) 、a(2, 3) 、a(3, 3)、a(4, 3)の計20個の要素を持つ2次元配列が作成される。(1次元目のインデックスの最大数+1)×(2次元目のインデックスの最大数+1)= 5×4 = 20個というわけである。

 2次元配列に値を代入するときに、先ほどのFor 〜 Nextステートメントが威力を発揮する。次に示すコードは、掛け算の九九の表を2次元配列に格納するというサンプルである。

Option Explicit
Dim intNumbers(9, 9) '大きさ10×10の2次元配列を宣言

'九九表のデータを2次元配列に格納する
Dim intCounterI, intCounterJ 'ループカウンタ用変数
For intCounterI = 0 To 9 '外側のループ
    For intCounterJ = 0 To 9 '内側のループ
        ' intCounterIとintCounterJの積を格納
        intNumbers(intCounterI, intCounterJ) =  _
        intCounterI * intCounterJ
    Next
Next

'7×8の値(intNumbers(7, 8)に格納された値)を表示する
MsgBox "7×8=" & intNumbers(7, 8)

 このスクリプトを実行すると結果はこのようになる。

2次元配列の使用例
2次元配列のうちの1つの要素を取り出し、表示している。

 まずDim intNumbers(9, 9)とすることで、大きさ10×10(=100)の2次元配列を作成している。次にFor 〜 Nextステートメントを2重にして(ネストして)、ループカウンタ用変数であるintCounterIとintCounterJの積を配列に格納している。このネストだが、内側のループの内容が、外側のループで繰り返されると考えると分かりやすいだろう。具体的には、まずintCounterI = 0のとき、intCounterJ = 0〜9までが内側のループで繰り返されてそれぞれ値が格納される。次に外側のループが1つ進んでintCounterI = 1となり、またintCounterJ = 0〜9までが内側のループで繰り返される。これが、外側のループでintCounterI = 9となるまで繰り返される。表を左から右に読んでは次の段を読み、を繰り返すことをイメージすればよいだろう。

 ここでは2次元配列を取り上げたが、VBScriptにおいては60次元配列まで取り扱うことができる。だが、通常使用する配列は、3次元程度までであろう。

 なお、多次元配列の動的配列というものも存在する。ただし、ReDimステートメントにPreserveキーワードを用いる場合(既存の配列要素を保持したい場合)は、配列の最後の次元のサイズしか変更できないので注意が必要である。

 具体的には、

Option Explicit
Dim intNumbers()
ReDim intNumbers(9,9)
ReDim Preserve intNumbers(9,15)

のように、多次元配列の動的配列を宣言したり、既存の配列要素を保持したまま配列の最後の次元(ここでは2次元目)のサイズを変更することは可能である。

 だが、

Option Explicit
Dim intNumbers()
ReDim intNumbers(9,9)
ReDim Preserve intNumbers(15,9)

のように、既存の配列要素を保持したまま、配列の最後以外の次元(ここでは1次元目)のサイズを変更しようとするとエラーになるということである。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。