今回もVBAHaskellのコードにヒントを得た書き方。
【参照】
thom.hateblo.jp
VBAHaskellのHaskell_2_stdFunモジュールでは、関数とそのポインタを表す関数が対になっており、インデントで表現されている。
以下引用
Function firstArg(ByRef a As Variant, ByRef b As Variant) As Variant firstArg = a End Function Function p_firstArg(Optional ByRef firstParam As Variant, Optional ByRef secondParam As Variant) As Variant p_firstArg = make_funPointer(AddressOf firstArg, firstParam, secondParam) End Function
なるほど、Functionキーワードそのものをインデントするという発想は無かった。
さて、VBAでコードを書いていると、あるプロシージャの子プロシージャを作りたいケースがある。
他の言語では、関数をネストしたりできるものがあるけれど、VBAにその機能はない。
普通に書くと以下のようになるが、
Sub Outer() For i = 0 To 5 Call Inner Next End Sub Private Sub Inner() 'これはOuterプロシージャからのみ呼び出される Debug.Print "内部プロシージャが呼び出されました。" End Sub
特定のプロシージャからのみ呼び出されることが決まっているのであれば、親プロシージャ内に子プロシージャを書きたい。
VBAでは、機能的にそれを実現することはできないので、擬似的にインデントを使ってあたかも一つのプロシージャであるかのように書いてみた。
Sub Outer() Debug.Print "これは外部プロシージャ" For i = 0 To 5 Call Inner Next End Sub Private Sub Inner() Debug.Print "内部プロシージャが呼び出されました。" End Sub
エディタの設定で区分線を消してしまえばよりそれっぽく見える。