t-hom’s diary

主にVBAネタを扱っているブログ…とも言えなくなってきたこの頃。

VBA インデントを工夫してプロシージャ内の子プロシージャを擬似的に表現するアイデア

今回も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

エディタの設定で区分線を消してしまえばよりそれっぽく見える。
f:id:t-hom:20150822212349p:plain

…良いアイデアのようにも思えるし、ひどいアイデアのようにも思える。
使いどころがあれば試してみようと思う。

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。