
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で質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) vba コンパイル 4 2022/10/27 10:01
- C言語・C++・C# Cのコンパイルでコメントアウトをそのままオブジェクトに保持したい 7 2023/08/01 22:22
- C言語・C++・C# プログラム Arduino 1 2022/07/03 11:13
- C言語・C++・C# エラー: ‘inval’ の記憶サイズが不明です。 union semun inival; というエ 2 2023/01/16 22:04
- PostgreSQL PostgreSQL14.6のSSL対応について 1 2023/01/05 15:42
- その他(プログラミング・Web制作) Pythonの作業環境・作業フォルダの迅速な設定・指定方法 3 2022/04/01 07:55
- Java dokojavaのコンパイルについて 1 2022/10/06 18:42
- C言語・C++・C# ExcelCS 1 2023/01/27 19:47
- FX・外国為替取引 MQL5にて謎のエラーが発生!だれか対処を教えてください! 1 2023/03/25 15:59
- その他(ブラウザ) iPhone SEです。 ソースからコンパイルする方法ってどうすればいいのですか。教えてくださると嬉 3 2022/10/02 08:08
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
<unistd.h>をVisualStudioでつ...
-
hello worldの表示の仕方
-
arduinoのエラーメッセージ
-
セグメンテーション違反について
-
VC++6.0の混在モード
-
64ビットのlinuxで32ビットメモ...
-
デバッガについて
-
自作DLLの中身を暗号化
-
gccコンパイルできない原因は!?
-
Cのソースを毎回コンパイルし...
-
c言語です コンパイルした時に...
-
実行後にコンパイルに失敗しま...
-
セグメンテーション違反とは??
-
PIC同士のシリアル通信について
-
[COBOL] ソースの復帰
-
gccを使ってのリンク時のライブ...
-
DLLは解読可能ですか
-
リムーバブルディスクをPCへ挿...
-
Makefileでのコンパイル方法
-
printf()関数の括弧を二重にし...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
<unistd.h>をVisualStudioでつ...
-
アプリケーションのDLLファイル...
-
実行後にコンパイルに失敗しま...
-
math.hに含まれる関数が使えない
-
シリアル通信の受信待ちについて
-
ビープ音が鳴りません・・・
-
C#で char型とstring型の比較で...
-
c言語です コンパイルした時に...
-
共有ライブラリの内容確認について
-
すべてのリビルド: 0 正常、 0 ...
-
64ビットのlinuxで32ビットメモ...
-
C言語で作ったらWindowsでもMac...
-
MS-BASICの逆コンパイルについて
-
<math.h>ヘッダを入力している...
-
ヘッダーファイル『windows.h』...
-
プレコンパイルの意味を教えて...
-
Verilog_HDLでのdefineとifdef
-
[COBOL] ソースの復帰
-
gcc バージョン違いによるコン...
-
同じEXE・同じファイルで解析結...
おすすめ情報