あんにんにっき。

日々思ったことや、おこったことを記録するブログ。要するに日記。

IIfの謎

 一昨日書いたネタにコメントで以下のような指摘をうけました(ありがとうございます)。

Perlの場合は実行時エラーではなくてその前のエラーですね(コンパイルエラーのようなもの)。
my $foo = 0; としておいて 3 / 0 の所を 3 / $foo にするとチェックにかからないので実行できます

 なるほど、確かに実行できるように。
 そこで、ふと気になったのが、EXCEL VBAのIIfも、同じような制約にかかっているのではないか、という事。
 というわけで、以下のようなコードを書いて試してみた。

Public Sub test()
    Dim a As Integer
    a = IIf(True, outputA1(), outputA2())
End Sub

Public Function outputA1() As Integer
    Range("A1").Select
    ActiveCell.FormulaR1C1 = "abc"
    outputA1 = 0
End Function

Public Function outputA2() As Integer
    Range("A2").Select
    ActiveCell.FormulaR1C1 = "def"
    outputA2 = 0
End Function

 IIfの条件がTrueの場合は、outputA1()、Falseの場合はoutputA2()を呼び出すことで、それぞれA1セル、A2セルに値を書き込む、というもの。
 で、実行してみたところ、やはり、両方が評価されているようで、A1とA2のセルに値が書き込まれている。危険な関数だなぁ。要注意。
 ちなみに、同じような処理をperlで書いてみたら、ちゃんと片方しか動きませんでした。指摘されなかったら、ずっと気付かないところだった。ありがとうございます。