配列について

縦横配列の二次配列

 生徒7名の5教科のテスト結果表です。

縦に生徒7名の名前、横に科目が並んでいます。

これにそれぞれのテストの点数が記載されています。

データ数は 7 x 5 = 35 件です。

こうしたデータを配列に入れて管理するには、点数(氏名、科目) の形の配列変数が便利です。

たとえば

テスト点数(3,4)  といえば「佐藤さんの理科のテスト結果 79点」を表すことになります。

これを「二次配列」あるいは「二次元配列」といいます。

その名の通り「次元」が二つある配列のことです。

何か難しそうに見えますが、Excel のセルをイメージすればわかりやすいです。


この二次配列を宣言するには

Dim 配列名(一次元の要素数、二次元の要素数)As データ型

と書きます。

※要素数=データ数と考えてください。

上記テストの結果表でいえば、配列名を「Tensu」とすると、

Dim Tensu(7,5) As Long

となります。

ちょうど Cells(行番号、列番号)をイメージすればよいでしょう。

それではこの二次配列を具体的にどのように利用するのか、例をあげて説明します。

 次のような「担当者・商品種別売上実績表」があります。

これを右の「売上集計表」にその集計結果を自動作成するマクロを作ります。

まず押さえておきたいのが、営業担当者が10名、商品種別が4種類ということです。
※ 「売上集計表」の赤の数字のことです。

配列名を「UM」とします。

つまり、UM(担当者数、商品種別数)の二次配列を作成します。

Dim UM(10,4) As Long

になります。

そしてこの配列変数には 10×4=40 の40個の集計されたデータが入ることになります。

集計作業の流れとしては、およそ次の通りです。

一番目の神谷さんのA商品売上~D商品売上は 

UM(1,1)=132,568, UM(1,2)=323,458, UM(1,3)=223,560, UM(1,4)=5,690 となります。

二番目の石田さんの場合は

UM(2,1)=889,600, UM(2,2)=46,521, UM(2,3)=326,901, UM(2,4)=45,215 となります。

このように最後のデータまで続きます。

同じ人のデータになれば、その売上金額がそれまでの金額に加算されていきます。

最終データの計算が終わった段階で、右の売上集計表に結果(合計を含む)が記載される流れになります。

Sub hairetsu2()

Dim xTanto(10) As String ‘①
Dim xSM(4) As String ‘②
Dim UM(10, 4) As Long ‘③
Dim TTL(10) As Long ‘④
Dim STL(4) As Long ‘⑤
Dim ATL As Long ‘⑥
Dim RW As Long ‘⑦
Dim EI As String ‘⑧
Dim I As Long ‘⑨
Dim P As Long ‘⑩

‘⑪
For I = 1 To 10
 xTanto(I) = Cells(I + 2, 11)
Next I

‘⑫
For P = 1 To 4
 xSM(P) = Cells(2, P + 3)
Next P

 ‘⑬
For I = 1 To 10
 For P = 1 To 4
  UM(I, P) = 0
 Next P
Next I

 ‘⑭
For I = 1 To 10
 TTL(I) = 0
Next I

 ‘⑮
For I = 1 To 4
 STL(I) = 0
Next I

 ‘⑯
RW = 3
EI = Cells(3, 2)

 ‘⑰
Do Until EI = “”
‘⑰-1
 For I = 1 To 10
  If EI = xTanto(I) Then
   Exit For
  End If
 Next I

   ‘⑰-2
 For P = 1 To 4
  UM(I, P) = UM(I, P) + Cells(RW, P + 3)
  TTL(I) = TTL(I) + Cells(RW, P + 3)
  STL(P) = STL(P) + Cells(RW, P + 3)
  ATL = ATL + Cells(RW, P + 3)
 Next P

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

 ‘⑲
For I = 1 To 10
 For P = 1 To 4
  Cells(I + 2, P + 11) = UM(I, P)
 Next P

 Cells(I + 2, 16) = TTL(I)
Next I

For P = 1 To 4
 Cells(13, 11 + P) = STL(P)
Next P

Cells(13, 16) = ATL

End Sub

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

② 商品種別の配列変数 データ型は文字列

③ 売上金額の二次配列変数 型は数字

④ 担当者ごとの売上合計の配列変数 型は数字

⑤ 商品種別ごとの売上合計の配列変数 型は数字

⑥ 売上金額の総合計の変数 型は数字

⑦ 行番号の変数 型は数字

⑧ 該当する担当者名を入れる変数 型は文字列

⑨ 担当者のFor Next 文のカウンター変数 型は数字

⑩ 諸品種別のFor Next 文のカウンター変数 型は数字

⑪ 担当者名の配列に名前を入れる

⑫ 商品種別名の配列に種別名を入れる

⑬ 売上金額の二次配列変数のリセット(全てゼロにする)

⑭ 担当者ごとの売上合計のリセット

⑮ 商品種別ごとの売上合計のリセット

⑯ 最初のデータの行番号と担当者名の取得

⑰ データ収集作業(ループ)

⑰-1 B列の担当者を読み込むたびに「配列番号」を取得

⑰-2 担当者の配列番号をもとに商品種別ごとの売上金額や合計値を加算しながら収集する

⑱ 1件のデータ読み込みを終わるごとに、行番号を一つ追加し、次の営業担当者名を取得する。

  その後最初の Do Until に戻る。

   EI=”” ならばこのループから離れる。

⑲ 「売上集計表」に計算結果が自動で書き入れられる。

結果はこうなります。

慣れないうちは、読みずらいかもしれません。

しかし、一文一文の意味を考えながらゆっくり理解に努めてください。

内容は基本的なVBAプログラムです。

配列で複数の変数を格納する  いくつかの値やオブジェクト、たとえば、「年度毎の売上額」や「社員名」などをグループ化して扱うことが便利な場合があります。 そん...
セル番地の指定方法 Range と Cells Excelの構成は「ブック(Book)」が一つの単位です。その中に一つまたは複数の「シート(Sheet)」があります。 そしてそ...