Pythonのopenpyxlでマクロ付きのExcelファイル (.xlsm) を扱おうとしたとき、keep_vba=Trueは絶対に知っておくべき、いわば「魔法の呪文」です。
これを知っているか知らないかで、「ファイルを保存したら、苦労して作ったマクロが跡形もなく消えてしまった…」という悲しい事故が起こるかどうかが決まります。
この記事では、openpyxlでVBAマクロを安全に扱うための最重要オプションkeep_vba=Trueを、ただ使うだけでなく「使いこなす」ための知識と具体的なコード、そして注意点を徹底的に解説します。
この記事を読めば、あなたは…
keep_vba=Trueの本当の意味と役割を理解できる- マクロを絶対に消さないための、確実なコードの書き方がわかる
- よくある失敗パターンとその対策を学び、ミスを未然に防げるようになる
openpyxlとVBAマCRoを連携させる自動化の世界へ、自信を持って踏み出しましょう!
keep_vba=Trueとは?マクロを守るお守りです
keep_vba=Trueは、openpyxl.load_workbook()関数で使うオプションで、「もしこのファイルにVBAマクロがあったら、それを消さずに保持しておいてね」とopenpyxlに伝えるためのお守りのようなものです。
openpyxlは、デフォルトではセルの値や書式設定といったデータ部分にしか興味がありません。そのため、このオプションを指定しないと、VBAマクロの部分は無視され、保存時にファイルから抜け落ちてしまうのです。
keep_vba=Trueを付けることで、openpyxlはVBAプロジェクトを一つの「壊してはいけない荷物」として認識し、ファイル操作が終わった後、新しいファイルにそっくりそのまま戻してくれます。
マクロを安全に扱うための「2つの鉄則」
keep_vba=Trueを使いこなすには、以下の2つのルールを必ず守る必要があります。これさえ守れば、マクロが消えることはありません。
- 読み込み時:
load_workbook()でkeep_vba=Trueを指定する。 - 保存時: ファイルの拡張子を必ず
.xlsmにする。
実践コード:2つの鉄則を守ったサンプル
ここに、マクロ付きのsource.xlsmファイルを読み込み、C5セルに値を書き込んでdestination.xlsmとして保存する、完璧なサンプルコードを示します。
import openpyxl
# --- 準備 ---
# 'source.xlsm' というマクロ付きファイルが既にあること
source_file = 'source.xlsm'
destination_file = 'destination.xlsm'
try:
# 鉄則1: keep_vba=True をつけてファイルを読み込む
wb = openpyxl.load_workbook(source_file, keep_vba=True)
print(f"'{source_file}' をマクロを保持して読み込みました。")
ws = wb.active
# Pythonでセルを操作する
ws['C5'] = 'Pythonによって更新されました'
print("C5セルの値を更新しました。")
# 鉄則2: 必ず拡張子を .xlsm にして保存する
wb.save(destination_file)
print(f"マクロを維持したまま '{destination_file}' に保存しました。")
except FileNotFoundError:
print(f"エラー: 元ファイル '{source_file}' が見つかりません。")
except Exception as e:
print(f"エラーが発生しました: {e}")このコードを実行すれば、destination.xlsmには更新されたC5セルの値と、元のマクロの両方が完璧な状態で保存されています。
keep_vba=Trueを使いこなすための注意点
「使いこなす」ためには、このオプションでできないことと、よくある失敗を知っておくことが重要です。
失敗パターン1:「keep_vba=True」のつけ忘れ
これは最も基本的なミスですが、うっかり忘れてしまうこともあります。.xlsmファイルを扱う際は、常にload_workbookにこのオプションが付いているか確認する癖をつけましょう。
失敗パターン2:保存時に.xlsxにしてしまう
keep_vba=Trueで読み込んでも、保存時にwb.save('output.xlsx')としてしまうと、Excelのルール上マクロは保存されず、結局消えてしまいます。読み込みと保存、両方のステップで注意が必要です。
できないこと:VBAコードの編集や実行
openpyxlはVBAプロジェクトを「内容がわからない荷物」として扱います。そのため、keep_vba=Trueを使っても、以下のことはできません。
- VBAコードの読み取り: Pythonでマクロのコードを文字列として取得することはできません。
- VBAコードの編集: Pythonでマクロを書き換えることはできません。
- VBAコードの実行: Pythonからマクロをトリガーして実行することはできません。
これらの操作が必要な場合は、pywin32など、Excelアプリケーション自体を操作する別のライブラリを検討する必要があります。
まとめ
今回は、openpyxlでマクロ付きExcelファイルを安全に扱うための最重要オプションkeep_vba=Trueを使いこなす方法を解説しました。
keep_vba=Trueは、.xlsmファイルを読み込む際の必須オプション。- マクロを確実に維持するには、「
keep_vba=Trueで読み込み」と「.xlsmで保存」の2つの鉄則を必ず守る。 openpyxlはマクロの維持はできるが、編集や実行はできない。
このkeep_vba=Trueは、openpyxlとVBAの強みを両方活かした強力な業務自動化を実現するための、まさに架け橋となる機能です。ぜひ今日からマスターして、あなたのPythonスクリプトをさらにパワーアップさせてください。


コメント