VBAのコンパイル方法

VBAのデバッグメニューの一番上に「VBAProjectのコンパイル」というメニューがあります。実行するとコードに誤りがないかをチェックします。

「VBAProjectのコンパイル」メニューを選択すると、VBAで選択されているVBAProjectのブックに含まれるVBAのコードが正しく実行できるかをチェックし、実行できないものがあればその行にジャンプしてエラーダイアログでエラー概要を表示してくれます。チェック対象となるVBAのコードは、コードが書けるモジュールは全てです。ワークシート、標準モジュール、クラスモジュール、フォームモジュールなどの全てのコードがチェック対象になります。

C言語を知っている人が「コンパイル」と聞くと、aaa.cからaaa.objやaaa.oといったオブジェクトコードの作成が頭に浮かびますが、VBAのコンパイルは別ファイルが出来るのではなくブックの中にコンパイル結果が保存されます。そのため、コンパイル後はブックのファイルサイズが増えます。


VBAのコンパイルとは?

コンパイルとは、ソースコードの内容をコンピュータが理解しやすい形に変換することを言います。コンパイルされた内容をPコード(p-code、portable code)とか中間コードなどと言いますが知らなくても大丈夫です。VBAのコンパイルは見た目上はコードのチェックを行っているだけのように見えますが、内部ではPコードの生成を行っています。

VBAは1行ずつ処理をするプログラミング言語のためインタープリタ言語として扱われますが、1行ずつ実行するのは都度コードの内容を確認しながら実行することになり、当然ながら処理速度が遅いため、Pコードを生成して高速化を図っています。そのためインタープリタ言語でありながら、C言語やJava言語のようなコンパイル言語の性格も持ち合わせています。

保存されるコンパイル結果であるPコードはシートの内容はVBAのコードとは別で保存されるため、見た目上はブックの内容が変わったことには気づきません。また、Pコード自体もバイナリ形式のデータであるため編集したりすることはできません。マクロブックをバイナリエディタで見ることは出来ますが、見ても何も分かりません。

一度コンパイルすると「VBAProjectのコンパイル」メニューが非活性になり、コンパイルすることはできなくなります。VBAでのソースコードが変わると活性状態になり再度コンパイルを実行することが出来るようになります。

また、コンパイルをしていなくても関数が実行されたときに自動的にコンパイルされます。ただしこの場合にコンパイルするのは実行した関数だけです。全然関係ない関数や呼び出し先の関数でコーディングミスがあっても、その関数が呼び出されるまでは自動コンパイルは行われません。

「VBAProjectのコンパイル」の場合はブックのコード全体をチェックするのに対し、自動コンパイルは動かした関数だけしかチェックしない、という点が異なります。


コンパイルしてもVBAからexeは出来ません

コンパイルという言葉のせいか、「コンパイル(+ビルド)したらVBAのコードから実行形式のexeのファイルを作れるのか?」という疑問が出そうですが、exeは作れません。あくまでもブックに付随したプログラムです。

VBAで関数を作っていてそれをexeにしたい、という話はExcel上ではできませんが、例えばVisual StudioのVisual Basicでアプリケーションを作成してVBAのコードを転記してVisual Basic用のコードに編集してからexeを作る、というような方法であればもちろん可能です。

ただ、そういう場合は最初からVisual Studioでコーディングした方がラクだと思います。


コンパイルした方がいいの?

VBAはわざわざコンパイルしなくても、関数を実行すればちゃんと動きます。コードに誤りがあれば実行時に「コンパイルエラー」が通知されます。なので、コンパイルはしなくてもいい、という考え方があります。もちろん「VBAProjectのコンパイル」を実行すれば、マクロを動かす前に「コンパイルエラー」を検知することが出来ます。

繰り返しになりますが、コード全体のチェックをしたい場合はコンパイルを行い、気にしないのであれば関数実行時の自動コンパイルに任せてもOKです。ちなみに私自身はほとんどコンパイルしません。自動コンパイル任せです。

というのも、このサイト用も含め、標準モジュールにお試しで書いたテスト用の関数があちこちにあり、ちゃんと完成させる前に別の方法を思いついたりめんどくさくなって放置している関数がごろごろあります。当然、こんな状態でコンパイルを行うとエラーだらけなのは分かっているため、確認したい関数の自動コンパイルに任せています。

「ちゃんとせーや」って声も分かるんですが、自分用に限定していれば特に問題にならないため、これでいいや、と思ってます。コンパイルをするのは人に見せる仕事用のマクロブックを作ったときぐらいです。それで困ったことになったこともないのでこれで通してます。


コンパイルを忘れないようにするには

どうしてもブック全体のコンパイルしたいという場合は、ツールバーに登録しておくと少しはラクになります。手順は以下の通りです。

  1. VBAの表示メニュー → ツールバー → ユーザー設定 から、ユーザー設定ダイアログを表示します。
  2. ユーザー設定ダイアログの「コマンド」タブを選択し、左側の分類から「デバッグ」を選択して、右側のコマンドから「プロジェクトのコンパイル」をツールバーの好きな位置にドラッグします。以下の絵では保存ボタンの右に追加しています。

こうしておけば、コンパイルして保存、という流れにもなり、コンパイル忘れ防止にもなります。