2012年3月12日月曜日

VBAでpushやpopができる配列クラスを実装しました


VBAの配列でpushやpopがしたい!

Excelで繰り返し作業を行うときは、マクロが便利ですね。
「マクロの記録」ボタンを使えば初心者にも簡単にコードを扱えます。

でも、ちょっと複雑な作業を行おうとすると、マクロの記録だけでは難しい。
プログラムとしてVBAを学ぶ必要が出てきます。

ただ、そこで残念なのはVBAの言語設計が古い事です。
現在主流のスクリプト言語ーJavaScript, Python, Ruby などーは本格的なオブジェクト指向で、多くの便利な機能を提供してくれます。

たとえば、配列の末尾に要素を追加する場合を考えてみましょう。
Rubyなら1行で終わりです。

myArray.push(newValue)

しかし、VBAだと…

newIndex = Ubound(myArray) + 1
ReDim Preserve myArray(newIndex)
myArray(newIndex) = newValue

…いかにも冗長で嫌になりますね!
でも、Excelでマクロを書くには、VBAを使うしかありません。
では、どうするか?


クラスモジュールを利用したカスタム配列クラスの実装

VBAは、クラスモジュールを使って独自のクラスを定義できます。
この機能を使って、Rubyのような便利な配列メソッドをVBAでも使えるように実装しました。

Dim numbers As ArrayCls, friends As ArrayCls, objects As ArrayCls

' createArray関数を使ってインスタンスを初期化します。

Set friends = createArray("John", "Mike", "Jane")
Set numbers = createArray(0, 5, 4, 3, 2, 1)

' オブジェクトも扱えます

Set objects = createArray(Application, ThisWorkbook, Err, Nothing)

' pop, push, sort などのメソッドが使えます。
    
Debug.Print friends.items(2)                     ' -> Jane
Debug.Print friends.pop                           ' -> Jane
Debug.Print friends.push("Mary").to_s        ' -> John, Mike, Mary
Debug.Print numbers.sort.to_s                   ' -> 0, 1, 2, 3, 4, 5

全てではありませんが、Rubyの主な配列メソッドを実装してあります。
ワークシート等を介する事なくオンメモリで動作しますので、オブジェクトも扱えます。
実際に私はこれを業務で使用していますが、開発効率が格段に上がりました。

ダウンロード

ご使用にあたって

β版です。お約束ですが、使用は自己責任にてお願いします(MIT/GPL License)。
バグには出来る限り対応致します。

ご意見はコメント欄またはTwitterまで。

ダウンロード
配列クラスモジュールセット
配列クラスモジュールインポート済みExcel2003ファイル
インストール方法・使い方
ドキュメント
よくある質問(質問募集中)

0 件のコメント:

コメントを投稿