以下の記事で、Excel VBAからPythonプログラムを呼び出す方法を紹介しました。
ExcelにPython搭載!マクロVBAからプログラムを実行する方法
上記の記事で紹介した方法を応用することで、エクセルに設置したボタンからPythonを実行することが可能です。
この記事では、xlwingsを使ってエクセル上に設置したボタンからPythonプログラムを実行する方法を紹介します。
以下で詳しく紹介していきます。
目次
Excelに設置したボタンからPythonを実行してみる
この記事では、「新しいフォルダに自動作成するPythonプログラム」をエクセルのボタンから動かせるようにします。
2. Excel上のボタンを押す
3. フォルダが自動作成
具体的には、以下のようなことをできるようにしていきます。
1. Excelに必要情報を入力
エクセルに必要な情報を入力していきます。
2. 作成するフォルダ名
ここではフォルダを自動作成するために上記の2つの情報を入力します。
この事例では作成フォルダは5つとしています。
注意点:Pythonプログラムも同じフォルダに入れておく
後半でVBAプログラムとPythonプログラムを紹介しますが、そのプログラムをそのまま使用する場合は、ExcelファイルとPythonファイルを同じフォルダに保存しておく必要があります。
そうしないとエラーが出ることがありますので、ご注意ください。
2. Excel上のボタンを押す
Excelに設置しておいたボタンを押下して、Pythonプログラムを実行します。
3. フォルダが自動作成
Pythonプログラムによって、ExcelのセルB5以下に記載したフォルダ名をもとに、フォルダを作成されます。
それでは上記の仕組みの作成方法を紹介していきます。
Excelに設置したボタンからPythonを実行する方法
手順1. xlwingsをインストール
手順2. Pythonプログラムを作成
手順3. Visual Basicの設定変更
手順4. VBAプログラムの作成
手順5. Excelにボタンを設置
手順6. VBAからPythonを実行
以下で手順ごとに解説していきます。
手順1|xlwingsモジュールをインストール
以下のライブラリをインストールします。
pip install xlwings
xlwingsの具体的なインストール方法
1. コマンドプロンプトを起動(ショートカットキー[windows] + [R])
2. 「cmd」と記入して[Enter]
3. 「pip install xlwings」と入力して[Enter]
4. インストール完了
これでインストールが完了し、xlwingsを使えるようになります。
手順2|Pythonプログラムを作成
本事例では、以下のPythonプログラムを作成しました。
プログラム紹介前に注意事項です。
Pythonファイルの名前は「CreateFolders.py」としておくこと
本記事ではVBAから以下のプログラムを実行するときに、「CreateFolders.py」を呼び出すように設定します。
そのため、Pythonプログラムが「CreateFolders.py」となっていないと、エラーが出ます。ご注意ください。
さて、プログラムを解説します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# プログラム1|ライブラリ設定 import os import xlwings as xw # プログラム2|mainプログラム def main(): # プログラム3|Sheet1の取得 wb = xw.Book.caller() sheetname = 'Sheet1' ws = wb.sheets(sheetname) # プログラム4|フォルダパスの取得 folderpath = ws.range('B1').value # プログラム5|作成したいフォルダ名を取得 cmax = ws.range('B' + str(ws.cells.last_cell.row)).end('up').row for i in range(5, cmax+1): filename = ws.range('B' + str(i)).value # プログラム6|フォルダを作成 newfolderpath = os.path.join(folderpath, filename) if os.path.exists(newfolderpath) == False: os.makedirs(newfolderpath) |
以下でプログラムについて解説します。
プログラム1|ライブラリ設定
1 2 3 |
# プログラム1|ライブラリ設定 import os import xlwings as xw |
osはフォルダ作成に使用します。
xlwingsはExcelからPythonを呼び出すときに使用します。なお、xlwingsをxwとして呼び出します。
プログラム2|ライブラリの設定
1 2 |
# プログラム2|mainプログラムの実行 def main(): |
mainプログラムを作ります。
今回の事例では、VBAでmainプログラムを呼び出します。
プログラム3|Sheet1の取得
1 2 3 4 |
# プログラム3|Sheet1の取得 wb = xw.Book.caller() sheetname = 'Sheet1' ws = wb.sheets(sheetname) |
2 |
wb = xw.Book.caller() |
pythonとExcelをつなぎこみます。
これでVBAを実行したときにアクティブなExcelをwbとして扱うことができます。
3 |
sheetname = 'Sheet1' |
変数sheetnameに「Sheet1」を入れ込みます。
ここはシート名に合わせる必要があり、本事例では「Sheet1」というシート名のため、ここで設定しておきます。
4 |
ws = wb.sheets(sheetname) |
「Sheet1」を「ws」として扱います。
プログラム4|Sheet1に数値を出力
1 2 |
# プログラム4|フォルダパスの取得 folderpath = ws.range('B1').value |
セルB1の値を「folderpath」として取得します。
1 2 |
folderpath = ws.range('B1').value print(folderpath) |
実行結果
1 |
>>>D:\DropBox\Dropbox\Python\Program\100_Excel\199_Python_from_VBA\199_2_Run_Python_with_ExcelButton |
folderpathで指定したフォルダに、新規フォルダを作成していきます。
プログラム5|エクセルファイルを「Sample1.xlsm」として保存
1 2 3 4 |
# プログラム5|作成したいフォルダ名を取得 cmax = ws.range('B' + str(ws.cells.last_cell.row)).end('up').row for i in range(5, cmax+1): filename = ws.range('B' + str(i)).value |
2 |
cmax = ws.range('B' + str(ws.cells.last_cell.row)).end('up').row |
cmaxで最終行を取得します。
「ws.cells.last_cell.row」は1048576となります。なぜなら「.xlsm」のエクセルの場合、最終行は1048576行目だからです。
そして、「end(‘up’).row」で1048576行目から順々に上のセルを見ていき、最初に文字列が入っている行を取得します。本事例では9行目です。なぜなら、セルB9に「5_Text」が入力されているからです。
ちなみにVBAが分かる人への説明としては「cmax = ws.Range(“B1048576”).end(xlup).row」です。
3 |
for i in range(5, cmax+1): |
「i = 5, 6, 7,・・・.cmax」で繰り返し処理を行います。(cmax+1は繰り返し処理されません)
ここではcmax=9なので、「i=5,6,7,8,9」となります。
i=5から開始しているのは、セルB5から新規フォルダの名前が入力されているからです。
4 |
filename = ws.range('B' + str(i)).value |
セルBi(i=5,6,7,8,9)の値をfilenameとして取り扱います。
プログラム6|フォルダを作成
1 2 3 4 |
# プログラム6|フォルダを作成 newfolderpath = os.path.join(folderpath, filename) if os.path.exists(newfolderpath) == False: os.makedirs(newfolderpath) |
2 |
newfolderpath = os.path.join(folderpath, filename) |
folderpath(プログラム4)とfilename(プログラム5)をパスとして結合し、newfolderpathとします。
1 2 3 4 5 6 |
folderpath = ws.range('B1').value cmax = ws.range('B' + str(ws.cells.last_cell.row)).end('up').row for i in range(5, cmax+1): filename = ws.range('B' + str(i)).value newfolderpath = os.path.join(folderpath, filename) print(newfolderpath) |
実行結果
1 2 3 4 5 |
>>>D:\DropBox\Dropbox\Python\Program\100_Excel\199_Python_from_VBA\199_2_Run_Python_with_ExcelButton\1_Excel >>>D:\DropBox\Dropbox\Python\Program\100_Excel\199_Python_from_VBA\199_2_Run_Python_with_ExcelButton\2_Word >>>D:\DropBox\Dropbox\Python\Program\100_Excel\199_Python_from_VBA\199_2_Run_Python_with_ExcelButton\3_Outlook >>>D:\DropBox\Dropbox\Python\Program\100_Excel\199_Python_from_VBA\199_2_Run_Python_with_ExcelButton\4_PowerPoint >>>D:\DropBox\Dropbox\Python\Program\100_Excel\199_Python_from_VBA\199_2_Run_Python_with_ExcelButton\5_Text |
このnewfolderpathでフォルダを作成していきます。
3 |
if os.path.exists(newfolderpath) == False: |
既にnewfolderpathと同じ名前のフォルダが存在すると、エラーの原因になります。
そこでifを使い、newfolderpathと同じ名前のフォルダが存在するかどうかを検証します。
もし存在しなければ、次のプログラムを実行します。
4 |
os.makedirs(newfolderpath) |
newfolderpathで指定したパスでフォルダを作成します。
プログラムの解説は以上です。
手順3. Visual Basicの設定変更
2. [Alt] + [F11]でVisual Basicを起動
3. xlwingsのModuleを作成
以下で手順を解説していきます。(別記事の画像を転用していますので、画像のエクセルに何も記入されていませんが、ご了承ください。内容理解には困らないはずですので、問題ないと判断しました。)
1. エクセルを起動
エクセルを起動します。
注意|PythonプログラムとExcelファイルが同じフォルダに保存しておく
今回紹介するプログラムは、PythonプログラムとExcelファイルが同じフォルダに存在しないとエラーが出ますので、注意ください。
2. [Alt] + [F11]でVisual Basicを起動
[Alt]を押しながら[F11]を押すことで、ショートカットキー操作でVisual Basicを開くことができます。
3. xlwingsのModuleを作成
3-2. 「ファイル」タブの「ファイルをインポート」をクリック
3-3. 「xlwings.bas」をクリック(xlwingsのライブラリフォルダに保存)
3-4. 「開く」をクリック
3-5. 「xlwings」モジュールが作成されていることを確認
「xlwings」モジュールが作成されていることを確認できたら、次へ進みます。
手順4. VBAプログラムの作成
4-2. 「挿入」タブの「標準モジュール」をクリック
4-3. 「Module1」が作成される
4-4. VBAプログラムの作成
以下で手順を解説していきます。(別記事の画像を転用していますので、画像のエクセルに何も記入されていませんが、ご了承ください。内容理解には困らないはずですので、問題ないと判断しました。)
ここで記入したプログラムは以下です。
1 2 3 |
Sub CallPython() RunPython ("import CreateFolders;CreateFolders.main()") End Sub |
手順2で紹介したPythonプログラムを呼び出します。
ここでは「CreateFolders.py」を呼び出すように設定します。
したがって、Pythonファイル名が「CreateFolders.py」になっていないと動作しない可能性があります。ご注意ください。
手順5. Excelにボタンを設置
5-2. 「開発」タブの中の「挿入」をクリック
5-3. 「ボタン(フォームコントロール)」をクリック
5-4. ボタンを設置したい箇所でドラッグ
5-5. 手順4で作成した「CallPython」のプログラムを設定
5-6. 「OK」をクリック
5-7. 作成されたボタンを右クリック
5-8. 「テキスト編集」をクリック
5-9.
これでExcelにボタンを設置できました。
5-5でVBA(Python実行用)プログラムを設定したので、このボタンを押すと、Pythonを実行できます。
手順6で検証します。
手順6. VBAからPythonを実行
ボタンを押すと、Pythonプログラムが実行されてフォルダを自動作成してくれます。
手順解説はここまでです。
Excel VBAで出来ることを理解しておくとPythonの幅が広がる
ここまでExcelマクロVBAからPythonを実行する方法を紹介してきました。
VBAからPythonを実行することで、エクセル作業をさらにラクにすることができます。
このとき、VBAでどのようなことが出来るか理解しておくと、さらにVBAの強みを活かすことができます。
以下でVBAで出来ることをまとめていますので、興味がある人はご覧ください。
PythonとVBAの両方を上手く組み合わせることで、さらに仕事を効率化できるので、ぜひチャレンジしてみてください。
Pythonについて詳しく理解したいなら
Pythonを活用すると、仕事を効率化できる幅を広げることができます。
たとえば私が実際にPythonを活用して効率化してきた作業は以下の記事で紹介しています。
興味がある人は以下の記事もご覧ください。
Python×効率化のサンプル
Pythonで効率化できる事例をサンプルコード付きで紹介しています。
Python×Excel
PythonとExcelで自動化できることを紹介しています。
事例も数多く紹介しているので、ぜひ参考にしてみてください。
Python×PDF
PythonとPDFで自動化できることを紹介しています。
Pythonって難しい?
Pythonの難易度などについては、以下で紹介しています。
勉強の参考になれば幸いです。