
VBAを使っていて
http://blog.goo.ne.jp/mumbai/e/dc90cf94fc40baebf …
#If VBA7 Then
Debug.Print "EXCELは2010以上です。"
#Else
Debug.Print("EXCELは2007以下です。")
#End If
というように、#IFというようなものが出てきます。
これの使用方法を知りたいのですが検索して調べたところ、
https://msdn.microsoft.com/ja-jp/library/tx6yas6 …
このページに書かれてあるように
#があるとコンパイル時にif文の評価を行うのに対し、
#がないとif文も含めてコンパイルした後に、プログラムを実行する時にif文の評価を行う
といったことが書かれてあります。
それで試してみたのですが
#If VBA7 Then
aa=0
#Else
aa=1
#End If
というコードを実行するとaa=0が代入されます。
一方で
If VBA7 Then
aa=0
Else
aa=1
End If
というコードを実行するとVBA7がemptyになっており
aa=1が代入されます。
これはVBA7という変数がコンパイル時にのみ有効で
実行時には存在しないためだからでしょうか?
No.1ベストアンサー
- 回答日時:
少しだけですが、
#If VBA7 Then
aa=0
#Else
aa=1
#End If
の『VBA7』は条件付きコンパイル中で使える定数です。
あらかじめVBAの中に組み込まれています。
で、
If VBA7 Then
aa=0
Else
aa=1
End If
とした場合の『VBA7』は一般的な単なる変数です。
VBEでツール→オプションの編集タブにある「変数の宣言を強制する」に
チェックを入れてあると
「コンパイルエラー :変数が定義されていません」になるはずです。
でチェックを入れていない場合はVariant型として定義されますので
Empty値の初期値は、False、0、"" のいずれかになりますから
If VBA7 Then → False → aa=1 となるわけです。
No.2
- 回答日時:
せっかく#1さんが解説した後で、こちらが訳の分からないようなことを書くのはおこがましいと思われるかもしれませんが、
私は、#IF ダイレクティブをみて、
語学などで使う用語で メタ言語と呼ばれるものがありますが、それだなと思いました。つまり、メタ言語というのは、言葉を言葉で規定するということです。
この「メタ」という概念をプログラミングに置き換えると、VBAの一般の記述があり、それを「一つ上の段階から定義したり規定させること」ができるものと解釈できます。
あまり良い例が思いつきませんでしたが、
ひとつは、バージョンや32bit, 64bit で切り分けなくてはならない場合と、
もうひとつは、プロジェクト全体として、環境の違いにより、致命的なエラーを回避する必要がある時
だと思います。
ただ、よくよく考えてみると、Option Explicit で変数の宣言を強制するとか、32bit と64bit の違いによるプログラムの違いとかでないと、それほど重要な位置にとなるものは少ないのではないでしょうか。
だから、もし、これを同じVBAのステージで行うなら、例えば、バージョンなら、Val(Application.Version) などで、Version を取るのが普通です。
>これはVBA7という変数がコンパイル時にのみ有効で
>実行時には存在しないためだからでしょうか?
と言われれば、否定はしないけれども、VBA7は変数ではありませんね。条件付きコンパイル定数というわけで、予め組み込まれているわけですが、後々、気がついたことですが、VBA7 は、Excel 2010 以降とそれ以外を分けるものになっているわけで、こういう区分けは、あまり意味があるとは思えません。
Option Explicit
#If VBA7 Then
Dim ret As Long 'Office 2010以降はこちらです。
#Else
Dim ret As Integer '2007だと、こちらになる
#End If
Sub Test1()
MsgBox TypeName(ret)
End Sub
そのコードをコンパイルで巻き込むとエラーを出すので、回避するためが中心で、それ以上に重宝するとも言えません。
それに、どこまでこの条件付きコンパイル定数が登録されているのかは、分かりません。せいぜい、64bit と32bit を分けるWin32 APIの区分けぐらいだけです。
Excel2003とそれ以降のファイルの違いで、リボン・コントロールイベントとクラスイベントの区分けを#IFダイレクティブで区分けできるとも言えません。せいぜい、コードエラーを出さないだけでしかありませんでした。
例:
http://oshiete.goo.ne.jp/qa/9317937.html
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
アプリケーションのDLLファイル...
-
<unistd.h>をVisualStudioでつ...
-
64ビットのlinuxで32ビットメモ...
-
VC++6.0 で使用可能な、"Platfo...
-
分割コンパイル
-
MVSマシンで0C7でABENDしたので...
-
#If True Then の # って何??
-
VS2010環境で2点ほど質問
-
[COBOL] ソースの復帰
-
gccでc++プログラムをコンパイ...
-
math.hに含まれる関数が使えない
-
python エラー
-
DLLファイルの逆コンパイラにつ...
-
組み込みソフト。ROM領域にデータ
-
multiple definitionというエラー
-
デバッグとビルドは何が違うの...
-
fortranでプログラムを実行する...
-
unsigned long long 型のフォー...
-
至急おねがいします
-
【VS2008 C++】2つのプロジェ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
<unistd.h>をVisualStudioでつ...
-
アプリケーションのDLLファイル...
-
共有ライブラリの内容確認について
-
64ビットのlinuxで32ビットメモ...
-
プレコンパイルの意味を教えて...
-
math.hに含まれる関数が使えない
-
c言語です コンパイルした時に...
-
ビープ音が鳴りません・・・
-
C言語で、配列を使ったsinカー...
-
Cのコンパイルでコメントアウト...
-
すべてのリビルド: 0 正常、 0 ...
-
MVSマシンで0C7でABENDしたので...
-
Delphiでクラスをオブジェクト...
-
#If VBA7 Thenに関して
-
DLLは解読可能ですか
-
C#で char型とstring型の比較で...
-
[COBOL] ソースの復帰
-
gcc バージョン違いによるコン...
-
gccでc++プログラムをコンパイ...
-
シリアル通信の受信待ちについて
おすすめ情報
納得しました
ありがとうございます。