マクロの守り中小企業のAI導入支援|Excelマクロ(VBA)の属人化の解消からExcelマクロ(VBA)の引き継ぎ 専門

コラム移し方の比較

VBAをPythonに書き換えると何が変わる?同じ集計を両方で動かして行数と実行時間を比べた

引き継いだVBAをPythonに書き換えると、集計のコードは短くなりますが、ボタンで現場が押す運用は変わります。受注1万行×30列(架空)の同じ集計で、コードはVBAの33行に対し、openpyxlは13行、pandasは6行でした。開いたブックで押すVBAは0.14秒、新しく起動するPythonは21〜50秒かかりました。置き場所と起動のしかたを決める必要があります。(2026年10月時点)

読み解きから直す・置き換えるまでの流れと費用はExcelマクロの引き継ぎのページにまとめています。

要点

  • 同じ集計のコードは、VBAが33行、openpyxlが13行、pandasが6行でした。
  • 実行時間の中央値は、開いたブックのVBAが0.141秒、Pythonは20.948秒(openpyxl)と50.197秒(pandas)でした。
  • Pythonに移すとExcelは要らなくなりますが、ボタン・UserForm・開いたときの自動実行は、そのままは移りません。
  • Excelで開いたままのブックにopenpyxlで保存すると、PermissionErrorで止まりました。
  • 置き換える前に、Pythonを入れる場所と、誰がどこから起動するかを決めます。
目次
  1. VBAをPythonに書き換えると、何が変わりますか?
  2. 行数と実行時間は、どれだけ違いましたか?
  3. Pythonに移すと、Excelは要らなくなりますか?
  4. ボタンやUserFormは、Pythonでどうなりますか?
  5. 現場の運用を変えずに、Pythonに置き換えるには?
  6. このサイトで相談するには?
  7. よくある質問

VBAをPythonに書き換えると、何が変わりますか?

コードは短くなり、Excelは要らなくなります。変わらないのは集計の結果で、変わるのは「ブックを開いてボタンを押す」という使い方です。受注1万行×30列(架空)の同じ集計を、VBAとPythonで動かして比べました。

得意先50件ごとの件数・数量・金額を出す処理で、VBA、openpyxl、pandasの結果は一致しました。金額の合計はどれも167,465,500円です。次の表が、5つの点での違いです。

比べる点 VBA Python(openpyxl) Python(pandas)
コードの行数 33行 13行 6行
実行時間の中央値 0.141秒(開いたブック)、4.959秒(Excelの起動から保存) 20.948秒 50.197秒
Excel 要る 要らない 要らない
保守に入れるもの Excelだけ Pythonとopenpyxl(約2MB) Pythonとpandas、依存の7つ(約126MB)
ボタンで押す そのまま 作り直し 作り直し

この比較は、既にあるマクロを置き換える場合の話です。ブラウザのExcelで動かしたいときは、VBAがブラウザで動かないときの移し先に分けて書きました。

行数と実行時間は、どれだけ違いましたか?

行数はPythonが少なく、実行時間はVBAが短い結果でした。VBAは、辞書で得意先を数えて配列に書き出す33行です。openpyxlは13行、pandasはgroupbyの1行を含む6行でした。

コードの行数の横棒グラフ。VBA 33行、Python openpyxl 13行、pandas 6行同じ集計を書いたコードの行数空行とコメントを除く(各ファイル、架空データの集計)VBA33行Python openpyxl13行Python pandas6行VBA は vba_python.bas、Python は py_openpyxl.py・py_pandas.py(scripts/figs/)
図1 同じ集計のコードの行数。空行とコメントを除いた数です。

実行時間は、各10回の中央値と最小〜最大で測りました。VBAは、開いたブックでマクロだけ動かすと0.141秒(0.121〜0.172)です。Excelを起動して開き、動かして保存し、終了するまでだと4.959秒(3.151〜7.718)でした。Pythonは、毎回pythonを新しく起動し、保存までで20.948秒(14.807〜34.222)がopenpyxl、50.197秒(33.225〜66.704)がpandasです。

同じ集計の実行時間の横棒グラフ。VBAの開いたブックは中央値0.141秒、Excelの起動から保存までは4.959秒、Python openpyxlは20.948秒、pandasは50.197秒同じ集計の実行時間(各10回、中央値と最小〜最大)受注1万行×30列(架空)から得意先50件の件数・数量・金額を集計して書き出すVBA(開いたブックで実行)0.141秒(0.121〜0.172)VBA(Excelを起動して実行・保存)4.959秒(3.151〜7.718)Python openpyxl20.948秒(14.807〜34.222)Python pandas50.197秒(33.225〜66.704)Python は毎回 python を起動して import から保存まで。Excel 16.0 build 20430.0、Python 3.14.2、pandas 2.3.3、openpyxl 3.1.5VBA の1行目は Excel を立ち上げ済みの値。計測の台数は1台(このPC)で、ほかの PC では変わる
図2 同じ集計の実行時間。棒が中央値、線が最小〜最大です。

Pythonの時間には、import(読み込み)の分が大きく含まれます。pythonを起動して何もしないと0.265秒、openpyxlのimportだけで7.021秒、pandasのimportだけで24.185秒(どれも中央値)でした。このPCの値で、ほかのPCでは変わります。

計測は1台、各10回で、最小と最大に約2倍の開きがあります。速さの優劣ではなく、「毎回起動する」使い方の重さとして読んでください。

Pythonに移すと、Excelは要らなくなりますか?

集計だけなら、要らなくなります。openpyxlは読み取り専用モードでxlsxのファイルを直接読み、Excelを立ち上げません。pandasのread_excelも、公式の説明では、engineを指定しなければxlsxはopenpyxlで読みます。

その代わりに、保守で見るものが変わります。VBAはExcelだけで動きます。Pythonは、Python本体、openpyxl、pandasとその依存を、動かす全部のPCに入れ、バージョンをそろえます。手元のpandasは依存の7つと合わせて約126MB、openpyxlだけならet-xmlfileを含めて約2MBでした。

Excelが要らなくなるのは、ブックの中身を読み書きするだけの処理に限ります。印刷、PDFへの書き出し、開いたブックの操作は、PythonからExcelをCOMで動かす形になり、Excelが要ります。

ボタンやUserFormは、Pythonでどうなりますか?

そのままは移りません。シートのボタンも、UserFormの入力画面も、開いたときに動くWorkbook_Openも、VBAがExcelの中にいるから成り立つ仕組みです。openpyxlとpandasはファイルを読み書きするだけで、ボタンや入力画面を作る機能がありません。

VBAで当たり前にできる6つの処理と、Python単体での扱いの対応表。ブックを開いたまま実行は保存がPermissionError、ボタンはkeep_vba=Trueで残りFalseで消え、UserFormは編集できず、イベントと自作関数と印刷はopenpyxl・pandasに機能がないVBA では当たり前にできて、Python 単体では別の手段になる処理VBA の処理Python(openpyxl・pandas)だけだと代わりの手段ブックを開いたまま実行Excelで開いたままのブックに openpyxl で保存すると PermissionError(実測)閉じてから動かす。開いたまま触るなら Excel を COM で操作(Excel が要る)シートのボタンで実行ボタンの先は VBA のマクロ。keep_vba=True なら残り、False なら消えた(実測)ショートカットや .bat から起動。押す場所がブックの外に出る入力画面(UserForm)openpyxl は VBA を残せても編集はできない(公式)入力画面は別に作り直す(別のアプリか Web)開いたとき・セルを変えたときopenpyxl・pandas はファイルを読み書きするだけで、ブックの出来事を受けない時刻や手動で起動。出来事に合わせるなら VBA が残る自作の関数をセルで使うopenpyxl・pandas はセルの計算式として呼ばれない値を Python で計算して書き込む。式としては残らない印刷・PDF に書き出すopenpyxl・pandas に印刷の機能はないExcel を COM で操作する。Excel が要る実測:マクロ・ボタン・UserForm 入りの架空ブックを openpyxl 3.1.5 で開いて保存し、Excel 16.0 で開き直した結果(scripts/figs/vba_python_button.py)公式:openpyxl の Tutorial・Optimised Modes のページ(2026年10月17日確認)
図3 VBAでできて、Python単体では別の手段になる処理。実測は2026年10月17日、手元のExcelで確かめました。

マクロ・ボタン・UserFormを入れた架空のブックで、openpyxlで開いて保存し直しました。keep_vba=Trueだと、ボタン1、標準モジュール1、UserForm1が残りました。既定のFalseで保存すると、すべて消えました。

公式のTutorialにも、VBAは既定で残らず、残してもエディタで編集はできない、と書かれています。残ったボタンが呼ぶのは、元のVBAです。

Excelでブックを開いたままopenpyxlで保存すると、PermissionErrorで止まりました。現場が開いたブックのボタンを押す運用は、Python単体では成り立ちません。ブックを閉じてから動かす形に変わります。

現場の運用を変えずに、Pythonに置き換えるには?

置き場所と起動のしかたを、先に決めます。ボタンの代わりに、ショートカットや.batから動かす形になり、「押す場所」がブックの外に出るためです。

決めることは4つあります。Pythonを共有のPCに1台置くのか、各PCに入れるのか。

ショートカットを置くのは誰か。出力はブックの中のシートか、別のファイルか。開いたブックにそのまま書く処理が残るなら、そこはVBAを残すのか。

手元の実験では、Pythonは集計の結果を別のファイルに書きました。VBAのように、同じブックの「集計」シートへは書いていません。

書き換えるか残すかの比べ方は、Excelマクロの移行先の比較にまとめました。金額は導入例(イメージ)にあります。どのマクロが何から呼ばれているかは、先にマクロの呼び出しの数え方で洗い出します。社内に何本あるかは棚卸しの手順で数え、シート名や列を変えたときの壊れ方は実験の記事で確かめてから、書き換える範囲を決めます。

このサイトで相談するには?

Pythonに移すか、VBAを残すかが決まっていなくても大丈夫です。御社のやり方に合わせて、進め方を一緒に考えます。

準備は要りません。無料で相談するからお送りください。返信は最短当日です。

よくある質問

Pythonに書き換えると、Excelは要らなくなりますか?
集計だけなら要りません。openpyxlとpandasはブックのファイルを直接読み書きし、手元の実験でExcelは使いませんでした。印刷やブックを開いたままの操作は、Excelが要ります。
マクロ付きのブックをopenpyxlで開いて保存すると、マクロは消えますか?
既定では消えます。keep_vba=Trueで開くと、手元の実験ではボタン・標準モジュール・UserFormが残りました。ただし残るのはVBAで、編集はできません。
VBAをPythonにすると、実行は速くなりますか?
この集計ではなりませんでした。開いたブックのVBAは0.141秒、Pythonは起動のたびにimportから始まり、中央値で20.948秒(openpyxl)でした。
pandasとopenpyxlは、どちらで書き換えればよいですか?
短く書けるのはpandasで、6行でした。ただし手元では中央値が50.197秒で、openpyxlの20.948秒より長くなりました。xlsxの読み込みは、pandasも裏でopenpyxlを使います。

この記事の実験・計算の条件

架空の受注1万行×30列、50得意先の件数・数量・金額の集計。各10回の中央値。Excel 16.0 build 20430(Microsoft 365、64bit)、Python 3.14.2、pandas 2.3.3、openpyxl 3.1.5、Windows 11。PCは1台。

出典

  1. openpyxl 3.1 documentation「Tutorial」(keep_vba・data_only・読み込み時に失われる図形)(2026年10月17日確認)
  2. openpyxl 3.1 documentation「Optimised Modes」(読み取り専用モード・書き込み専用モード)(2026年10月17日確認)
  3. pandas documentation「pandas.read_excel」(engine が未指定のとき xlsx は openpyxl)(2026年10月17日確認)