Pythonでデータ照合ツールを作ってみた

Python Python

先日こちらの記事でPythonのコードを実行ファイル化(exe化)する方法をご紹介しました。その記事の公開をTwitterでつぶやいたところ、「試してみたいけど適当なコードがナッシング」的なリプライを頂き・・・ナッシングとか書くと私の年齢がバレますねw

しかし、こんな風に反応を頂けるのはすごく嬉しいものです!そこで、自分のトレーニングも兼ねてちょっと便利なツール(というほど大袈裟なものではありませんが)を作ってみたのでコードを公開します。色々応用が利くと思うので、お役に立てば幸いです。

サンプルの概要

2つのファイルの中身を突合させるような状況、割とありがちではないでしょうか?たとえば…


  • 売掛金と入金のデ ータを突き合わせる
  • 顧客名簿とコンタクト履歴を突き合わせる
  • 登録した内容と申請された内容を突き合わせる

今回のサンプルは一つ目の売掛金と入金のデータ突合をイメージして作りましたが、システムで処理しきれない作業や特別にピックアップが必要なデータの選別といった状況は他にもたくさんありそうです。

実行環境

例によってWindows10 64bit(バージョン2004)、Pythonは3.6.1です。

下準備

売掛金を管理するブック「管理台帳.xlsx」と入金を管理する「入金台帳.xlsx」を作成します。

管理台帳はA列からC列までの3列構成で、順に「管理番号」「売掛先」「金額」を入力します。A列の値は重複しないように注意してください。

管理台帳.xlsx

入金台帳は4列構成でA列から順に「入金日」「売掛先」「管理番号」「金額」です。A列の型は標準のままだとPythonで取り込む際にシリアル値として扱われ見にくくなるので、日付の演算は行いませんから文字列にしておくのが良いと思います。

入金台帳

Pythonのコード

冒頭でimportするのはos、pandas、openpyxlですが、他にxlrdも必要です。足りないものはあらかじめpipで揃えておきましょう。

それでは下記のコードを「sample-code.py」として保存してください。間違っている部分や「こうした方が良いよ」的な部分はお知らせ頂けると嬉しいです。

200行を超えていますが、数えてみたら100行はコメントでした。VBAでも同じことは実現できますが、Pythonの方がスッキリしています(個人の感想です)。

実行してみよう!

コマンドプロンプトを起動したら「python」に続き半角スペースを入れ、sample-code.pyをドラッグアンドドロップしてEnterキーを押下しましょう。

画面の指示に従って管理台帳.xlsxをドラッグアンドドロップしてEnterキー押下、入金台帳をドラッグアンドドロップしてEnterキーを押下するとデスクトップに「未入金一覧.xlsx」が作成されますので中身を確認します。

未入金一覧.xlsx

E~H列の入金データをもとにB~D列の売掛金をチェックし、塗りつぶされなかったものが未入金になります。また、I列には売掛金と入金金額の差異を出力していますので、振込手数料を相殺された、そもそもの振込金額がまちがっている…といったデータを簡単に見つけることが出来ます。このサンプルのように数件であれば目検でも問題無いのですが、これが数十~数百になると・・・考えたくもないですね。しかし、Pythonでコードを書いておけば一瞬で終わり、いつでも何度でも利用できるのです。

こういったものをPyInstallerでexe化すると配布が容易になります・・・がPyInstallerをご紹介した記事の趣旨でした。折角なのでexe化してみましょう!

pyinstaller C:\Users\sandambara\Desktop\sample-code.py --onefile

このsample-code.pyはコンソールを使って作業するので「–noconsole」を付けないようにしましょう。

皆さんもご自慢のツール配布にぜひお役立てください!

コメント

  1. Tomy より:

    業務で使用してみたいためホームページを見させて頂きコピペで実行してみました。とても良い情報をありがとうございます。私の環境ではexit()でエラーが出たためsysをimportして解決しましたがその後、Excelファイルの読み込みの段階(たぶん49列)の関数でexpect判定になってしまいます。Python初学者です。原因が分かれば教えていただきたいです。よろしくお願いします。

    • sandambara sandambara より:

      Tomyさま

      はじめまして!catchに入ってしまうということは53行目の処理でコケているということになろうかと思いますので、49行目で取得したファイルパス、開いたファイルにSheet1が存在すること、Sheet1の列数が3(=C列まで使用している)ことなどを再度ご確認頂ければと思います。

      あとはcatchの中に「print str(e.message)」のようにしてエラー内容そのものを出力させるのも一手ですね。デバッグの段階ではシステムが出力するエラーメッセージそのものを見るほうが早く解決にたどり着くことも多いです。

      お役に立てると良いのですが・・・今後ともよろしくお願い申し上げます!

      • Tomy より:

        早急なご返信ありがとうございます。試してみようと思います。また分からなければ質問させていただきますm(_ _)m

  2. Tomy より:

    お忙しいところ申し訳ありません。質問させて下さい。Excelの内容を確認しましたがデータは所定のセルに入っていたためprint str(e.message)を試そうと思ったのですがcatchのどこに入れて良いのか分からないのですが教えていただけますでしょうか。初歩的な質問ですみません。

    • sandambara sandambara より:

      こんばんは。53行目の処理に成功すれば次に実行されるのは74行目、失敗すれば54行目のcatch以後が実行され57行目のexit()でプログラムを終了しますので、54行目と57行目の間であればどこでも大丈夫です。がんばってください!