Excelは日々の業務で最もよく使われているITツールと言っても過言ではないでしょう。
しかし、作業を効率化するためExcel VBAでマクロを組もうとして、Excel VBAの独特の記法に面食らった経験はありませんか?
使い慣れたPythonでマクロが組めたらいいですよね。
実は、PythonからExcelを操作するライブラリが数多く出ています。
この記事では、その中でもopenpyxlというライブラリを紹介します。
これで、ストレスなくマクロが組めますよ。
PythonからExcelを操作する利点
言うまでもなく、第一に、普段使い慣れた言語でスクリプトが組める点です。Excelにさせたい高度な処理をPythonを使って書けます。これはコーディング時間の短縮をもたらします。
よくあるのが、Pythonプログラムの設定ファイルにExcelファイルを使ったり、Pythonプログラムの処理結果をExcelに格納したりすることです。使い慣れたExcelで設定ファイルが書ければ、ユーザーの利便性が上がります。直感的にも分かりやすいです。Pythonで見た目を整えるのは少しばかり技術が必要ですが、Excelに結果を格納すれば、結果を見た目よくユーザーに表示することができます。これらはPythonからExcelを操作する利点の一つです。
あとは処理時間の短縮でしょうか。一般的に、PythonはExcel VBAよりも高速で動作するようです。計算がややこしい部分をPythonで書き、マクロの処理速度を上げるのです。
openpyxl
openpyxlは、PythonからExcelを扱うライブラリの一つです。.xlsx形式のファイルが扱えます。
インストールは
pip install openpyxl
です。
Pythonプログラムの先頭で
import openpyxl
しましょう。
ブックを開く
wb = openpyxl.load_workbook('Excelファイル名')
でExcelファイルを開きます。後々使うので、必ず何かの変数に代入することを忘れずに。
ブックを閉じる
これは特にしなくても大丈夫です。Pythonプログラムが終了するとExcelは閉じます。
保存したい場合は、
wb.save('保存したいExcelファイル名')
で保存します。
シート指定
sheet = wb['シート名']
でシートを指定します。このシートも後々使うので、必ず何かの変数に代入しておいてください。
セルの値の取得
Excelの形式でセルの値を取得するときは、例えば
sheet['D2'].value
です。
行番号、列番号を用いてセルの値を取得することもできます。
D2セルなら
sheet.cell(row=2, column=4).value
です。Excel VBAと同じで、行番号、列番号はいずれも1から始まることに注意してください。
セルへの値の書き込み
これは取得と同じで、たとえばD2セルに0を書き込みたかったら
sheet['D2'].value = 0
sheet.cell(row=2, column=4).value = 0
です。
計算をしたいとき
例えば次のようなExcelファイルがあったとします。
ここで、D列に合計額を計算して書き、更に合計の合計を書くには、以下のようなPythonプログラムを書けばいいでしょう。
import openpyxl wb = openpyxl.load_workbook('Excelサンプル.xlsx') sheet = wb['サンプル'] sum = 0 for row in range(2,6): s = sheet.cell(row=row, column=2).value * sheet.cell(row=row, column=3).value sheet.cell(row=row, column=4).value = s sum += s sheet['D6'].value = sum wb.save('Excelサンプル.xlsx')
結果は次のようになります。
Excel関数を使いたいとき
たいていの場合Excelで計算するよりPythonで計算したほうが都合がいいですが、場合によってはExcel関数を使いたい、という場合もあるかもしれません。
数式をセルに書き込むには
sheet['D2'].value ='書き込みたい数式'
sheet.cell(row=2, column=4).value = '書き込みたい数式'
です。
これを用いて、先ほどのPythonプログラムを書き換えてみます。
import openpyxl wb = openpyxl.load_workbook('Excelサンプル.xlsx') sheet = wb['サンプル'] for row in range(2,6): sheet.cell(row=row, column=4).value = '=B' + str(row) + '*' + 'C' + str(row) sheet['D6'].value = '=SUM(D2:D5)' wb.save('Excelサンプル.xlsx')
無事に、先ほどと同じ結果が得られました。
セルを見てみると、数式が入っているのが分かります。
まとめ
今回は単純に合計を求めただけですが、少し工夫すれば、様々な計算ができます。
設定ファイルとしてExcelをユーザーに使用してもらう利点は大きいです。設定ファイルは得てして説明が煩雑になりがちですが、Excelであれば見ただけで分かり、また、Excelを操作できないパソコン使用者はほぼいないからです。テキストファイルで設定するのは困難でもExcelファイルならば、というユーザーは少なくありません。文字コードに煩わされずに済む利点も見逃せません。ユーザーフレンドリーなシステムを提供するのはシステム開発者の責務です。
このように、PythonからExcelを扱うのには大きな利点があります。Pythonを使って、ユーザーの業務を利便化してください。
最後に、本を紹介しておきます。
北野勝久、高橋宣成「PythonでかなえるExcel作業効率化」
今Python×Excelの本は数多く出ています。どれかを手に取ってみてください。
あなたのユーザーが、より便利になりますように。