VBAには #If というものがある。通常の If ではなく、音楽記号でいうところのシャープが付いているものだ。


Sub dispVer()
Dim iVal As Integeri

iVal = Application.Version

#If iVal = 7 Then
MsgBox 95
#ElseIf iVal = 8 Then
MsgBox 97
#ElseIf iVal = 9 Then
MsgBox 2000
#ElseIf iVal = 10 Then
MsgBox 2002
#ElseIf iVal = 11 Then
MsgBox 2003
#ElseIf iVal = 12 Then
MsgBox 2007
#Else
MsgBox iVal
#End If
End Sub

この例、まともに動作するだろうか?おそらくは Else に流れていってしまうだろう。
#If では通常の If のような判定はできないのである。

では、何が出来るのか?上記を簡単に書き換えると


Sub dispVer()
#Const iVal = 11

#If iVal = 7 Then
MsgBox 95
#ElseIf iVal = 8 Then
MsgBox 97
#ElseIf iVal = 9 Then
MsgBox 2000
#ElseIf iVal = 10 Then
MsgBox 2002
#ElseIf iVal = 11 Then
MsgBox 2003
#ElseIf iVal = 12 Then
MsgBox 2007
#Else
MsgBox iVal
#End If
End Sub


上記の例では #Const で定義した値を判定させているが、リテラル値も可能だ。しかし変数は不可である。
つまり、用途としては


Sub Debugsample()

#Const bDebug = True

Dim iVal As Integer

iVal = 10 + 20

#If bDebug Then
Debug.Print iVal
#End If

End Su


というように、デバッグ時の切り替えか、MacかWin16、Win32かの判定くらいにしか使えない。
ならば If と大差なさそうだが、最大の相違点は「その条件に合わない場合は完全に無視する」ということ。つまり、Macのみ/Winのみでサポートされる命令を記述すると、If であればコンパイル時にエラーが出るが、#If ではエラーが出ないのだ。 つまり、実行時に評価されることになる。

これにより、Mac/Winの独自命令も混在させることができる。

なお、バージョン間の処理の際を吸収するニーズの方が多いだろう。確か、過去にクラスモジュールを使って行った記憶がある(ちょっと怪しい)。それもそのうちに紹介できればと思う。

ブログトップへ

ブログ内検索キーワード
 クラス
 バージョン