この記事を読むのに必要な時間は約 6 分です。
ループ処理で配列を操作する方法です。
配列にも、1次元配列や2次元以上の配列があります。
1次元配列は、数字が一直線に並んでいるところを想像してもらえれば分かりやすいかもしれません。
2次元配列は、カレンダーやエクセルの表などが相当します。
1次元でも2次元でも、For-Nextのループ処理で対応できます。
For-Nextの使い方はこちらの記事も参考にしてみてくださいね。
それでは、ループ処理で配列を操作する方法です。
目次(リンク)
配列の要素数を確認する
For文でループして配列を操作するなら、インデックス番号がドコからドコまであるのか確認する必要があります。
確認には、UBound関数、LBound関数を使います。
- UBound関数:最大のインデックス番号を返す
- LBound関数:最小のインデックス番号を返す
UBound関数、LBound関数の使い方
UBound関数、LBound関数の引数は次のようになります。
1 2 |
UBound(arrayname [ ,dimension ] ) LBound(arrayname [ ,dimension ] ) |
1次元配列の場合は2つ目の引数を省略できますが、2次元配列以上なら指定が必要です。
配列()という配列があったとすると、次のようにインデックス番号を取得できます。
1 2 3 |
iMax=UBound(配列) iMin=UBound(配列) |
2次元配列の場合、どうなるんでしょうか。
配列(a, b)があったとすると、
1 2 3 4 5 6 7 8 9 |
'1次元目 aの要素数 iMax1=UBound(配列,1) iMin1=UBound(配列,1) '2次元目 bの要素数 iMax2=UBound(配列,2) iMin2=UBound(配列,2) |
のように書きます。
2つ目の引数が、どの次元なのかを表すわけです。
1次元配列から、For~Next文でループして値を取り出す
サンプルプログラムです。
配列sTestArray()にSplit関数で値を入れて、For~Nextでループし値を取り出します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Option Explicit Public Sub testArray1() Dim sTestArray() As String Dim lCnt As Long sTestArray = Split("東京 茨城 神奈川 栃木 千葉 群馬 山梨 埼玉", " ") For lCnt = LBound(sTestArray) To UBound(sTestArray) Debug.Print sTestArray(lCnt) Next lCnt End Sub |
実行結果がこちらです。
Split関数の使い方については、こちらの記事
の3番目のところを参考にしてくださいね。
2次元配列から値を取り出す
1次元配列のときはループも1つでした。
ところが2次元配列になると、1次元目用のループと2次元目用のループが必要になります。
ループ処理の中にループ処理を入れて、二重ループさせるわけです。
二重にループさせる
まずはサンプルプログラムをご覧ください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Public Sub testArray2() Dim lCntX As Long Dim lCntY As Long Dim vArr As Variant vArr = Sheets("Sheet1").Range("B2:H6") 'For lCntY = 1 To 5 For lCntY = LBound(vArr, 1) To UBound(vArr, 1) 'For lCntX = 1 To 7 For lCntX = LBound(vArr, 2) To UBound(vArr, 2) Debug.Print vArr(lCntY, lCntX) Next lCntX Next lCntY End Sub |
2次元配列vArrは、エクセルシートからRangeでとってきています。
2次元配列vArrを操作するための二重ループは、次のようなイメージです。
lCntYのカウンタでループしている中に、lCntXのループ処理が入っています。
カレンダーを思い浮かべてもらうと分かりやすいですが、
左上から日付が進み、1週間経つと次の週に移りますよね。
そしてまた1週間が始まります。
Xが曜日なら、Yは週。
lCntXで横方向のループが1つ終わると、次のlCntYの中でまたlCntXのループが続くんです。
実行結果は次の通り。
2次元配列に格納された1~30の数字が順に表示されました。
まとめ:VBAのループ処理で配列、二次元配列を操作する方法
For~Nextのループ処理を使って、配列から値を取り出しました。
1次元配列ならループも1つですが、2次元配列は二重ループになります。
どこからどこまでループさせればいいのかを求めるには、LBound関数とUBound関数を使うんでしたね。
これだけ分かっていれば、ちょっと配列を使えるはずです。
ぜひ参考にしてみてくださいね。
最後までお読みいただき、ありがとうございました。