大規模なデータ編集を楽にするアイデア

#この文書の目的
##状況説明
　最近、一人で担当するにはちょっと大規模なデータの編集を仕事で行った。
　それは件数が約8000件、一つのデータに項目が100近くあるというサイズのExcelワークシートである。
　作業内容は外部から渡された元データを、こちらで整備した紙書類を元にアップデートする。
　具体的なデータ内容は示すとまずいので、会員の氏名、住所のほかに過去の住所とかいろいな項目がごった煮状態で管理されている次のようなワークシートだと思ってほしい。
![図1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/347462/1e6d0c1e-6282-fdaf-828e-d51f9a567a1d.png)
　これを実質2週間くらいでアップデートする必要があったのだが、困ったことに、手分けして複数人で作業することができなかった。
　Accessを用いて、どのようにして効率的かつ正確性を確保しつつ作業したのかについて、私なりのアイデアをまとめてみる。
##MS Accessについて
　MS AccessはMS Officeの一部をなすデータベース管理ソフトである。
　一応RDBMSの一種であり、SQLも使える。
　私なりの解釈だが、MS Accessは
1．データベースエンジン(MS Jet)
2．データベース作成(テーブルやクエリーの定義など)のGUIツール
3．フォーム作成のGUIツール
4．レポート作成のGUIツール
5．Visual Basic for Apprication開発環境
がセットになったプログラミング環境だと思っている。
　そして、5を使いこなすことで、かなり高度なシステムも作成できる。
　今回は2と3を主に使う。
##オフィスでのあるある
　オフィスでデータ管理する場合、定型的で業務に密接に結びついている場合、それなりのところではITを用いた業務システム化がされていると思う。
　しかし、オフィス業務では、様々な要因でシステム化できないデータ管理があるわけですね。
　例えば年に一回か二回しか行う必要が無い業務だとか、基幹業務の一部なんだけど外部環境が変わってきて業務システムでカバーしきれなくなった作業とかが考えられる。
　今回の業務は、数年に一回行う業務で、その都度、作業内容が外部から指示されるものの為、システム化すること自体ができない業務だった。
　で、このような業務システム化できない業務でも、データの管理をパソコンで行うと便利になることが多く、Excelを使って管理しているところも多くあると思う。
##Excel(表計算ソフト)でのデータ管理の問題点
　Excelに代表される表計算ソフトの本来の用途は、名は体を現すのとおり数表を計算することである。
　しかし、紙書類でデータを管理するとき、罫線を引いて管理するのと見た目が似ているせいか、表計算ソフトを用いてデータ管理をすることも多い。
　多いというか、大多数の職場では表計算ソフトでデータ管理をしているんじゃ無かろうか。
　この理由として、見た目が似ているだけで無く、適当に項目名を入力していっても、それなりにデータ管理用の表ができてしまう手軽さがあると思う。
　次に、この表計算ソフトでデータ管理の問題点をあげてみる。
1．人間がデータ管理する必要がある。
　表計算ソフトの場合、データの整列などの機能はあるが、それを都度人間が実行する必要がある。
2．意図せず編集してしまうことがある。
　大規模なワークシートを編集している際、マウスやキーボードを操作していて、本来編集してはいけないセルの内容を書き換えてもわかりにくい(しらずしらずのうちにマウスでセルの内容を書き換えてることはある・・・)。
3．データ加工を確実に行うことが困難。
　表計算ソフトでは、データ加工をする時は対象のセルすべてに計算式を入力する必要がある。また、これらの計算式が正しく動いているか確認するには、対象全てのセルについて人間が確認する必要がある。
4．外形的なチェックを強制できない。
　表計算ソフトのセルでは、自由にデータを入力できる為、入力データをチェックすることが大変困難である。
5．データベースの整合性を維持することが大変困難。
　表計算ソフトのワークシートは、自由に入力できる為、同じデータが一つしか入れてはいけないとしても、人間が間違って何度でも入力できてしまう。こういう制限を行う為にはマクロを組む必要がある。
　私の結論を言うと、データ管理には表計算ソフトは使うべきでは無い。
　なぜなら以上のような難点の為、作成したワークシートを人間がチェックする必要があるからだ。一度全体をチェックし終わっても、どこか一点編集したならば、それ以外のところも正しい内容確認する必要がある。
　面倒でも正しい使い方を覚えてデータベース管理ソフトを使うことで、仕事は楽にすることができる。
　データベースなら、次のような利点があり、特に2，3，5については人間の負担が大きく削減できる。
##データベースでのデータ管理のメリット
　データベースは表計算ソフト見た目が似ているのに、一般的にはあまり使われていない。
　MS Office Proにはデータベース管理ソフトとしてAccessが入っているが、使っている人は少ない。以下、Excelと使い分けるものとして、データベースはAccessを想定している。
　データベースは使い始め前に管理対象について分析して、どのような属性があって、目的を果たすにはどのようにデータを管理・加工するか考える必要があり、とっつきにくいことが避けられている原因のように感じる。
　ただデータベースは名前のとおりデータ管理をすることが目的のソフトであり、使いこなせばデータ管理が大変楽になる。先の表計算ソフトの問題点について、データベースを使えばどうなのかまとめてみる。
1．データベース管理ソフトが自動的にデータを管理する。
　整列する規則などを指定すれば、自動的に整列されるし、新規入力も簡単になる。
2．手軽に編集させたい項目のみを見せることができる。
　フォームやクエリーを作成し、簡単に編集させたい項目のみ見せることができる。
3．クエリーを使えば対象全体に一括でデータ加工できる。
　さらにAccessならVBAを使うことで、本格的なトランザクション処理も可能。
4．テーブル定義時にルールを定義するなど入力データを制限することが簡単。
　自由にデータ入力できない代わり、テーブル定義時点で管理するデータ型を指定でき、データの一貫性を確保できることは大量のデータを管理する際には大きなメリットになる。さらにフォームを利用すれば、データの外形的なチェックだけでなく、インタラクティブな入力補助も簡単にできる。
5．項目ごとに制約があり、自由に入力できない代わりに、データベース全体の一貫性をデータベース管理ソフトが確保してくれる。
　表計算ソフトの問題点をどうにかしようという視点で、データベースを見るわけだから、当然、データベースを使えば先に挙げた問題点を解決できるわけですな。
#具体的な方法
　ここから、具体的にどのような方法をとるか説明する。
##前提知識
1．データは交換できる。
　まず、表計算ソフトとデータベースの間でデータを交換できることを知っている必要がある。AccessはExcelのファイルを取り込んだり、リンクして利用することができ、さらに書き出すこともできる。
2．データ型
　数値と数字は別のもの、という認識。
　例えば、金額の181234567を管理するときは、数値型の整数型や実数型、通貨型などで管理する。
　しかし、0181234567が電話番号ならば文字列型で管理する。
　これは桁に意味があるからで、電話番号では018-123-4567の最初3桁が秋田市、123が交換局を現すといったルールがあり、数値型で管理し先頭の0が失われると意味が変わってしまうからである。
3．クエリーには選択クエリー以外にも種類がある。
　Accessのクエリービルダーでは、簡単にデータ追加やデータ書き換えのためのクエリーを作成できる。
4．その他
　現行型のAccessでは、リンクしたExcelのワークブックを編集できない。逆に考えると、オリジナルを保護しつつ、データ編集することができる。
　
##必要な作業の分析
　作業を行う前に、どのような形に加工するのか完成形を把握する必要がある。
###作成するデータの目的は何か
　今回の事例であれば、依頼元にあるデータベースの内容を、現在のものにアップデートすることが目的である。
　渡されたExcelワークシートをみると、項目数が100近くあったが、そのうちの大部分は過去のデータであったり、当方では把握していない内容であった。
　おそらく、依頼元のデータベースから、必要な項目を吟味せず出力し、全国の受託機関に渡してきたものと推測される。
###データをどのように編集するか
　作業の目的と手順を把握したら、具体的に渡されたデータをどのように編集するのか方針を立てる。

1．編集対象の項目と編集方法
　渡された業務指示書と付き合わせて、編集が必要な項目を洗い出すと10個程度になった。こうなると、それ以外の項目は変えてはいけないわけで、Excelワークシートで編集すると「意図せず内容を書き換えてしまう」リスクが高くなる。
　例えば先のワークシートでA列～H列まで、氏名から携帯電話までと、L列の会員ランクが編集対象だとする。
　まず、Accessに元データを取り込んで、クエリーで項目を選択するだけでも、関係ない項目を編集リスクを無くすことができる。
　しかし、項目毎に全角漢字、ひらがな、半角数字など入力する文字種が違っていたり、電話番号では数字の文字数が決まっていたりする。こうなるとフォームを利用した方が便利である。
2．編集履歴を残すか
　大量のデータを編集する場合、入力内容の正確性を確認する作業は大変面倒になる。
　編集したレコードだけチェックできれば、全体を見直す必要性は少なくなる。
　編集したレコードと、それ以外を区別する簡単な方法は、レコードに編集日時などの項目を追加することだが、これでは結局全てのデータをチェックするのと同じことになる。
　ちょっと手間になるが、編集したいレコードを別テーブル(編集データテーブルとする)にコピー・編集し、編集データテーブルの内容確認後、クエリーで元データを一括で書き換えるという方法をとると、データチェックが楽になる。
　さらに、間違いなどでやり直す際、元データを取り込み直すことで、簡単に作業を再実行できる。もし、Excelワークシートを編集してしまうと、間違いを一つ一つワークシートの中から探して直すことになるし、元データの差し替えなどがあれば、編集全体をやり直す必要が出てくる。

###具体的な手順
　以上のような手順を経て、次のように作業を行った。
1．Excelワークブックの元データをコピーし、作業用データ(以下、作業用ワークブック)を作成する。
2．Accessから、作業用ワークブックの必要なワークシートを取り込む。
3．編集が必要な項目が、編集対象や属性毎にいくつかのグループ(以下、編集グループ)に分けられるため、そのグループ毎に必要な項目を選択したクエリーを作成する。
4．編集グループ毎に、作業に必要なテーブルと編集用フォームを作成する。今回の作業では、編集が必要なレコードのみを別のテーブルにコピーし、コピー先の項目を編集し、最後に書き戻す。編集元の項目を不用意に編集しないようフォームに設定を行った。
　具体的には、
　a.元データを表示するテキストボックスのプロパティは編集ロックにする。
　b.コピーボタンを押すと、元データの各項目値を編集用テキストボックスにコピーする。
　c.項目編集後、確定というボタンを押すと、編集用テキストボックスの内容を作業用テーブルに書き込む。
とした。
　また、元データの並び順は、現在の状態を調べた紙書類と同じ並び順としておく。
5．紙書類を参照しながら、元データを編集する。
6．全ての項目のアップデート用データを登録し終わったら、編集グループ毎に更新クエリを作成し、実行する。
7．アップデート済みのデータを作業用データのワークブックに書き戻す。
　　もし、標準機能の書き出しで対応できない場合、VBAでExcelを制御し出力することも考える。
#言い訳
　具体的に依頼元から渡されたデータや作業指示書を示して、それを実際に作業したファイルを示しながら説明できればわかりやすいと思うのだが、守秘義務もあるので、漠然とした文章でしか説明できない。
　私が説明したかった作業方法を再現できる公開されているデータが見つかったら、改めて具体例を示してみたい。
#最近、思うこと
　最近、RPAが話題になっているが、RPAのツールを入れるだけでは、さほど効果は出ないと思う。
　まず、業務システムに乗せられないようなデータを、どのように管理すれば良いのか考え、MS Officeに含まれるアプリケーションを適切に使い分けられる程度のスキルが無いとRPAでも作業を自動化はできないだろう。　
　さらに、業務全体の流れを分析することも必要だが、まず、その業務がどんな目標や効果を目指しているのか理解し、それを実現するための方法論を前例にとらわれず実践できなければ、新しい道具を入れても、使いこなせない道具が増えるだけはないかと考える。
　そのためには、事務職といえども、体系的な方法論が必要だし、それを実践するために道具を使いこなす経験が必要だと思う。
(マスターのデータをExcelではなく、Accessで管理しようというだけで、すごい反対される職場なんだよね。今回の記事も世間では大したアイデアでは無いと思うのだが・・・・)