VBAのウィキを見ていると
http://ja.wikipedia.org/wiki/Visual_Basic_for_Ap …
「基本的にはインタプリタ型の言語であるため、コンパイル(ビルド)の作業は不要である。」
との事ですが
VBE画面のデバッグ画面に「VBAProjectのコンパイル」と言う機能がなぜあるのはなぜでしょうか?
VBAでコンパイル作業は不要だけど、付属として「VBAProjectのコンパイル」機能があるのでしょうか?
No.1ベストアンサー
- 回答日時:
こんばんは
私の場合、VBAは何年も使っていますが「VBAProjectのコンパイル」
なんて機能は知りませんでした。
人に教える機会があって、そのときに使ったテキストに出ていたので、初めて知りました。
「VBAProjectのコンパイル」を使わなくても、問題なく動作します。
一つ、使い道をあげるならば、
「VBAProjectのコンパイル」を使うと、実行することなく、文法チェックできます。
もっとも、文法上のエラーがあれば、プログラムが実行される前にエラーが出るように
なっていますので、わざわざ一手間をかける理由は見つかりません。
たぶん、過去のバージョンを使っていた人が「この機能はどこへ行った?」と
ならないように残しているのではないかと思います。
そうはいっても、Excel2000でも、コンパイル操作なしに実行できますから、
当たってないかもしれません。
No.6
- 回答日時:
補足@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 …
かなりがんばりました。
No.5
- 回答日時:
補足@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 …
かなりがんばりました。
No.4
- 回答日時:
例)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の内部的な話なのでよくわからないところです。
※以下は、感想程度に思っていただいて、あてにしないでください。
本題と関係するのか微妙ですし。)
No.2
- 回答日時:
「VBAProjectのコンパイル」はPコードをファイルに保存する機能。
ソレしなくても、初回実行時にコンパイルしてるらしいですよ。更に、VBEのオプションで「順次コンパイル」をONにすると、コード入力した端からコンパイルされていくんだとか・・・。インタプリタ的な動きをするけど、Pコードで高速化。もう、インタプリタ言語ともコンパイラ言語とも呼べない、別の何か。何ていうんだろうw
ただ、「VBAProjectのコンパイル」に関しては、初回コンパイルよりファイルサイズの方が気になる。。。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
アプリケーションのDLLファイル...
-
<unistd.h>をVisualStudioでつ...
-
[COBOL] ソースの復帰
-
実行ファイルが作成環境以外のP...
-
gcc コンパイル killed
-
実行後にコンパイルに失敗しま...
-
C#で char型とstring型の比較で...
-
CとC++の混在、最近は
-
WindowsXPの MinGW,コマンドラ...
-
すべてのリビルド: 0 正常、 0 ...
-
Linux(g++)とAIX(XL C++)の挙動...
-
ビープ音が鳴りません・・・
-
gcc バージョン違いによるコン...
-
再起動しないとADOが使えなくな...
-
この文章正確ですか?
-
ActiveFormの有無を判定したい
-
自作DLLの中身を暗号化
-
Visual Basic.NETの処理速度は6...
-
64bitで作ったdll32bit動かない
-
共有ライブラリの内容確認について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
アプリケーションのDLLファイル...
-
<unistd.h>をVisualStudioでつ...
-
すべてのリビルド: 0 正常、 0 ...
-
lhafileをインストールしたい
-
C#で char型とstring型の比較で...
-
gcc コンパイル killed
-
[COBOL] ソースの復帰
-
c言語です コンパイルした時に...
-
実行後にコンパイルに失敗しま...
-
共有ライブラリの内容確認について
-
ビープ音が鳴りません・・・
-
gcc バージョン違いによるコン...
-
64ビットのlinuxで32ビットメモ...
-
NASMとMASMの違い
-
C言語で作ったらWindowsでもMac...
-
math.hに含まれる関数が使えない
-
MVSマシンで0C7でABENDしたので...
-
ccとgcc
-
「インクルードファイル 'pthre...
-
自作DLLの中身を暗号化
おすすめ情報