keep_vba=Trueを使いこなす!openpyxlでVBAマクロ(.xlsm)を安全に扱う方法

openpyxl

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つのルールを必ず守る必要があります。これさえ守れば、マクロが消えることはありません。

  1. 読み込み時: load_workbook()keep_vba=Trueを指定する。
  2. 保存時: ファイルの拡張子を必ず.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スクリプトをさらにパワーアップさせてください。

コメント

タイトルとURLをコピーしました