2014年2月17日月曜日

Ariawaseライブラリ集で学ぶVBA(3) ArrayEx

【まえがき】

VBAソースコード管理支援ツール vbac を作成されている いげ太さん作のAriawase VBAライブラリ集 (Ver. 0.6.0 β)について、何回かに分けて勉強しつつ解説してみたいと思います。

第3回目となる今回は、ArrayEx.clsについてです。


【ArrayExについて】

VBAにおいて、動的配列を手軽に扱えるようにするためのラッパークラスです。

ReDim, Preserveを使った不毛な(プリミティブな)作業とお別れできるため、配列操作がかなり楽になります。シンプルな作りながら、エラー処理もキッチリ実装されており、大変便利なので、ガシガシ使えばいいと思います。(ただし、末尾への要素追加に限る)

作者のいげ太さんからの補足情報
とのことで、ArrayExはエンドユーザ用のクラスというよりは、Ariawaseライブラリ内で用いるクラスという位置づけのようです。

とはいえ、便利は便利なので使えそうなら使うと良いのではと思います。(ただし、末尾への要素追加に限る)

【ArrayExの使い方】

利用にあたって必要な構成

特になし。
ArrayEx.cls をインポートするだけで使えます。

メンバの概略

  • AddVal, AddObj
    • ArrayExへ値またはオブジェクトを追加
  • ToArray
    • 標準の配列(Array)に変換

サンプルコード


 【各メンバについての解説】

AddVal

  • 値を追加する。名前のままです。
  • 引数: 値
    • 引数の型は、Varient型になっていますが、objectを渡さないように注意。
      (間違えないと思いますが…)

AddObj

  • オブジェクトを追加する。名前のままです。
  • 引数: オブジェクト
    • 注意点は、上記AddVal と同様。
    • ちなみに、IsObjectを使えば、AddValとAddObjを1つにまとめられますが、要素追加のたびに条件分岐がかかるのを抑えるため、意図的に分けられているようです。(いげ太さん談)

ToArray

  • VBA標準の配列(Array)に変換する。
  • 引数なし

【ArrayExのソースコードから学ぶVBA】

動的配列におけるメモリ確保の方法

メモリの確保部分に関連するコードを下記に抜粋 します。

要素を追加時(AddVal)に、配列のサイズが足りなければ、配列サイズを2倍にする(Extend)ように設計されています。O(1) の計算量になる安心の設計です。
コードを見る前に「インクリメントしてたら、どうしよう」と心配したのですが、杞憂に終わりました。

それはさておき、動的配列のメモリの確保の仕方について各プログラミング言語ごとに調査、比較された記事がありました。技術的にかなり興味深いです。というか、単純に面白い。

【どうでもいい感想】

  • 末尾への要素追加のみで良ければ、直接書くよりだいぶ楽で、安心、便利なクラスです。 
  • もうちょい複雑な処理をしたい場合は、XArray が個人的におすすめ。
    • ArrayEx のToArray関数をマージするとさらに便利に。
    • メモリの確保の仕方も、ArrayEx同様、O(1)に修正すればさらに安心。