robot playing piano

Python システムTips

Excel→Python→自動入力でRPAぽいことをする

更新日:

筆者は総務経理部でプログラマーではないですが、2ヶ月ほど本を読むなりしてPythonをかじってみました。

その一番の動機は、「RPA」チックなことができそうだと思ったためです。

なぜそう思ったかというえば、GUI入力しか持たずに入力が非効率極まりない会社の伝票発行システムがあり、それをターゲットにしたかったのです。
そのシステムはGUIのウィンドウにフォーカスさえ当たっていればキーボードのみで入力が完結するので、RPA向きです。

ゴール設定と処理の流れ

ゴールは次のように設定しました。

過去入力した入出金・振替等の経理伝票を再利用し、変更箇所だけ手直ししてあとは自動入力できるようにする

処理とデータの流れは下の図のイメージです。

図:PythonでRPAのようにアプリ自動入力する
図:PythonでRPAのようにアプリ自動入力する

過去のデータはMySQLのDBに貯まるようになっていたので、そこから検索して取り出します。

取り出したデータを一覧化して取捨選択したり値を加工するのにはやはりExcelが皆慣れているので、SQLクエリの発行とデータ取込はExcelにてVBAに任せることにします。

入力データが決まったら、ExcelからVBAでPythonを実行して、業務システムのウィンドウにキー入力を始めます。ここが今回の肝です。

処理の詳細

Advertisement

具体的な処理について、順に沿っておおまかに説明していきます。

MySQL DB → Excel

WindowsにODBCドライバーをインストールしてその機能を使いました。たまたま別のツールでODBCを全PCに入れていたのでそれがネックにはなりませんでした。

ODBCドライバーは32bit/64bitがあり、更にExcelも64bitOSであっても32bit版が動いてたりもするので、そのあたりをしっかり合わせこまないと動きません。ODBCのインストール方法についてはたくさん情報がありますので省略。

ExcelのVBAからODBCを使うやり方は、「参照設定」か「CreateObject関数を使う」という2つのやり方があります

そもそもこれらの方法自体今や古そうなのですが、「MySQL DB → Excel」の部分は3年前に先に作ったものなので、できあいのものを使いまわしました。
今となってはこれもPythonでやったほうが良いかもしれませんが、あまりPCを使わない人でもExcelだけは慣れているので、VBAでやる価値はそこにあります。

参考にするなら下記のサイトが良いかと思います。

https://excelwork.info/excel/databaseadobase/

Excel → Python

これからが本題の、ExcelからPythonコードを実行させる方法ですが、xlwingsというモジュールを使います。

アドインから実行する方法と、VBAの標準モジュールに直接インポートする方法がありますが、あくまでVBAチックにPythonを実行したかったので、アドインのUIを使わない後者にしました。次のサイトがわかりやすいです。

VBAからのPython呼び出し方も、上のサイトのまんま!

Python → キー自動入力

Pythonによるキーボード入力のエミュレートはpyautoguiを使います。

これも情報が大量にあって参考サイトを探すのがたいへんですが、下記がシンプルですね。

その他の細かいこと

なんだやってることはコピペじゃないか、という声があったとしたら、それはPythonの素晴らしさを言い当てています。私なんかの非プログラマーでもネットで調べたらそれなりにできるわけですから。

しかし「やっぱりコピペだけでは動かない」というのもまた理。

最終的に使えるものにするに当たって、細かいノウハウを繋ぎ込んでいきましたので紹介します。

入力したいアプリウィンドウを最前面にする

ExcelからPythonでキー入力を始める前に、当然ですが業務アプリのウィンドウを最前面にしておかないといけません。そうでないとExcelのセルに入力が始まってしまいます。

ということでこれまたいろいろなサイトを参考にするも、かなり苦戦しました。もはや拝借したコードをどのサイトから持ってきたか忘れたくらいです。

簡潔明瞭な方法がなかなか見つからず、pyautoguiでAlt+Tab入力するしか無いかとあきらめかけたところ、win32guiにて実現できました。

FindWindow()で業務アプリのウィンドウハンドルを取得し、win32gui.SetWindowPos()で常に手前にセットした後、それを解除する、という処理です。

ただしそれだけだと、最前面に来てもアクティブにはならずキー入力を受け付けないということで、今度はwin32apiでマウスエミュレートしてウィンドウの無難な場所をクリックすることで、ウィンドウをアクティブ化します。

適宜sleepを入れてタイミングを調整しています。pyautoguiでもできるかもしれませんが、ネットの知者に右ならえしました。

pyautoguiで日本語入力

pyautoguiでは日本語入力ができません

つまり

pyautogui.typewrite(“日本語”)

としてもできないのです。
回避方法としては、コピペならできるということで、日本語文字列をコピーした上で、ctrl + vで入力します。

そこで問題が。なんと、我が社のアンティーク業務アプリは、ctrl + vができなかったのです。

それはそれは絶望しましたが、これまでの努力を水の泡にはできない。ということで、超強引に、1度の変換キー押下で狙った日本語に変換されるよう、辞書ツールを弄る方法を編み出しました。次の流れです。

  1. MSIMEの辞書ツールを起動
  2. PowerShellでユーザー辞書のパスをダミー辞書と差し替える
  3. ダミー辞書に対して、変換したい日本語が変換キー一発で出るような単語登録する
  4. 日本語自動入力(かな入力+変換キー1回)
  5. 入力が終わったらダミー辞書を削除し、元のユーザー辞書のパスに戻す

はい、何やってるんだ俺は感が果てしないです。コードにすると下記です。

なんとか強引にできたものの、適宜スリープを入れるので辞書登録に10秒くらいかかるし、いくらなんでも美しくない。

藁にもすがる思いで、ホコリを被った業務システムの技術資料をひっくり返して見たところ、なんだかコピペ機能について記述された箇所を発見。
僅かな望みをもって、そのアンティークシステムの見守り人、つまり業務システムの保守メーカーに「コピペできそうだけどなぜできない?」と聞いてみました。

そうしたら、「設定すればできるかも」と。

え!?なぜできない設定になってるの?中小企業社員はコピペ操作を知らないとでも?

結果、コピペができるようシステム設定してもらいました。

このシステム使って15年以上経ち、あと3年くらいしか使うつもりがないのに、今更、「入力でコピペができる!」という大幅パワーアップを遂げたのです。
いや、今まで誰も疑問に思わない社員も社員だし、無駄に機能を外しているSEもSEだし。

これにてめでたく、「ユーザー辞書登録をPythonで自動化する」というアクロバティックな実装は、無駄となりました。
弔いの意味を込めてここで公開しました。

Escapeキーでpyautoguiを強制終了する

pyautoguiでGUIの自動入力するのは良いものの、思わぬ結果のまま入力が突き進んだらたいへんなことになります。

そこでフェールセーフ設計として、手動でマウスカーソルを座標(0,0)に持っていくと動作がとまる仕掛けを有効にしておきます。

bttb.s1.valueserver.jp
PyAutoGUIの処理を止める・停止する(FAIL SAFE)
http://bttb.s1.valueserver.jp/wordpress/blog/2017/08/13/pyautoguiの処理を止める・停止するfail-safe/

pyautoguiでコロン「:」が入力できないバグを直す

このようなバグがありますので、ライブラリのpyファイルを直接直します。
GitHubにもレコードが上がっていますが、やり方は下のサイトをご覧ください。

疲れた!だが動いて爽快

このような苦労の末、なんとかやりたかったことが実現できました。

エクセルで作った使い回しのデータが、業務システムに勝手に入力されていく様は、感動的です。
こんな便利なものを、オール無料で作れてしまうことが素晴らしい。
ただし、私みたいな好きモノの苦労が裏では必要となります。

今回の記事が誰かの一助になることを願ってやみません。

Advertisement

-Python, システムTips

Copyright© utsushiyo.com(現世ドットコム) , 2024 All Rights Reserved.