一回も披露したことのない豆知識

VBAのウィキを見ていると
http://ja.wikipedia.org/wiki/Visual_Basic_for_Ap …
「基本的にはインタプリタ型の言語であるため、コンパイル(ビルド)の作業は不要である。」

との事ですが
VBE画面のデバッグ画面に「VBAProjectのコンパイル」と言う機能がなぜあるのはなぜでしょうか?
VBAでコンパイル作業は不要だけど、付属として「VBAProjectのコンパイル」機能があるのでしょうか?

A 回答 (7件)

こんばんは



私の場合、VBAは何年も使っていますが「VBAProjectのコンパイル」
なんて機能は知りませんでした。

人に教える機会があって、そのときに使ったテキストに出ていたので、初めて知りました。
「VBAProjectのコンパイル」を使わなくても、問題なく動作します。

一つ、使い道をあげるならば、
「VBAProjectのコンパイル」を使うと、実行することなく、文法チェックできます。

もっとも、文法上のエラーがあれば、プログラムが実行される前にエラーが出るように
なっていますので、わざわざ一手間をかける理由は見つかりません。

たぶん、過去のバージョンを使っていた人が「この機能はどこへ行った?」と
ならないように残しているのではないかと思います。
そうはいっても、Excel2000でも、コンパイル操作なしに実行できますから、
当たってないかもしれません。
    • good
    • 0
この回答へのお礼

なくても使えるのですね。ありがとうございます。

お礼日時:2011/11/04 19:36

二重投稿・・・ゴメン(TへT

    • good
    • 0
この回答へのお礼

いえいえ
ご丁寧にありがとうございました。

お礼日時:2011/12/03 20:19

補足@ANo.2読み返したら意味分からなかったので(--;



最近のVBAは、インタプリタでもコンパイラでもない・・・
ハイブリッド言語!なんだとか。
初回実行時、まずPコードにコンパイルして保持しておき、
そのPコードをインタプリタで実行するらしいですよ。

Pコードは、JAVAバイトコードなんかで有名な"中間コード"
の一種で、マシンコードに近く実行が早いです。
VBAの場合、初回実行時にコンパイルしていくことも、予め
コンパイルしてファイル内に保持することもできます。

・コンパイル言語
  ソースを、実行形式@マシンコードにコンパイル。
  マシンコードなので実行が早い。
・インタプリタ言語
  ソースを解釈しながら実行する。
  マシンコードに変換しながらなので、当然遅い。
・VBA
  Pコードにコンパイルする(タイミングは任意)。
  Pコードはマシンコードに近いので、実行が早い。


で、VBAは通常、実行時に使用分のみ自動コンパイルする
ようで、各関数の初回使用時に順次・・・という感じ。
あくまで、コンパイルはしてるらしい。

「VBAProjectのコンパイル」は、一度全てコンパイルした上
で、"ファイルにPコードを保持する機能"をONにします。
この状態では、手動or自動コンパイルされる都度、ファイル
に保持するコードも変わります。
ややこしいですが、ON状態でソースを変更した場合、変更
箇所を使用するか、「VBAProjectのコンパイル」する
まで、ファイル上のPコードはたぶん変更されません。
あと、OFFにする方法は不明。


僕もあんまり難しいことはワカリマセン。。。
認識に誤りもあるかもなんで、調べてみてクダサイ。

(参考)
・VBA はインタープリタ?コンパイラ?
http://www.h3.dion.ne.jp/~sakatsu/Excel_Tips13.htm
・コンピュータ言語はどのような仕組みで動いているのか
 (文字コードはJIS。ソース開かないと文字化けかも)
http://archive.linux.or.jp/JF/JFdocs/Unix-and-In …
・VB@Wikipedia (VBAもVBの類。ちょっと説明あり)
http://ja.wikipedia.org/wiki/Microsoft_Visual_Ba …

かなりがんばりました。
    • good
    • 2
この回答へのお礼

ありがとうございました。

お礼日時:2011/12/03 20:19

補足@ANo.2読み返したら意味分からなかったので(--;



最近のVBAは、インタプリタでもコンパイラでもない・・・
ハイブリッド言語!なんだとか。
初回実行時、まずPコードにコンパイルして保持しておき、
そのPコードをインタプリタで実行するらしいですよ。

Pコードは、JAVAバイトコードなんかで有名な"中間コード"
の一種で、マシンコードに近く実行が早いです。
VBAの場合、初回実行時にコンパイルしていくことも、予め
コンパイルしてファイル内に保持することもできます。

・コンパイル言語
  ソースを、実行形式@マシンコードにコンパイル。
  マシンコードなので実行が早い。
・インタプリタ言語
  ソースを解釈しながら実行する。
  マシンコードに変換しながらなので、当然遅い。
・VBA
  Pコードにコンパイルする(タイミングは任意)。
  Pコードはマシンコードに近いので、実行が早い。


で、VBAは通常、実行時に使用分のみ自動コンパイルする
ようで、各関数の初回使用時に順次・・・という感じ。
あくまで、コンパイルはしてるらしい。

「VBAProjectのコンパイル」は、一度全てコンパイルした上
で、"ファイルにPコードを保持する機能"をONにします。
この状態では、手動or自動コンパイルされる都度、ファイル
に保持するコードも変わります。
ややこしいですが、ON状態でソースを変更した場合、変更
箇所を使用するか、「VBAProjectのコンパイル」する
まで、ファイル上のPコードはたぶん変更されません。
あと、OFFにする方法は不明。


僕もあんまり難しいことはワカリマセン。。。
認識に誤りもあるかもなんで、調べてみてクダサイ。

(参考)
・VBA はインタープリタ?コンパイラ?
http://www.h3.dion.ne.jp/~sakatsu/Excel_Tips13.htm
・コンピュータ言語はどのような仕組みで動いているのか
 (文字コードはJIS。ソース開かないと文字化けかも)
http://archive.linux.or.jp/JF/JFdocs/Unix-and-In …
・VB@Wikipedia (VBAもVBの類。ちょっと説明あり)
http://ja.wikipedia.org/wiki/Microsoft_Visual_Ba …

かなりがんばりました。
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2011/12/03 20:19

例)Dim asx As springのところでエラーになるプログラム



Sub aaa()
Cells(1, 1).Value = 123
End Sub
Sub bbb()
Dim asx As spring
End Sub

これで、sub aaa()を実行すると
VBEのオプション:全般の順次コンパイルにチェックがある場合、
aaa()は実行され、正常終了します。

wikiなどにある「インタプリタ(interpreter)とは・・・逐次解釈しながら実行するプログラムのこと。」の通り、処理するサブルーチンを処理する順番にコンパイル(解釈)しながら実行しています。

VBEのオプション:全般の順次コンパイルにチェックがない場合、
sub bbb()の
Dim asx As spring
のところがエラー表示され、aaa()は実行されません。
逐次解釈しながら実行するプログラムとはいえないですね。

しかし、aaa()を
Sub aaa()
Cells(1, 1).Value = 123
a == 1
End Sub
とすると、どちらの場合も
Cells(1, 1).Value = 123
は処理されず、a == 1でエラーになります。
VBEのオプション:全般の順次コンパイルにチェックがない場合、
インタープリターといっても、行単位の逐次解釈ではないですね。
あくまで、サブルーチン単位の逐次解釈です。

wikiの「基本的には」となっているところが、どういう意図かは知りませんが、
実行時コンパイラがVBAでは勝手に動いていると思ったほうがいいような気もします。
(本題ではなさそうなので詳しくはやめておきます。)

「VBAProjectのコンパイル」機能は、エラーチェック目的で、実行時に行われるコンパイルを
テスト実行しているだけと思えばいいのでは?



コンパイルといってもファイル出力しているのではなくメモリ上に展開しているだけ
かもしれません。(詳細不明)

なお、「VBAProjectのコンパイル」実行しただけで、ファイルサイズが大きくなっているから、
これをやっておくと、実行時に行われるコンパイルがすでに済んだ状態になって
少し早いのかもしれません。
ただし、マクロを1回実行しただけで保存しても同様にファイルサイズは大きくなるので、
どちらをやってもあまり違いはないかと思います。
(同じサイズにならないところがまた良く分からないけど。
 どちらにしろ、EXCELの内部的な話なのでよくわからないところです。
 ※以下は、感想程度に思っていただいて、あてにしないでください。
 本題と関係するのか微妙ですし。)
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2011/12/03 20:18

普段からOption Explicitを宣言してますか?



Option Explicitを宣言しないままDimで宣言されていない変数を用いてたりすると、VBAProjectのコンパイルで検出できますよ
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2011/11/04 19:37

「VBAProjectのコンパイル」はPコードをファイルに保存する機能。

ソレしなくても、初回実行時にコンパイルしてるらしいですよ。

更に、VBEのオプションで「順次コンパイル」をONにすると、コード入力した端からコンパイルされていくんだとか・・・。インタプリタ的な動きをするけど、Pコードで高速化。もう、インタプリタ言語ともコンパイラ言語とも呼べない、別の何か。何ていうんだろうw

ただ、「VBAProjectのコンパイル」に関しては、初回コンパイルよりファイルサイズの方が気になる。。。
    • good
    • 0
この回答へのお礼

Pコードははじめて聞いたので調べてみます。ありがとうございます。

お礼日時:2011/11/04 19:37

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!