データの取り込みと集計 (手作業での操作例と、それをVBAで。)

■ Excel豆知識53



「データを扱う時のいろいろな操作」としてご紹介した操作のいくつかを使って何か集計をし
てみたいと思います。

自分の仕事でよく利用しているパターンで考えてみると、会計システム、給与システム、レセ
コンなどの様々なシステムから出力されるデータには、そのまますぐに集計に使えるものもあ
りますが、何らかの前処理をすることによってぐっと集計が やり易くなるものもあります。

基本的な流れとしては、出力されたデータに対して
 1.どういうデータで構成されているかを把握する
 2.そのデータに適した取り込み方法を選択する
 3.集計しやすい形に整形
 4.集計に必要な項目が不足していれば数式等を利用して項目を追加する
 5.フィルタオプションで必要なデータを抽出
 6.ピボットテーブルで集計
 7.欲しい印刷物があればその形で表示させる
というような手順を考えます。

今回は、毎月1回出力されるCSVデータから、必要項目を取得し、前月までのデータに追加し、
ピボットテーブルで集計することをしてみます。
また、毎月同じパターンで操作をしますので、その操作をVBAにして、ボタンをクリックする
とその操作が自動で行われるという風にしたいと思います。

プロの方に作ってもらうのではなく、職場で自分たちでExcelVBAを利用する場合には「わかり
やすい」というのがとても大事なことのような気がします。
なので、私が作る際には「手作業でやる手順を素直にVBAのコードにする」ということを基本
にしています。(全部そのまま、という訳にはいきませんが、なるべく目で見て作業の手順が
わかるように心がけています。)

ということで、まずは手作業でその手順をやってみて、その後で、それをVBAにしてみようと
思います。
別にデータはCSVでなくてもよいのですが、とりあえずよくある例としてCSVデータのサンプル
にしました。
53-1 データの取り込みと集計(はじめに)
サンプルデータにはExcel豆知識44にサンプルマクロを書いていただいたTasanさんの「雨のち晴れ」サイト
のこちらのサンプルを利用させていただいて、そこに不要項目が入っていたとしたら、というような感じの
ものを作りました。不要な項目については、データは入れていません。 
CSVデータのサンプル

列幅を調整して「########」と表示されている日付を正しく表示
CSVファイルに「日付」がある場合、その形式によってはExcelとの相性で取扱いに工夫が必要になる場合が
ありますが、とりあえず、何も考慮せずに日付として取りこめる「yyyy/m/d」の形式になっているものをサ
ンプルデータとします。

元データには2つのパターンを想定しました。元データ@手を加えずにそのまま取りこめるデータA不要な列やデータがあって、何らかの抽出を行って取りこみたいデータまた、取り込むタイミングも2種類想定しました。	取り込むタイミングA毎月1回B複数のファイルをまとめて

最初に、②の「何らかの抽出を行って取り込むデータ」で、Aの「毎月1回取り込む」パターン
の手作業での手順をひと通りやってみて、
その後、①、②、③について、AとBの両方のタイミングでの取込みをVBAで考えてみることにします。
@とAとBの例

なお、CSVデータは、Excelで開いた時に	
Excel豆知識20で説明をしている「リスト形式」になっているものを想定しています。

・リストの1行目には列見出しが設定されている。
(フィルタオプションを利用するつもりでいるので、列見出しに重複がないこと。)
・リストの範囲をエクセルが正しく認識出来るように、「表のタイトル」とか「合計」などの
リスト中のデータと意味が異なるものとの間には少なくとも1つの空白行、空白列が必要。
(表のぐるっとひとまわりのセルが空白であること。)
このような状態になっていれば、リスト中の一つのセルを選択して、Ctrlキーを押しながらテ
ンキーのアスタリスク(*)を押すと、リスト全体が範囲選択されます。つまり、その範囲全体
がデータ範囲だということをエクセルが認識するので、何かと都合が良いのです。

②のタイプの出力データでは、
CSVデータをExcelで開いた時のシートでA1セル起点に繋がった範囲に、欲しい項目と不要な項目
が一緒に存在している、という想定だけにしました。
普段仕事で扱っているCSVデータの中には、リストの開始行が5行目あたりで、その上に別の関連データが表示され
ているものなどもありますが、今回はとりあえずA1セルを起点としてリストがある、という想定にします。
A1起点でない場合には、起点になるセルとつながった範囲を選択した時に、起点になるセルが先頭セルになるような
状態でリスト形式になっていれば起点のセル番地を変更すればいいだけなので、対応可能です。 

③のタイプのサンプルは、内容としては何の意味も持っていないものです。Excelで開いたのでは欲しい形式で取込
むことが出来ない例、というだけのサンプルです。

	
毎月下図のような感じで「yyyymmData.csv」というデータが何かのシステムから出力されるとい
う想定にしました。
(サンプルとして2年分を用意してみました。)
CSV保存用フォルダ内のファイル

そのCSVをExcelで開いて、A1セルを選択した状態で「Ctrlキー」+テンキーの「*」を押して、A1
セルから繋がったセル範囲が選択された状態になっているのが下図です。
CSVをExcelで開いた

上図のデータから、下図のA1からE1にある5つの項目をこの列の並びで取得したいと思います。
「入荷地」にある「テスト」という行は集計データには含めたくないので、CSVファイルからデー
タを取りこむ際にそれを除外したいと思います。
取り込んだデータ

ひと月分の必要データをまず「取込用」シートに取りこんで、その後、項目行を除いたデータ部分
を、前月までのデータが保存されている「Data」シートに追加します。そして、追加したデータも
含む範囲に「集計用データ」という名前をつけて、ピボットテーブルのデータソースに用います。
この時、Dataシートのデータ範囲を「テーブル」に設定しておけば、追加データも自動的にテーブ
ルの範囲に取りこまれますので、そのやりかたでも良いです。

ピボットテーブルは、最初の1か月分のデータを取りこんだ時に作成して、あとは取りこみ時に更
新だけをするようにしたいと思います。VBAでピボットテーブルを作成しても良いのですが、結構
大変なので、既に作ってあるピボットを更新する方法にします。「入荷日」をピボットテーブルで
年月でグループ化しますので、下図のような月ごとの集計が簡単に出来ます。
ピボットテーブルの例

手作業で行うには手順が多すぎて大変だと思うようなものでも、手順さえはっきりわかれば、それを
VBAのコードにしていくのはそれほど大変ではないような気がします。VBAだけで全部やろうとするの
は素人にとっては大変ですが、フィルタオプションやピボットテーブルなどのExcelに備わった機能
を利用して、その繋ぎ部分だけをVBAにする、というのは結構わかりやすい気がします。

次は、その操作を手作業でやってみます。
ページTOPへ