
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
での再割り当てが必要)
- 固定長配列の場合、各要素が
アカウントを作成 して、もっと沢山の記事を読みませんか?
この記事にコメントをしてみませんか?