Static変数入門(※私が)

一時期、こんなコードを書いていた。

Sub test()
    MsgBox PriceDict("りんご")
End Sub
Function PriceDict() As Dictionary
    Dim tempDict As Dictionary
    Set tempDict = New Dictionary
        tempDict("りんご") = 100
        tempDict("みかん") = 150
        tempDict("ばなな") = 200
    Set PriceDict = tempDict
End Function

価格参照用の辞書を作成して、りんごの値段をメッセージボックスに表示する。
しかしこれだと、毎回辞書を作成することになる。無駄が多いような気がする。

そこで、こんな風に書くようになった。

Public Dict As Dictionary

Sub test()
    If Dict Is Nothing Then
        Set Dict = PriceDict
    End If
    MsgBox Dict("りんご")
End Sub

辞書をPublic変数にしておき、その存在を確認することで、初回だけ辞書作成の過程を経ることになる。でも、このためだけにPublic変数を準備するのも、なんだか大げさな感じがしていた。
すると、ことりちゅんさんから「Static変数で充分では?」とのアドバイスをいただいた(いつも有難うございます)。
www.excel-chunchun.com
なるほど!ということで、こんな風に書くようになった。

Sub test()
    Static Dict As Dictionary
        If Dict Is Nothing Then
            Set Dict = PriceDict
        End If
        MsgBox Dict("りんご")
End Sub

Staticステートメントを用いることで、一旦作成したDictが、test実行後も保持されている。これなら、Public変数を使う必要は無い。

しかし、これだとPriceDictを使う場面で毎回有り無し確認が必要になってしまう。とここで、私は先の助言を正しく理解できていないのでは?と思うに至った。正しくは、こっちだったのかも。

Sub test()
    MsgBox PriceDict("りんご")
End Sub
Function PriceDict() As Dictionary
    Static tempDict As Dictionary
    If tempDict Is Nothing Then
        Set tempDict = New Dictionary
            tempDict("りんご") = 100
            tempDict("みかん") = 150
            tempDict("ばなな") = 200
    End If
    Set PriceDict = tempDict
End Function

これならば、PriceDictを横展開する際に、毎回「辞書が作成済みか否か」を確認しなくて済むようになる。

というわけで、考察・検討不足を改めて思い知った次第。恐らく上記もまた、better であって best ではない。まだまだ奮闘の日々が続きそうです。

参考まで。