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まで待つつもりだけど、再来年販売になったら目もあてられない…。