2016年10月28日金曜日

Excel VBA 「再帰」の場合の、引数ByVal,ByRefの違い



--------------------------------
Private Sub Testpro(ByVal CaseVal As Long, ByRef CaseRef As Long)

    CaseVal = CaseVal + 1
    CaseRef = CaseRef + 1

    Debug.Print CaseVal, CaseRef 'A

    If CaseRef <= 2 Then
        Call Testpro(CaseVal, CaseRef) 'Bで再帰
    End If

    CaseVal = CaseVal + 1
    CaseRef = CaseRef + 1

    Debug.Print CaseVal, CaseRef 'C

End Sub
--------------------------------
Public Sub Bigin()

    Call Testpro(0, 0)

End Sub
--------------------------------
CaseVal,CaseRef プリント結果
1           1
2           2
3           3
4           4           ←3巡目のC処理
3           5           ←2巡目のC処理
2           6           ←1巡目のC処理
--------------------------------
再帰を使用した場合の、引数ByVal,ByRefの違い
  • Byval は各々の処理ループに作成された caseval 対して、各々+1された値になるので、最後は1巡目の1+1 が返される
  • Byref は同じメモリに対して継続して操作されるので、最後は足した回数6が返される