メイン画像

VBScriptで配列を使う

VBScriptで配列を使う


固定長配列

配列はDim 配列名(添え字の上限値)と宣言する。

かっこ内に書くのは要素数ではなく、添え字の上限値であることに注意する。
配列の添え字は 0 から始まるので、確保したい要素数 - 1 を書けば良い。

'4つの要素を持った配列 score を宣言
Dim score(3)

配列の各要素に値を入れるには、配列名(添え字) = 値とする。

score(0) = 65
score(1) = 94
score(2) = 86
score(3) = 57

配列の各要素の値は配列名(添え字)で取得する。

'一つ目の要素の値を表示
MsgBox "一つ目の点数は" & CStr(score(0)) & "です"

配列の最小の添え字はLBound関数で取得する。
配列の最大の添え字はUBound関数で取得する。
配列をループで処理するときに、これらの関数を使うと便利。

'配列の各要素の値を合計する
Dim total
total = 0

Dim i
For i = LBound(score) To UBound(score)
  total = total + score(i)
Next

MsgBox "合計は" & CStr(total) & "です"

可変長配列(動的配列)

固定長配列は宣言時に確保した要素数を変えられない。
つまり宣言時に要素数が分かっていないと使えない。

状況によって要素数を変えたいときは、可変長配列(動的配列)を使う。

可変長配列はDim 配列名()と宣言する。

固定長配列と違って、かっこは空とする。

'可変長配列 score を宣言
Dim score()

可変長配列の要素数を変更するにはReDim 配列名(添え字の上限値)を使う。
配列の各要素の値を保持したいときはPreserveを付けて、ReDim Preserve 配列名(添え字の上限値)とする。

Preserveを付けないと各要素の値は破棄される。
Preserveを付けても配列を縮小した(要素数を減らした)ときは、縮小した分の値は破棄される。

'要素数を変更(各要素の値は破棄)
ReDim score(3)

'要素数を変更(各要素の値を保持)
ReDim Preserve score(3)

値の取得や格納は固定長配列と同様である。

多次元配列

これまでの配列は一次元配列と呼ばれ、以下のようにデータが横並びに入るものだった。

一次元配列のイメージ
0 1 2
100 200 300

これに縦の枠も加え、表のようにデータを入れる二次元配列というのも使うことができる。

二次元配列のイメージ
  0 1 2
0 100 200 300
1 123 456 789

二次元配列はDim 配列名(一次元目の添え字の上限値, 二次元目の添え字の上限値)と宣言する。

Dim score(1, 2)

各要素には配列名(一次元目の添え字, 二次元目の添え字)でアクセスできる。

score(0, 0) = 100
score(0, 1) = 200
score(0, 2) = 300

score(1, 0) = 123
score(1, 1) = 456
score(1, 2) = 789

MsgBox "1件目の2番目の値は" & CStr(score(0, 1)) & "です"
MsgBox "2件目の3番目の値は" & CStr(score(1, 2)) & "です"

二次元配列を可変長配列(動的配列)とすることもできる。
一次元配列と同様なやり方で、宣言や要素数を変えられる。

'可変長配列を宣言
Dim score()

'2×3の二次元配列にする
ReDim score(1, 2)

'値を保持したまま、2×4に変更する
ReDim Preserve score(1, 3)

値を保持する(ReDim Preserveとする)場合、要素数は最後の次元しか変えられない。
微妙に使い勝手が悪い。
行を増やしたいケースのほうが多いと思うのだが……。

Dim score()

'2×4の二次元配列に変更する
ReDim Preserve score(1, 3)

'3×3の二次元配列に変更する
'  →実行時エラー「9: インデックスが有効範囲にありません。」となる
ReDim Preserve score(2, 2)

値を保持しない(ReDimだけにする)場合は、どの次元の要素数も変更できる。

Dim score()

'2×4の二次元配列に変更する
ReDim Preserve score(1, 3)

'3×3の二次元配列に変更する
ReDim score(2, 2)

一次元配列を二次元配列に変えることもできる。

Dim score()

'一次元配列にする
ReDim score(2)

'2×4の二次元配列に変更する
ReDim score(1, 3)

添え字の最小値はLBound(配列名, 次元)で取得できる。
添え字の最大値はUBound(配列名, 次元)で取得できる。
次元を省略した場合、一次元目が対象となる。

'2×4の二次元配列を宣言
Dim score(1, 3)

'すべての要素を0で初期化する
Dim i, j
For i = LBound(score, 1) To UBound(score, 1)
    For j = LBound(score, 2) To UBound(score, 2)
        score(i, j) = 0
    Next
Next

配列のクリア

配列はEraseステートメントでクリアできる。
指定した配列が固定長か可変長かでクリアの内容が異なる。

固定長配列をクリアした場合、各要素がEmpty値で初期化される。

Dim score(3)
score(0) = 65

'配列をクリア
Erase score

'Trueが返る(Empty値で初期化された)
MsgBox IsEmpty(score(0))

可変長配列をクリアした場合、割り当てていたメモリが解放される。

Dim score()

ReDim score(3)
score(0) = 65

'配列をクリア
Erase score

'実行時エラー(メモリが解放されたのでアクセスできない)
MsgBox IsEmpty(score(0))

配列を使い回すときはReDimで次元数・サイズを再割り当てする。

Dim score()

ReDim score(3)
score(0) = 65

'配列をクリア
Erase score

'再割り当てする
ReDim score(3)

'これならOK。Trueが返る。
MsgBox IsEmpty(score(0))

配列まとめ

  • 配列の宣言はDimで行う。
    • 固定長配列とする場合、かっこに次元数分のサイズを指定する。
    • 可変長配列とする場合、空のかっことする。
    • サイズとは添え字の上限値であり、要素数ではないことに注意する。
      VBScriptではDim a(5)とした場合、a(0)からa(5)までの6個の要素となる。
      ほかの言語だと要素数であることが多いので、混同しないように。
  • 可変長配列を定義するにはReDimを使う。
    • 各要素の値を保持したまま再割り当てする場合はPreserveを付ける。
    • Preserveを付ける場合、最後の次元のサイズしか変更できない。
  • 次元数は最大で60まで宣言できる。
    が、そんなに使わない。だいたい2次元で事足りる。
  • 配列の各要素はEmpty値で初期化される。
  • 配列はEraseでクリアできる。
    クリアする配列が固定長か可変長かで動きが異なる。
    • 固定長配列の場合、各要素がEmpty値で初期化される。
      (メモリは解放されない)
    • 可変長配列の場合、割り当てたメモリが解放される。
      (再利用するには、ReDimでの再割り当てが必要)

アカウントを作成 して、もっと沢山の記事を読みませんか?


この記事が気に入ったら ことりと さんを応援しませんか?
メッセージを添えてチップを送ることができます。


この記事にコメントをしてみませんか?


酒とアクアリウムが最近の楽しみ。

おすすめの記事