配列とは
i=10
i=20
MsgBox i → 20
変数は、1つの値しか保持できない
配列は、1つの配列名で複数の値を保持できる
配列名 :配列につける変数名 例…Caramel
インデックス番号:配列の何番目かを示すもの 通常0から始まる
これを利用して、要素を取り出したり、要素に代入できる
配列の宣言
Dim 配列名(最大インデックス番号) As 型
Dim Caramel(4) As String
この宣言により、0~4までの5つの文字型配列が使えるようになる
配列に値を代入し、取り出してみましょう!
Sub キャラメルの味配列編()
Dim i As Long
Dim Caramel(4) As String
Caramel(0) = "りんご"
Caramel(1) = "バナナ"
Caramel(2) = "いちご"
Caramel(3) = "レモン"
Caramel(4) = "ぶどう"
For i = 0 To 4
MsgBox Caramel(i)
Cells(5, i + 3) = Caramel(i)
Next i
End Sub
1次元配列
1行1列の配列を1次元配列という
Aの合計を求めましょう
Sub 成績計算1次元()
Dim A(4) As Long
Dim i As Long
Dim Goukei As Long
A(0) = 75
A(1) = 83
A(2) = 76
A(3) = 54
A(4) = 83
For i = 0 To 4
Goukei = Goukei + A(i)
Next i
MsgBox "Aの5教科の合計は=" & Goukei
End Sub
カウンター変数を配列のインデックス番号として扱えるので、
配列とForNextステートメントは相性バッチリ!
2次元配列
縦横ワークシート状の配列を2次元配列という
生徒の点数を配列Tensuに代入する
Tensu(9,4)は人数(10)×教科数(5)の2次元配列
配列Goukeiは各生徒の合計点数(横の合計)
配列KyoukaGoukeiは、各教科の合計点数(縦の合計)
二次元配列は2重のForNextステートメントと相性バッチリ!
Sub 成績計算2次元()
Dim Tensu(9, 4) As Long
Dim i As Long, j As Long
Dim Goukei(9) As Long
Dim KyoukaGoukei(4) As Long
'配列にデータを入力します
For j = 4 To 13
For i = 3 To 7
Tensu(j - 4, i - 3) = Cells(j, i)
Next i
Next j
For j = 0 To 9 '人数分ループ
For i = 0 To 4 '教科数ループ
'個人別合計点
Goukei(j) = Goukei(j) + Tensu(j, i)
'教科別合計点
KyoukaGoukei(i) = KyoukaGoukei(i) + Tensu(j, i)
Next i
'MsgBox j + 1 & "番目の生徒の合計は=" & Goukei(j)
Next j
For i = 0 To 4
MsgBox i + 1 & "教科目の合計=" & KyoukaGoukei(i) & " 平均点=" & KyoukaGoukei(i) / 10
Next i
End Sub
配列を使った例
さいころを100回振って各目が何回出たか?
配列を使わない場合
SelectCaseステートメントで…
Sub SaikoroCnt()
Dim SaikoroNoMe As Long
Dim i As Long
Dim No1 As Long, No2 As Long, No3 As Long
Dim No4 As Long, No5 As Long, No6 As Long
For i = 1 To 100
SaikoroNoMe = Int((6 * Rnd) + 1) '1~6までの乱数を発生させる
Select Case SaikoroNoMe
Case 1
No1 = No1 + 1
Case 2
No2 = No2 + 1
Case 3
No3 = No3 + 1
Case 4
No4 = No4 + 1
Case 5
No5 = No5 + 1
Case Else
No6 = No6 + 1
End Select
Next i
Debug.Print "No1", No1
Debug.Print "No2", No2
Debug.Print "No3", No3
Debug.Print "No4", No4
Debug.Print "No5", No5
Debug.Print "No6", No6
End Sub
配列を使う場合
各目が何回出たか配列にカウントしていく
さいころの目をCntのインデックス番号に…
Cnt(1):1の目が出た回数
Cnt(SaikoroNoMe) = Cnt(SaikoroNoMe) + 1
Cnt(0)は使用しない
Sub SaikoroCnt2()
Dim SaikoroNoMe As Long
Dim i As Long
Dim Cnt(1 To 6) As Long
For i = 1 To 100
'1~6までの乱数を発生させる
SaikoroNoMe = Int((6 * Rnd) + 1)
'Cntの1~6に加算していく
Cnt(SaikoroNoMe) = Cnt(SaikoroNoMe) + 1
Next i
For i = 1 To 6
Debug.Print "No" & i, Cnt(i)
Next i
End Sub
配列の下限インデックス番号の指定方法
Option Base
Option Base 0:既定値
Option Base 1:すべての配列のインデックス番号を1から始める
Option Baseを使わず0以外から始めたいとき
配列名(下限 To 上限)
上のさいころの目のカウントは、Cnt(1 To 6)と指定してもOK!
配列のメリット
配列のメリットは、処理速度の高速化にあり
VBAは、変数とシート間のデータのやり取りに時間がかかる
シートを介さず、配列に取り込んで計算したり、まとめて表示すると処理速度が上がる
Caramel配列に取り込んで、まとめて書き出します
Range(“C7:G7”) = Caramel
Sub キャラメルの味配列編()
Dim i As Long
Dim Caramel(4) As String
Caramel(0) = "りんご"
Caramel(1) = "バナナ"
Caramel(2) = "いちご"
Caramel(3) = "レモン"
Caramel(4) = "ぶどう"
For i = 0 To 4
'MsgBox Caramel(i)
Cells(5, i + 3) = Caramel(i)
Next i
Range("C7:G7") = Caramel
End Sub
TensuというVariant型(型の指定がない型:なんの型でもOK)変数に値を代入し、
一気にシートに書き出します
Sub 成績Copy()
Dim Tensu As Variant
Dim Gyousu As Long
Tensu = Range("a1").CurrentRegion
Gyousu = Range("a" & Rows.Count).End(xlUp).Row
Range("a14").Resize(Gyousu, 6) = Tensu
End Sub
コメント