【3/18〜】Amazon、VMwareが語る『クラウドの未来』 スラッシュドット    はてなブックマーク  Yahoo!ブックマークに登録  印刷
   
基礎解説
チェック式 WSH入門 第6回

4.多次元配列

Microsoft MVP
Visual Developer - Scripting
牟田口 大介
2006/11/03

 これまでに登場した配列は、すべてデータが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次元目)のサイズを変更しようとするとエラーになるということである。


 INDEX
  [基礎解説]チェック式 WSH入門
  第6回 VBScriptの配列を極める
    1.配列とは
    2.Forステートメントによる配列の操作
    3.動的配列
  4.多次元配列
    5.配列を操作するための関数
 
 基礎解説

ホワイトペーパーTechTargetジャパン

Windows Server Insider フォーラム 新着記事

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード

スキルアップ/キャリアアップ(JOB@IT)

- PR -
- PR -

お勧め求人情報

キャリアアップ 〜JOB@IT
@IT Special -PR-
  TomcatやJBossなどAPサーバ環境に関する
情報を集約! “業務”用APサーバ大百科

New!
  一気に解説! 最新のクラスタストレージ
「RAIDを超えたストレージ基準」……など

New!
  クラウド的ユーザー体験の変化は脅威か?
仮想化技術を使いこなす運用管理術を紹介

New!

  上司や部下、部署内メンバーとの情報共有
を“ガラッ”と変えるコラボツールとは?

New!
  おばかアプリ選手権、第4弾開催中!!
ムダにカッコよくてくだらない作品求ム!

  社内ファイルサーバを“クラウド”に統合
VPN直結「クラウド型ストレージ」を紹介

  Twitterのアカウントはなぜ突破された?
メールによる新手の攻撃手法とその対策

  もう仮想化のお試しフェイズは終わりだ!
Hyper-V 2.0が基幹システムも仮想化

  美人!? まあまあ? 気になる いやし系!!
PV急増で「美人時計」がとった手段とは?

  クライアント企業から求められる人材
⇒IT技術と経営戦略を併せ持つ「戦略家」

  .NET編集長が実践する「技術情報検索術」
サンプル・コードを簡単に探す“技”は?

  業務効率と情報セキュリティ対策を両立!
手間なく確実に機密情報を守る方法とは?

  進化を続ける富士通ストレージETERNUS DX
製品開発者の自信を裏付けるものとは何か

  運用管理の課題を“2つの観点”から分析
ユーザー満足度の高い「仮想環境」とは?

  【CTC事例】約30の基幹システムを統合!
膨大なバッジジョブを制御した方法は?

  仮想化すればコストは削減できるか?
仮想化に必要な「3つの視点」を解説する

  その数、なんと400台以上! グループ内
サーバの「統合管理」によるメリットは?