2015/02/08

【VBA】三項演算子(IIf関数)の扱いに注意せよ!

VBAでツールをつくっているとき、ついC#の感覚で三項演算子を使ったら大変なことになった。
ちなみにVBAで三項演算子は「IIf(Expression, TruePart, FalsePath)」と書く。
問題となったコードがこちら
Sub ConvertToCurrency(ByVal value As String)
    Dim price As Currency
    price = IIf(Trim(value) = "", 0, CCur(value))
    '-- 以下略
End Sub




なんの変哲もない、引数が空白なら"0"、空白以外なら通貨型(Currency)に変換するプロシージャ。
※文字列は渡ってこない前提

これの何が問題かというと、
valueに空白が渡ってくると「型が一致しません」というエラーになる。


原因は、式の評価と関係なくTruePartとFalsePartが実行されてしまうから。



以下のような処理をかけば、よりわかりやすいだろうか。
これを実行すると「true」、「false」と2回メッセージボックスが表示される。
'-- "true", "false” と2回メッセージが表示される
price = IIf(Trim(value) = "", TruePart(value), FalsePart(value))

Function TruePart(ByVal value As String) As Currency
    MsgBox("true")
    TruePart = 0
End Function

Function FalsePart(ByVal value As String) As Currency
    MsgBox("false")
    TruePart = CCur(value)
End Function


以上より、VBAでは行数が減るからといって、むやみに三項演算子(IIf関数)を使わないほうが良いだろう。



以上

written by @bc_rikko

0 件のコメント :

コメントを投稿