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 ではない。まだまだ奮闘の日々が続きそうです。
参考まで。