プログラミングがよくわからいけど、Pythonでマクロを組むといろいろ便利だって聞いた
Pythonは初学者向けとして有名なプログラミング言語です。そのわかりやすさから、プログラミングを専門としない方の中にも、仕事の自動化を目的としてPythonを使っている方がたくさんいます。今回はそんな仕事の自動化に焦点を絞り
- Pythonでマクロを組むとはどういうことか?
- Pythonで実際にExcelを制御してみる
といったことをお伝えします。また、仕事の自動化に役立つPythonのパッケージを紹介していきます。この記事でマクロを使った仕事の自動化に取り組んでみましょう!
本記事を読む前に、Pythonがどんなプログラミング言語なのかをおさらいしておきたい人は次の記事を参考にしてください。
→ Pythonとは?特徴やできること、活用例をわかりやすく簡単に解説
なお、その他のPythonの記事についてはこちらにまとめています。
Pythonでマクロを使う意味やメリット
Pythonでマクロを使うとは?
まず、Pythonでマクロを使うとはどういうことか、どんなメリットが有るのかを見ていきましょう。普段からPythonを使っている方にとっては、Pythonでマクロを使うということがそもそもピンとこないかもしれません。イメージとしては、
- マクロ→Excelなどに搭載されている簡易なプログラミング言語
- Python→本格的なプログラミング言語
といった感じではないでしょうか。このため、わざわざPythonでマクロを扱う理由がわからない、というのも無理はありません。
一応細かい話をしておくと、マクロそのものは割と奥の深いものでして、深入りするとメタプログラミングとか抽象構文木とかの話がでてきます。
ですが、明らかに本ブログの趣旨から逸脱するので、今回は扱いません。では、Pythonでマクロを使うとはどのようなことを指すのでしょうか。考え方のひとつにPythonをマクロ的に扱いたい、というのがあるかと思います。
つまり、ExcelマクロのようにPythonを使って、いろいろなアプリケーションを自動的に操作したい、というものです。じつは、Pythonは様々なアプリケーションを制御できるパッケージを持っているため、こういった使い方も可能なのです。
ですので、今回はPythonをつかったアプリケーション制御の話をみていきましょう。
Pythonでマクロを組むメリットとは?
では、Pythonでマクロを組むメリットについて考えていきましょう。Pythonでマクロを組むメリットは次の3点があげられます。
- 記述が簡単である
- アプリケーションの枠に縛られない
- 複雑な処理をPythonの側でしなくても良い
それぞれ具体的にみていきましょう。
記述が簡単
Pythonは他のプログラミング言語に比べて入門の難易度が低いと言われています。そのため、ノンプログラマーの方であっても比較的始めやすいことが大きな利点と言えます。
アプリケーションの枠に縛られない
例えばExcelで作った表を分析アプリに回して、更にそれを整形してPDFに出力、といったことをしたいとします。1回の処理であれば人間がひとつひとつ処理をしてけばいいですが、処理の回数が多くなってくると自動化したくなりますよね。
こういったとき、ExcelマクロではExcel内部の処理はできてもその外側の処理ができません。
ですが、Pythonであればアプリケーションを横断して自動化処理が可能になります。うまく組み合わせれば今やっている仕事がまるまる自動化可能かもしれませんね。
複雑な処理をPythonの側でしなくても良い
これはPython側からみた利点になります。Pythonはプログラミング言語なので、基本何でもできます。何でもできますが、実現するのに手間がかかる部分はなるべく楽をしたいですよね。
たとえば、GUIの処理とか、マウスの制御とか。こういったものを既存のアプリケーションで処理させれば、プログラミングの負担はある程度軽減できます。
楽をするために他のアプリを使う、というのは一考に値するのではないでしょうか。
PythonでExcelを操作してみよう!
それでは実践として、PythonでExcelを操作してみましょう!Excelを操作するパッケージとして、今回はOpenPyXLを使います。
これはExcelファイルの読み書き、編集などができるパッケージです。より複雑な解析をしたい場合、pandasというパッケージもあります。
こちらは機械学習をやっている方にはおなじみのパッケージかもしれません。ですが、基本的な操作はOpenPyXLで十分なので、今回はこちらを使います。基礎的な操作については、こちらの記事をご覧ください。
注意点として、OpenPyXLは.xlsxファイルしか扱うことができません。どういうことかというと、Excelのファイルは現在2系統あります。
- .xls: Excel2003以前のExcelファイル
- .xlsx: Excel2007以降のExcelファイル
Excel2007が発売されてもう10年以上たつので、おおよそ旧形式は駆逐されたと思いたいですが・・・現実にときどき見かけることもあるので、頭の片隅にでも置いておいてください。
Excelファイルを操作しよう
それでは実際にExcelファイルを操作していきましょう。今回は架空の取引月次まとめから、取引先ごとの取引金額を集計していきます。
Excelファイルはこちらtorihiki.xlsx
まず、OpenPyXLのインストールですね。
こちらはpipを使えるので、以下のコマンドをコマンドプロンプト(ターミナル)に入力して、パッケージをインストールしてください。
# pipを使う場合 pip install openpyxl # pip3を使う場合 pip3 install openpyxl
つづいて、解析するExcelファイルと同じ階層にPythonのソースファイルを作りましょう。ここから先はソースファイルを編集していきます。まずはパッケージのインポートとエクセルファイルの展開、シートオブジェクトの作成までを行います。
import openpyxl workbook = openpyxl.load_workbook('torihiki.xlsx') sheet = workbook["Sheet1"]
openpyxl.load_workbook()の引数にはファイルのパスを指定します。そして、workbook[]の引数にシートの名前を指定してあげます。つづいて、取引先のリストを取得しましょう。
suppliers = [] for i in range(3,9): cell_value = sheet.cell(row=i, column=2).value if cell_value not in suppliers: suppliers.append(cell_value) print(suppliers)
はじめに、取引先を入れる空のリストsuppliersを用意します。次のfor文ではB列の3-9行目、各取引先の名前が入っているセルに対して、次の処理を行っています。
- i行目のセルの値を取得
- セルの値がsuppliersにないならば、リストに追加、なければ何もしない
最後にリストの中身を表示しています。
['北海道商事', '青森商会', '武田INTナショナル']
つづいて、各取引先に対しての取引金額を集計していきましょう。
transaction_amounts = [] for i in suppliers: transaction_amount = 0 for j in range(3,9): supplier = sheet.cell(row=j, column=2).value if supplier == i : transaction_amount += sheet.cell(row=j, column=6).value transaction_amounts.append(transaction_amount)
まず、先ほどと同じく取引金額を入れるリスト、transaction_amountsを定義します。for文の中身は次のような処理をしています。
- 各取引先に対して次の処理を行う
- 最初に取引金額を一時的に入れる変数transaction_amountを初期化する
- B列に対して処理を行う
- j行目の取引先をsupplierに格納
- supplierとiの値が同じ(同じ取引先である)ならば、F列の値(取引金額)をtransaction_amountに追加
- 8行目まで確認し終わったら、transaction_amountの値(取引先iの取引金額合計値)をリストに加える
これで、取引先と取引金額のリストができました。では、この結果を新しいシートに記入しましょう。
new_sheet = workbook.create_sheet("集計") new_sheet["A1"] = "取引先" new_sheet["B1"] = "取引金額" for i, j, k in zip(list(range(3,9)), suppliers, transaction_amounts): new_sheet.cell(row=i, column=1, value=j) new_sheet.cell(row=i, column=2, value=k) workbook.save("torihiki.xlsx")
.create_sheet()で新しいシートを作ることができます。
引数には新しいシートの名前を入れましょう。A1,B1に集計結果のラベルを用意しました。for文を使って、suppliers, transaction_amountsの中身を各セルに書き込んでいきます。
最後に.save()でファイルを保存します。引数はファイルのパスになります。もとのファイルと同じ名前を使うと上書き保存となります。
ファイルをセーブしないと値が反映されないため、注意が必要ですね。以上でPythonを使ったExcelデータの集計ができました。
変数の範囲を調整すればどんな大きさのファイルでも対応できるので、うまく活用したいところです。また、xlsxファイルであれば処理できるため、Windows、Macを問わずに処理できるのも利点です。
汎用性の高いコードを書いて仕事を効率化したいですね。最後に今までの流れをまとめておきます。
import openpyxl workbook = openpyxl.load_workbook('torihiki.xlsx') sheet = workbook["Sheet1"] suppliers = [] for i in range(3,9): cell_value = sheet.cell(row=i, column=2).value if cell_value not in suppliers: suppliers.append(cell_value) print(suppliers) transaction_amounts = [] for i in suppliers: transaction_amount = 0 for j in range(3,9): supplier = sheet.cell(row=j, column=2).value if supplier == i : transaction_amount += sheet.cell(row=j, column=6).value transaction_amounts.append(transaction_amount) print(transaction_amounts) new_sheet = workbook.create_sheet("集計") print(workbook.worksheets) new_sheet["A1"] = "取引先" new_sheet["B1"] = "取引金額" for i, j, k in zip(list(range(3,9)), suppliers, transaction_amounts): new_sheet.cell(row=i, column=1, value=j) new_sheet.cell(row=i, column=2, value=k) print(list(new_sheet.values)) workbook.save("torihiki.xlsx")
他にもある!マクロ制作に便利なパッケージ
この章ではその他のアプリケーションなどを制御できるパッケージを紹介していきます。どれも仕事でよく目にするものばかりなので、使えるようになると自動化の幅が広がりますね。
PDF:PDFMiner.six
URL:https://github.com/pdfminer/pdfminer.six
仕事の業態を問わず、PDFファイルはビジネス現場でよく見かけるものではないでしょうか。
自分で制作する場合はともかく、よそから渡されたとき処理に困るファイルでもあったりします。特に内容を解析するのがけっこう手間だったり、最終的に内容を別の形式に書き起こしたり・・・
そういった手間を省いてくれるのが、PDFMiner.siです。こちらはPDF抽出ツールと公式に説明されています。
具体的にはPDFのテキストを抽出したり、レイアウトを抽出したり、とPDFを解析する上で必要な情報を取り出すことができます。日本語をほぼ問題なく扱えるのもポイントが高いですね。
(一部の異字体はさすがに処理できません。)
word:python-docx
URL:https://python-docx.readthedocs.io/en/latest/
PDFが外部向けの文章だとしたら、Wordファイルは内部向けでよく見かける文章の筆頭でしょう。
日々の報告書や稟議、会議資料など、いろいろなものがWordファイルでやり取りされているのではないでしょうか。ExcelがPythonで制御できたように、WordもPythonで制御可能です。
そのためのパッケージがpython-docxです。名前の通り、ファイルはdocx形式のみが対象になります。Word2003からdocx形式に移行しているので、こちらはほとんど問題になることはないはずです。サポートライフサイクルもはるか昔に終了していますしね・・・
もしdocファイルに遭遇してしまった場合は、docx形式に変換できるウェブサービスがいくつかありますので、それを利用しましょう。こちらも利用方法としては定形の報告書の作成などが考えられます。
また、大量のドキュメントファイルの解析、変更などにも力を発揮しますね。うまく使えばExcelからデータを抽出して、報告書作成まで一括で作ってくれるマクロも作れそうです。夢が広がりますね!
CSV:標準ライブラリ
URL:https://docs.python.org/ja/3/library/csv.html
CSVファイルはExcelのデータを扱いやすくするためにしばしば使われます。本来の用途としての、「表形式のデータ表現」としても互換性の高いデータ形式としてよく使われますね。
そんなCSVファイルですが、Pythonでは標準ライブラリだけで処理することができます。また、Excelのところでも紹介しましたが、pandasパッケージを使うことでより簡単に、複雑な処理もできるようになります。
Excelを使わなくてもExcel以上に柔軟な処理ができますので、Pythonが得意になってきたらExcelから卒業できるかもしれませんね。
マウス操作:PyAutoGUI
URL:https://pyautogui.readthedocs.io/en/latest/
最後に紹介するのは、特定のファイル操作ではなく、マウスなどを制御する方法です。GUIのツールはコマンドラインからは扱いにくいものです。
しかし、GUIの操作を記憶し、繰り返すツールがあれば直接的に問題を解決できますね。そんな手段を提供してくれるのがPyAutoGUIです。
こちらはマウスやキーボードの操作をPythonで記述でき、それを実行させることができるパッケージになります。スクリーンショットをとって、比較画像と比べて、同じものを検出する、なんていう面白い機能もあります。
このままPythonを学び続けて大丈夫?
なぜPythonを学ぶのか?
あなたがPythonを学ぶ理由は何でしょうか?
- Pythonが人気だからとりあえず学んでいる
- AIや機械学習の分野に興味があるから
Pythonは初心者向けの言語と言われています。その理由としてシンプルでわかりやすい構文や、実用的なライブラリが豊富なことが挙げられ、実際に学びやすい言語です。
しかし、もしあなたが機械学習に興味があって、とくに知識も無いまま学習を進めると、挫折する可能性が高いと言えます。
機械学習の分野はプログラミング以外にも、専門的な知識や数学の知識も必要になります。ただなんとなく学習していると早い段階でつまづきやすく、そのまま挫折してしまうなんてことも…。
そのため、挫折しないためには、
- 最適な学習環境を用意する
- 必要なライブラリ・ツールを導入する
- わからないことを質問できるメンターを見つける
などが必要になります。
効率よく学びたいなら、無料カウンセリングがおすすめ
まだまだ知りたいことがたくさんある!
もっと詳しくPythonについて知りたい!
といった悩みや願望を持っている方は、弊社「侍エンジニア」をご利用下さい。
侍エンジニアでは、
- 現役エンジニアによるマンツーマンレッスン
- キャリアアドバイザーによる転職・就職支援
- 業界屈指のフリーランス・起業サポート
を受けることができます。
業界屈指のコンサルタントから、効率的な学習方法や仕事獲得術、今後のキャリアまでさまざまな疑問を相談してみませんか?遠方の方でもオンラインで受講できます!お気軽に受講下さい。
侍エンジニア無料カウンセリングを受ける
まとめ
いかがでしたか?今回はPythonを使って様々なアプリケーションを制御する方法をお伝えしました。Pythonは上手に使えばかんたんに、より正確に様々な業務を自動化することが可能です。
もし、今までプログラミングに経験がなかった方も、これを機にPythonの学習を始めてみてはいかがでしょうか。学びにかかるコスト以上に大きなリターンが見込める投資であることを保証します。
学びが進んで、マクロを組む段階になったらまたこの記事を読み返してみてください。
なお、Pythonを学習中の人は以下の記事も読んでみてくださいね。
Pythonでできることと、勉強法などをまとめてご紹介しています。
【Python入門完全攻略ガイド】