Pythonを使うと、Excelを操作してマクロを実行することができます。
PythonからExcelを操作するライブラリの内、OpenpyxlはVBAを実行することはできませんが、win32comやxlwingsはVBAを実行可能です。
この記事では、PythonからExcelを操作する方法について紹介していきます。
・PythonでエクセルVBAを動かす方法
・どのライブラリを選択するのがいいか?
以下で詳しく紹介していきます。
目次
PythonからExcelマクロVBAを実行するメリット
1. VBAをPythonに書き換える必要がない
2. VBAの強みを活かせる
メリット1. VBAをPythonに書き換える必要がない
PythonからVBAを実行できるメリットの一つに、「VBAをPythonに書き換える必要がない」ことがあります。
たとえば職場でVBAで処理をしている業務を他のプログラム言語で動かそうとした場合、その言語で書き換える必要があります。
しかしVBAで記載されたプログラムをPythonで実行する場合、その書き換えが不要です。
そのためVBAの作業をPythonで実行するときは、新たな作業はほとんどありません。
メリット2. Python×VBAが可能になる
PythonからVBAを実行できるようになるメリットに、「Python×VBAが可能になる」ことがあります。
具体的なメリットは、PythonとVBAをスイッチして処理ができることです。
たとえばPythonでウェブスクレイピングで得たデータをエクセルに書き出し、そのデータをVBAで計算することが可能になるのです。
要は作業工程を分けて、PythonとVBAで交互に動かすわけです。
実際、ウェブスクレイピングや機械学習のような処理はPythonのほうがVBAより処理がカンタンです。
その理由はPythonのほうがライブラリが充実しているからです。
そのためPythonを使うほうがいいときはPythonを、VBAを使う方がいいときはVBAをそれぞれ活用することができるのです。
現実的な使い方
ただ残念ながら、PythonとVBAをスイッチさせる機会はそこまで多くありません。
なぜならVBAで作れるプログラムのほとんどはPythonで作れるからです。
たとえば「Excelを扱うならVBAが便利!」と思う人もいるかもしれませんが、そうでもありません。
PythonのOpenpyxlやXlwingsを使えば、PythonでExcelの処理に困ることはほとんどありません。
またPandasを使えば、Excelのデータ処理も高度に実行できます。
そのため現実的にはPythonとVBAをスイッチして使うことはないというのが個人的な感想です。
ただそれでもスイッチして使う場面があるとすれば、スポットとして使うことはあり得ます。
たとえば「PythonでExcelを印刷するプログラムが分からない」ときは、VBAです。
「VBA Excel 印刷」とウェブ検索すると、比較的カンタンにサンプルコードを見つけることができます。
もしくは既に印刷用のマクロVBAプログラムを持っていれば、それを転用することもできるはずです。
このように、印刷ようなスポット的にVBAを利用することで、VBAの強みを活かすことができます。
ただし、PythonとVBAをスイッチさせるのはスポット的であり、実際はそこまでスイッチさせるメリットはないという印象です。
PythonからVBAを実行するなら、openpyxl, win32com, xlwingsどれ?
・openpyxl|VBA実行はできない
・win32com|VBA実行可能
・xlwings|VBA実行可能
PythonからVBAを実行できるライブラリとそうではないライブラリがあります。
PythonでExcelを操作するときによく使うライブラリについて、カンタンに解説をしておきます。
openpyxl
openpyxlはPythonでExcelを操作するときに、よく使われるライブラリです。
しかし少なくとも私が調べた限りでは、Python経由でエクセルマクロを実行することは難しいです。
そのため、openpyxlではVBAを実行できないと考えるのがよいです。
win32com
win32comはPythonでExcelだけでなくOutlookも操作できるライブラリです。
Microsoft Officeのアプリケーション全般を操作できると考えてもらえればよいです。
このライブラリを使うと、PythonからExcel VBAを実行することが可能です。
詳しいプログラムの記載方法は後述しています。
xlwings
xlwingsライブラリは、PythonでExcelを操作するときに使えるライブラリです。
このライブラリを使うと、PythonからExcel VBAを実行することが可能です。
詳しいプログラムの記載方法は後述しています。
(私がもしPythonからExcel VBAを実行するならxlwingsを使います。詳しい理由は後述します)
win32com|PythonからExcelマクロVBAを実行
手順1. VBAプログラム名を書き出す
手順2. win32comライブラリをインストール
手順3. Pythonプログラムを作成
手順4. Pythonを実行してマクロを実行
手順1. VBAプログラム名を書き出す
1. Excel(VBA入り)を開く
2. [Alt] + [F11]でVBEを開く
3. VBAプログラム名を覚える
上記の手順でVBAプログラム名を書き出しておきます。
PythonプログラムのなかでVBAプログラム名を記載するので、覚えておきます。
keisan()
補足|VBAプログラムを事前に作っておく
当然ですが、ExcelVBAのプログラムを事前に作っておかないといけません。
今回は、以下の記事で解説している「月末処理用のVBAプログラム」を活用します。
上記の記事内で、VBAプログラムを解説していますので、興味がある人はご覧ください。(エクセルのダウンロードも可能です)
手順2. win32comライブラリ(pywin32)をインストールする
1. コマンドプロンプトを起動(ショートカットキー[windows] + [R])
2. 「cmd」と記入して[Enter]
3. 「pip install pywin32」と入力して[Enter]
4. インストール完了
これでインストールが完了し、win32com.clientを使えるようになります。
それでは以下でプログラムを解説していきます。
手順3. Pythonプログラムを作成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
# プログラム1|win32comライブラリの設定 import win32com.client import os # プログラム2|Excelアプリケーションを起動 Excel = win32com.client.Dispatch('Excel.Application') Excel.Visible = True Excel.DisplayAlerts = False # プログラム3|エクセルを開く filename = 'Sample.xlsm' fullpath = os.path.join(os.getcwd(),filename) wb = Excel.Workbooks.Open(Filename=fullpath) # プログラム4|マクロ実行 Excel.Application.Run(filename + '!keisan()') # プログラム5|エクセルを保存して閉じる newfilename = 'Macro_' + filename newfullpath = os.path.join(os.getcwd(),newfilename) wb.SaveAs(newfullpath) wb.Close() # プログラム6|Excelアプリケーションを閉じる Excel.DisplayAlerts = True Excel.Application.Quit() |
以下でカンタンに解説します。
プログラム1|win32comライブラリの設定
1 2 3 |
# プログラム1|win32comライブラリの設定 import win32com.client import os |
以下で解説します。
「win32com.client」を呼び出すことでExcelを起動したりマクロを実行したりできるようにします。
「os」を呼び出すことでフォルダパスの取得できるようにします。
プログラム2|Excelアプリケーションを起動
1 2 3 4 |
# プログラム2|Excelアプリケーションを起動 Excel = win32com.client.Dispatch('Excel.Application') Excel.Visible = True Excel.DisplayAlerts = False |
Excelアプリケーションを起動して、起動したExcelアプリケーションを変数Excelとする
ExcelアプリケーションをTrue設定して、Excelをモニター上に表示します。
Excelアプリケーションをモニター上に表示したくない場合は、「Excel.Visible = False」とします。
Excelの警告画面をFalse設定して、警告メッセージを出さないようにします。
しかし、Excelの警告画面をスキップできない場合があります。
たとえば同じファイル名のExcelを保存しようとするときは、警告画面が表示されてマクロが停止してしまいます。
もしこのような警告画面を表示したくない場合は、同じファイル名のExcelを保存するときは、別の処理を行うといった対策を講じる必要があります。
プログラム3|エクセルを開く
1 2 3 4 |
# プログラム3|エクセルを開く filename = 'Sample.xlsm' fullpath = os.path.join(os.getcwd(),filename) wb = Excel.Workbooks.Open(Filename=fullpath) |
Pythonと同じフォルダ内の「Sample.xlsm」をfilenameという変数に入れる
「Sample.xlsm」のフルパス(絶対パス)を取得します。
ここではPythonが保管されているフォルダを「os.getcwd()」で取得し、filenameと結合して、フルパス取得しています。
win32comでExcelファイルを呼び出す場合、フルパスでないとエラーが出ることがあります。
fullpathで指定したエクセルファイル(ここでは「Sample.xlsm」)を開いて、変数wbとします。
プログラム4|マクロ実行
1 2 |
# プログラム4|マクロ実行 Excel.Application.Run(filename + '!keisan()') |
マクロを実行します。
マクロを実行するときの引数は「’filename + !keisan()’」としています。
要は「ファイル名!マクロ名()」です
ファイル名とマクロ名を間違えると、当然ですがマクロを実行できないため、エラーが発生します。
プログラム5|エクセルを保存して閉じる
1 2 3 4 5 |
# プログラム5|エクセルを保存して閉じる newfilename = 'Macro_' + filename newfullpath = os.path.join(os.getcwd(),newfilename) wb.SaveAs(newfullpath) wb.Close() |
マクロ実行後のエクセルのファイル名を設定します。
ここでは「Macro_」+ filenameとして、変数newfilenameに格納します。
win32comを使用する場合、相対パスではなく絶対パスを求められます。
したがって、os.getcwd()と一つ上のプログラムで作成したnewfilenameをos.path.joinで結合して、newfullpath(絶対パス)を作成します。
newfullpathでエクセルファイルを保存します。
エクセルファイルを閉じます。
プログラム6|Excelアプリケーションを閉じる
1 2 3 |
# プログラム6|Excelアプリケーションを閉じる Excel.DisplayAlerts = True Excel.Application.Quit() |
プログラム2で実行した「Excel.DisplayAlerts=False」をもとの設定に戻しておきます。
Excelアプリケーションを閉じます。
手順4. Pythonを実行してマクロを実行
手順3のPythonプログラムを実行すると、ExcelマクロVBAのプログラムが実行されます。
xlwings|PythonからExcelマクロVBAを実行
手順1. VBAプログラム名を書き出す
手順2. xlwingsをインストール
手順3. Pythonプログラムを作成
手順4. Pythonを実行してマクロを実行
以下で手順ごとに解説していきます。
手順1. VBAプログラム名を書き出す
1. Excel(VBA入り)を開く
2. [Alt] + [F11]でVBEを開く
3. VBAプログラム名を覚える
上記の手順でVBAプログラム名を書き出しておきます。
PythonプログラムのなかでVBAプログラム名を記載するので、覚えておきます。
keisan()
補足|VBAプログラムを事前に作っておく
当然ですが、ExcelVBAのプログラムを事前に作っておかないといけません。
今回は、以下の記事で解説している「月末処理用のVBAプログラム」を活用します。
上記の記事内で、VBAプログラムを解説していますので、興味がある人はご覧ください。(エクセルのダウンロードも可能です)
手順2|xlwingsモジュールをインストールする
以下のライブラリをインストールします。
pip install xlwings
xlwingsの具体的なインストール方法
1. コマンドプロンプトを起動(ショートカットキー[windows] + [R])
2. 「cmd」と記入して[Enter]
3. 「pip install xlwings」と入力して[Enter]
4. インストール完了
これでインストールが完了し、xlwingsを使えるようになります。
手順3|Pythonプログラムを作成する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#プログラム1|ライブラリの設定 import xlwings as xw #プログラム2|対象エクセルのファイルパスを指定 filename = 'Sample.xlsm' #プログラム3|マクロVBAを呼び出して実行 App = xw.App() wb = App.books.open(filename) macro=wb.macro('keisan') macro() #プログラム4|エクセルファイルを保存 newfilename = 'Macro_' + filename wb.save(newfilename) #プログラム5|エクセルファイルを閉じる wb.close() App.quit() |
以下で詳しく説明します。
プログラム1|ライブラリの設定
1 2 |
#プログラム1|ライブラリの設定 import xlwings as xw |
xlwingsをxwとして呼び出します。PythonでExcel操作するときに使えるライブラリです。
プログラム2|対象エクセルのファイルパスを指定
1 2 |
#プログラム2|対象エクセルのファイルパスを指定 filename = 'Sample.xlsm' |
変数filepathに「Sample.xlsm」を設定します。
Pythonファイルと同じフォルダに「Sample.xlsm」を保管しておきます。
このエクセルファイルに含まれるVBAを呼び出します。手順2のとおり、VBAプログラムを事前に作成しておきます。
プログラム3|マクロVBAを呼び出して実行
1 2 3 4 5 |
プログラム3|マクロVBAを呼び出して実行 App = xw.App() wb = App.books.open(filepath) macro=wb.macro('keisan') macro() |
Excelアプリケーションを起動します。起動したExcelアプリケーションを変数Appとします。
プログラム2で指定したfilepathのエクセルファイルを開きます。
開いたエクセルファイルを変数wbとします。
開いたエクセルファイル「wb」のマクロである「’keisan’」を変数macroとします。
「macro()」でマクロを実行します。
プログラム4|マクロVBAを呼び出して実行
1 2 3 |
#プログラム4|エクセルファイルを保存 newfilepath = 'Macro_' + filename wb.save(newfilename) |
マクロ実行後のエクセルのファイル名を設定します。
ここでは「Macro_」+ filenameとして、変数newfilenameに格納します。
newfilenameでエクセルファイルを保存します。
プログラム5|エクセルファイルを保存
1 2 3 |
#プログラム5|エクセルファイルを閉じる wb.close() App.quit() |
エクセルファイルを閉じます。
Excelアプリケーションを閉じます。
手順4. Pythonを実行してマクロを実行
Pythonプログラムを実行すると、以下のようになる。
手順解説はここまでです。
xlwingsとwin32comのどちらでExcelVBAを実行するといい?
「xlwingsとwin32comのどちらでExcelVBAを実行するといい?」と悩んでいる人がいるかもしれません。
結論はどちらでもよいです。
上記で紹介したプログラムを読んでみて、使いやすい方を選択すればいいと思います。
結局はマクロを実行して、作業を早くすることが目的なので、使いやすいライブラリを選択するに越したことはないからです。
個人的にはxlwingsをオススメしたい
xlwingsとwin32comのどちらでもいいけど、「もし選択するとしたらどちらがイイの?」と考える人もいるかもしれません。
そのように考えているなら、xlwingsを使ってみることをオススメします。
理由は「xlwingsをインストールしておくと、PythonからVBA実行、VBAからPython実行の両方が可能」だからです。
要はxlwingsをインストールしておくと、PythonとVBAを相互に使用することができるため、Xlwingsの設定さえしておけば後がラクというわけです。
ただし、そこまで大きなメリットがあるわけではありません。
そもそもPythonとVBAをスイッチして使う場面は、現実的にそこまでないからです。
仕事の状況によっては使える場面があるかもしれない程度だと個人的には考えています。
Excel VBAで出来ることを理解しておくとPythonの幅が広がる
ここまでPythonでExcelマクロVBAを実行する方法を紹介してきました。
PythonとVBAをスイッチしながら使うことで、両者の強みを活かすことができます。
このとき、VBAでどのようなことが出来るか理解しておくと、さらにVBAの強みを活かすことができます。
以下でVBAで出来ることをまとめていますので、興味がある人はご覧ください。
またPythonで出来ることもまとめています。
Pythonで出来ることを詳しく知りたい人はご覧ください。
PythonとVBAの両方を上手く組み合わせることで、さらに仕事を効率化できるので、ぜひチャレンジしてみてください。