[Excel VBA]IIfを使うと再帰が終らない
はじめに
Excel VBA(VisualBasic for Applications)での話.IIfで再帰の終了を判定すると再帰が終らない.
結論.
- IIfは条件の真偽に関わらず,真偽両方の関数を実行する.
- そのため,真偽両方の関数を実行し再帰が終らない.
やってみる
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
- IIfが真偽両方の関数を実行してf1とf2を出力
- 条件式が真なのでf1を実行