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を入れる場所と、誰がどこから起動するかを決めます。
目次
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行でした。
実行時間は、各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です。
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はファイルを読み書きするだけで、ボタンや入力画面を作る機能がありません。
マクロ・ボタン・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台。