VBAでリストを返却するユーティリティ関数では配列ではなくCollectionを使おう

リストを返却するユーティリティ関数では返却値に配列ではなくCollectionを使おう。

' 今開いているブック(複数)からname$の名前を持っているブックだけ集めて返す。
Function CollectOpenedWorkbooks(name$) As Collection
   Set CollectOpenedWorkbooks = New Collection
   Dim eachBook As Workbook
   For Each eachBook In Workbooks
      ' 普通は正規表現でマッチさせたほうがいいかもね
      If eachBook Like "*" & name & "*" Then CollectOpenedWorkbooks.Add eachBook
   Next eachBook
End Function

上記のようなCollectionを返却する関数を使えば下記コードは違法ではない。

Dim eachBook As Workbook
For Each eachBook in CollectOpenedWorkbooks("_テーブル仕様書")
   REM 何かコード〜〜〜
Next eachBook

一方、上記関数が配列を返す関数だった場合は下記問題が発生する:

  • For Eachに指定する変数(eachBook)の型宣言がAs Variantじゃないと文法違反になる。配列のFor EachはVariantがループ変数にならないといけない。
  • サイズ拡張するたびにいちいちReDim Preserveするのがとてつもなくウザい。

ということで、普通は何にも利点がありません。Collectionを使いましょう。

欠点といえば、JavaのようにGenericsがないのでCollectionの要素型がわからなくなることでしょうかね。

どうでもいいけど

Officeがないからコードを動かすことができない。Office 14まで待つつもりだけど、再来年販売になったら目もあてられない…。