配列 基本編

YouTube VBA

配列とは


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すべての配列インデックス番号から始める


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

コメント