[Excel VBA]IIfを使うと再帰が終らない

はじめに

Excel VBA(VisualBasic for Applications)での話.IIfで再帰の終了を判定すると再帰が終らない.

結論.

  1. IIfは条件の真偽に関わらず,真偽両方の関数を実行する.
  2. そのため,真偽両方の関数を実行し再帰が終らない.

やってみる

1から指定した数字までの文字列を返す関数を考える.3を与えると,文字列“1 2 3”を返す.

次のソースはIIfを使っているが,これは終らない.IIfの条件(v > 1)が偽になっても,真の関件(f(v - 1))を実行するためである.

Sub Macro1()
  Debug.Print f(3)
End Sub

Function f(v As Integer) As String
  f = IIf(v > 1, f(v - 1) & " " & v, v)
End Function

IIfではなくて,IFを使うと正しく終了する.

Sub Macro1()
  Debug.Print f(3)
End Sub

Function f(v As Integer) As String
  If v > 1 Then
    f = f(v - 1) & " " & v
  Else
    f = v
  End If
End Function

簡単な例

再帰を使わない例で試してみよう.

Sub Macro2()
  Debug.Print IIf(True, f1(), f2())
End Sub

Function f1()
  Debug.Print "f1"
  f1 = "f1"
End Function

Function f2()
  Debug.Print "f2"
  f2 = "f2"
End Function

実行結果はこうなる.

f1
f2
f1
  1. IIfが真偽両方の関数を実行してf1とf2を出力
  2. 条件式が真なのでf1を実行