部署・取引先・売上・差益と並んだエクセルがあるとする。
部署 | 取引先コード | 売上 | 差益 |
---|---|---|---|
1110 | 0001 | 5,000,000 | 500,000 |
1110 | 0002 | 3,000,000 | 300,000 |
1110 | 0003 | 2,000,000 | 200,000 |
1120 | 0213 | 500,000 | 50,000 |
1120 | 0239 | 400,000 | 40,000 |
1120 | 0347 | 788,700 | 78,000 |
1130 | 4787 | 500,000 | 50,000 |
1130 | 3784 | 2,000,000 | 200,000 |
1130 | 4783 | 1,000,000 | 100,000 |
こんな表を部署ごとに売上を集計して配列に持ちたいということはないだろうか。例えば、1110は売上計10,000,000。1120は売上計1,688,700・・のように。
何でこんなことを言うかというと、私の場合、これを使って部署ごとの売上順位表を作ろうという話なのだ。これに利益率と部署全体の売上に対する比率の列を含めて、部署ごとに別シートで作成しようとするとき、利率は差益÷売上なので簡単に出来るのだが、売上の比率はそうはいかない。
部署順・売上降順にならんでいるので一番上が1位になるだからお膳立ては十分だ。ForEachで2行目から最終行まで順に読んでシートに代入し、部署が切り替わったら別シートを作成する・・・とやるつもりだが、一行一行読むタイミングで部署全体に対する売上の比率を出すとなると、部署ごとの全体売上を一行一行読む前に知っておかなければいけない。
このとき、1110の合計金額、1120の合計金額、1130の合計金額という連想配列があればありがたいと思ったわけだ。理由はなんでもいいだろうが、私の連想配列を使いたいといった理由はそういうことだ。
コードはこれだ。
Dim Dic , j AS Long , buf As String , LastRow as Long 'シートの最終行を取得 LastRow = Range("A65535").End(xlup).Row 'ディクショナリオブジェクトを定義 Set Dic = CreateObject("Scripting.Dictionary") '連想配列として代入していく For j = 2 To LastRow buf = Cells(j,1).Value '部署コードを代入 kin = Cells(j,3).Value '金額を代入 If Not Dic.Exists(buf) Then 'まだ登録されていなければ Dic.Add buf , kin '部署コードと金額を代入 Else Dic.Item(buf) = Dic.Item(buf) + kin '既登録なら該当箇所に足しこむ End If Next j
これでMsgBoxでもなんでもいい。Dic.Item(“1110”)で合計金額が表示される。そこまで出来れば後はなんでも使えるだろう。
ネットでは部署コードをサマリーする目的など(いわゆるDistinct)で説明が見つかったが、それじゃ足らないんだ。
だが、これで連想配列に入れた取り出し方が解るだろう。あくまで忘備録だ。人様に見せる代物じゃない。
コメント