配列

配列とは

 いくつかの値やオブジェクト、たとえば、「年度毎の売上額」や「社員名」などをグループ化して扱うことが便利な場合があります。

そんな場合に「配列」という仕組みがあります。

 ただ最初はイメージしにくいこともあり、慣れるまで使い勝手がよくないかもしれません。

 しかし後で出てくる「二次配列」というのは Excel のセル構造と相性がよく、マスターするとその効果には必ず満足するはずです。

ここに5人の社員がいるとします。
田中・吉田・三田村・浅井・若宮

それらの名前を文字型の変数として宣言するのに

TA = “田中” ’TA に「田中」の名前を代入
YS =”吉田”  ‘YS  に「吉田」の名前を代入
・・・・・

のように決めても構いませんが、社員数が数十名や数百名、数千名となると代入するだけでも実用的とは言えません。

そこで登場するのが配列です。

Syain(0) = “田中”
Syain(1) = “吉田”
Syain(2) = “三田村”
Syain(3) = “浅井”
Syain(4) = “若宮”

 このように、社員名を 「Syain」 という一つのグループとして扱い、その 0番は「田中」・ 1番は「吉田」・2番は・・といった具合にすれば、社員に関する様々なデータを扱う上で、非常に便利になります。

 VBAで配列を扱う場合は、まず配列を宣言する必要があります。

配列と言っても「配列」は「配列変数」という変数の一種です。

上記の例では

Dim Syain(4) As String

と書いて宣言します。

ここでの「4」はサイズといい(要素数とも言います)、配列にするデータの数を意味します。

5人いるのに「4」となっているのは、0から始まっているためです。
この点が「配列」を学ぶうえで違和感を覚える一つになっています。

このため

Dim Syain(5) As String
 Syain(1) = “田中”
 Syain(2) = “吉田”
 Syain(3) = “三田村”
 Syain(4) = “浅井”
 Syain(5) = “若宮

のように扱っても問題ありません。

 このブログでは、この方が理解しやすいとの観点から「始まりは 1から」で説明することにします。

 しかし、「配列の原則は 0から始まる」ということは記憶に留めておいてください。

 ここに営業担当 10名の日々の売上実績表があります。

担当者ごとの実績合計を算出表示し、総合計を書き出すマクロです。

少し長くなりますが、ゆっくり読んでください。

できればこのVBAをプリントアウトして、上の表と見比べながら読むとわかりやすいです。

Sub hairetsu()
 Dim Tanto(10) As String ‘①
 Dim UM(10) As Long ‘②
 Dim TLuri As Long ‘③
 Dim I As Long ‘④
 Dim EI As String ‘⑤
 Dim RW As Long ‘⑥


 ‘⑦ 営業担当者の配列
 For I = 1 To 10
  Tanto(I) = Cells(I + 2, 7)
 Next I

 ‘⑧ 売上配列・合計のリセット
 For I = 1 To 10
  UM(I) = 0
 Next I

 TLuri = 0

 ‘担当者別売上集計
 EI = Cells(3,2)  ‘⑨
 RW = 3

 Do Until EI = “”  ‘⑩
  ‘⑪
  For I = 1 To 10
   If Tanto(I) = EI Then
    Exit For
   End If
  Next I

  ‘⑫
  UM(I) = UM(I) + Cells(RW, 4)
  TLuri = TLuri + Cells(RW, 4)

  ‘⑬
  RW = RW + 1
  EI = Cells(RW, 2)
 Loop

 ‘⑭
 For I = 1 To 10
  Cells(I + 2, 8) = UM(I)
 Next I

 ‘⑮
 Range(“H13”) = TLuri
End Sub

① 営業担当者名の配列 データ型は文字列

② 各担当者別売上合計額の配列 データ型は数字

③ 売上総合計の変数 データ型は数字

④ 担当者名配列化のためのカウント変数 データ型は数字

⑤ 検索する担当者名の変数 データ型は文字列

⑥ 売上実績表の行番号の変数 データ型は数字

⑦ 右の「売上集計一覧」から10名分の営業担当者を配列に入れている。

⑧ 各担当者の売上合計額を一旦ゼロにする(リセット)
  売上総合計額もゼロにする(リセット)

⑨ 売上実績表の最初の行を読み取るため担当者をEIに代入
  最初の行番号をRWに代入

⑩ ここからが営業実績表の読み取り
  営業担当(EI)が空欄になるまで下記処理を行う

  EI を担当者配列の 1から For ~ Next 文を使って突き合わせる。
  一致したらその For ~ Next 文から抜け出る。

  その時の I が担当者の配列番号ということになる。

  1から順にチェックしもしI=4の時一致したとしたら、

  EI=Tanto(4)

  となるので、担当者は「大山」となる。

 最初のEIは⑩で代入されているので、EI=Tanto(1)である。

 また、この時の「I」が⑫に大きく影響してくる。

⑫ 担当者「神谷」 Tanto(1) の売上金額は UM(1)であり、 
  担当者「大山」 Tanto(4) の売上金額は UM(4)である。

  担当者の配列番号と売上金額の配列番号は一致しているのがポイント。
  (この配列番号を利用できるのが、配列の良さに一つです。)

  最初の売上金額から一つ一つ各担当者の売上金額UM(I)に加えられていく。
 同時に総合計(Tluri)に順次売上金額が加えられていく。

  ※ TLuri = TLuri + Cells(RW, 4) の意味がわからなければ「=(イクオール)の意味」参照

⑬ 一行のデータが処理された後、次のデータを処理するため、行番号が一つ加算される。

  同時にEIに次の行の担当者名が代入される。

Loop を経て最初の Do until にループする。

データの最終で⑬で「EI=””」になって Do Until の最初に戻ると Do until EI=”” なのでこのループから抜け出る。

⑭ この時点で各担当者別売上合計額 UM(1)からUM(10) と 総合計額 Tluri は確定している。

よってこれを右の「売上集計一覧」に記入する。

結果は

 以上が担当者10名の場合の例です。

 実際に担当者が50名、100名と大人数のなるほど、配列処理の利用価値が高まります。