「エクセル栄養君」をPyAutoGuiで自動化する最も簡単なプログラム

Python

みなさん、こんにちは。
シンノユウキ(@y_stadio)です。

今回はエクセルの栄養計算アドイン:エクセル栄養君をPyAutoGuiを使って自動化する方法を紹介します.普段の栄養計算にエクセル栄養君を使っているという方,学校などでの栄養計算課題が面倒だと感じている方は必見です.

では行きましょう!

Pythonを使える環境であることは前提として...

エクセル栄養君を自動化するにあたり,Pythonの開発環境が整っていることを前提とします.初めてPythonを使うという方は,まずはその環境を用意しましょう.以下の連載を読まれると良いかもしれません.

非エンジニアがWindowsでPythonを始める場合どこから何をインストールするべきか
非エンジニアの一般ビジネスマンの初心者がPythonをはじめる際のWindows版PythonでオススメのディストリビューションやIDEを考えつつ、それを実際にインストールするところまでをお伝えします。

 

PyAutoGuiとは?

初めに,PyAutoGuiについて説明しておきます.

PyAutoGuiというのは,キーボード操作やマウス操作を自動化するためのPythonモジュールのことです.今回はこれを使って,エクセル栄養君を操作していきます.

公式サイト(英語)は以下です.

Welcome to PyAutoGUI’s documentation! — PyAutoGUI 1.0.0 documentation

 

どんな物ができる?

最初に完成形を確認しておきましょう.最終的には以下のような自動化が実現する予定です.

 

今回自動化するのは栄養計算の部分です.エクセル栄養君で複数シートの栄養計算をする場合,シートごとに以下の操作が必要になります:

  • ツールバーの栄養計算ボタンをクリックする
  • 出現したユーザーフォームのOKボタンをクリックする

もしシート数が数枚程度であれば簡単ですが,数百人の栄養調査を行った場合や何日分もの献立作成を行う場合,かなり面倒かと思います.

そこで今回のスクリプトの出番です.今回紹介するスクリプトを実行することで栄養計算を自動化できます.

では,実際にコードを紹介していきます.

 

まずは基本操作を覚えよう!

そのために,まずはPyAutoGuiの基本操作を理解しておきましょう.以下の3つの基本操作を紹介します:

  • クリックする
  • キーを入力する
  • ショートカットキーを入力する

これらのコードは以下の通りです.

click関数は引数にクリックする場所の絶対位置を取ることで,その場所をクリックします.またオプションとしてpauseを指定することで,クリックが実行され後に指定した秒数だけ待つ操作が行われます.

press関数は引数に入力するキーを指定することでそのキーを入力します.上のサンプルではenterを指定していますので,この関数が実行された際にエンターキーが入力されます.

hotkey関数ではショートカットキーを入力できます.press関数では単一のキーしか入力できないので,同時に押す必要がある場合=ショートカットキーなどの場合はこちらで入力します.引数にキーを指定することでそれらのキーを同時に入力します.

 

自動化してみよう!

ではいよいよ実際にコードを書いていきます.

1.モジュールをインポートしよう!

まずは使用するモジュールをインポートしましょう.

ターミナルなどで以下を実行し,PyAutoGuiをインストールしましょう.

そして以下のスクリプトを実行してください.

 

2.クリックする位置を指定しよう!

次にクリックする位置を指定していきます.PyAutoGuiでは,クリックする位置をx座標, y座標の絶対位置で指定する必要があります.なので,まずは栄養計算ボタンなどはどの座標に該当するのかなどを把握する必要があります.

それには,PyAutoGuiモジュールのpositionメソッドを用います.以下のコードを実行することで,現在マウスがある位置がわかります.

これで,エクセルを開き,エクセル栄養君の栄養計算ボタンがある場所の座標を調べましょう.

上の画像の部分にマウスを置いたまま上記のコードを実行してください.それで座標を把握できます.

また,メニュータブのアドインをクリックしておかないと,そもそも栄養君のツールバーが表示されないので,アドインの部分をクリックするための処理も実装します.ので,アドインの部分の座標も指定しておきましょう.

そして,取得できたそれらの座標は変数として設定しておくと便利です.以下のコードを追記してください.

addin_positionにメニューのアドインの座標が,nut_calc_positionに栄養計算ボタンの座標がそれぞれ入力されています.この値はディスプレイの環境やエクセルの表示位置などによって変わるため,先ほど取得した任意の座標に変更してください.

 

3.自動化処理を実装しよう!

ではいよいよ自動化処理を実装していきましょう.以下のコードを実行してください.

今回の自動化の処理は以下のような順序で行われています:

  1. アドインボタンをクリック
  2. 栄養計算ボタンをクリック
  3. エンターキーを入力
  4. 次のシートへ

この処理をシート数分だけ繰り返しています.

ではコードを解説していきます.

2行目ではアドインボタンをクリックしています.その際に,Excel画面がアクティブでないとうまく処理が行われないので,クリックを2度行っています.clicks=2とすることで,intervalで指定した秒数(今回は1秒)の間隔を開けて2度クリックされます.

3行目では処理を行うシート数を指定しています.後にシート数分だけ繰り返し処理を行う際に使用します.

5行目から繰り返し処理が行われます.3行目で指定したシート数を指定しています.

7行目ではエクセル栄養君の栄養計算ボタンをクリックする処理を実装しています.nut_calc_positionに栄養計算ボタンの座標が入力されているので,そこをクリックしています.

10行目ではエンターキーを入力しています.栄養計算ボタンをクリックすると以下のようなユーザーフォームが表示されますので,その「OK」ボタンをクリックするためにエンターキーを入力しています.

そして13行目でショートカットキー:ctrl+pgdnを入力しています.これはExcelのショートカットキーで次のシートに移動するを意味しています.これで次のシートに移動してループされます.

これで,最も簡単なエクセル栄養君自動化プログラムの完成です!

 

※期待通りに動かない場合は?

期待通りに動かない場合,座標の位置が間違えていたり,pauseが短かったりすることが考えられます.座標の位置はそれぞれの環境でしっかりと調整してください.また,pauseの時間もそれぞれのPC環境によって最適な数字は異なりますので,長くするなどの工夫をしてみてください.

 

まとめ

今回はExcel栄養君をPyAutoGuiを用いて自動化する際の最も簡単なプログラムをご紹介しました.ただ,いちいち座標位置を指定したりするのは面倒でしょね.次回はスクリーンショットなどの機能を活用して,座標位置などをその都度指定せずに済むような実装を行ってみたいと思います.

※次の記事はこちら!

「エクセル栄養君」をPyAutoGuiのScreenshot機能で自動化しよう!
今回はエクセル栄養君をPythonのモジュール:PyAutoGuiで自動化することを目指します.前回の記事でも,一通りその機能を達成することができました: しかしこれでは少し不備がありますので,これをScreensho...