.NET FrameworkのArrayListを使うには

VBAでは.NET Frameworkの一部のクラスを利用することが出来ます。

利用するにはWindowsもしくはExcelのバージョンによってはVBAで参照設定が必要です。

VBA画面のツールメニュー→参照設定で以下の選択もしくは参照してください。
C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscorlib.tlb(dllではありません)
Microsoft Common Language Runtime Class Library

なお私の環境では参照設定不要です。設定してもチェックが表示されません。

mscorlib.dllはWindows 7の以下の環境にて動作確認を行っています。

.NET Frameworkのバージョンによって参照設定できるものもあります。

私の環境の最新バージョンは上記のとおりv4.0.30319ですが、v2.0.50727のを参照するとチェックが付きます。

v2.0.50727の参照設定をするとCreateObject関数を使わなくてもよくなります。

ただ、.を押してもメソッドやプロパティの候補は出ません。候補は出ませんが、メソッドやプロパティを手で書けばはちゃんと動作します。

参照設定するべきなのか、そうでないのか、などはOSや64bitかどうかも関係するようですが、よくわかりませんでした。

なので、以下はそういう「動けばいいんだよ」精神なのをご了承ください。

ArrayListのオブジェクト変数の作成方法

.NET FrameworkのArrayListのオブジェクト変数の作成はCreateObject関数にて行います。

元の変数はObject型で定義していますが、Variant型でも構いません。

どちらもCreateObject関数で成功すると内部定義はArrayList型になります。

CreateObject関数のあとは必要に応じてArrayListクラスのメソッドやプロパティを利用します。

Microsoftのヘルプは以下になります。(2018/5/31確認済み)
https://msdn.microsoft.com/ja-jp/library/system.collections.arraylist(v=vs.110).aspx

以下で2通りの使い方を紹介します。

1つ目はCreateObject関数を使ってそのまま使う方法です。

2つ目はArrayList用のクラスを用意して使う方法です。

CreateObject関数を使ってそのまま使う方法

一般的に紹介される方法はこちらだと思います。CreateObject関数を使ってインスタンスを作成して、あとはメソッドやプロパティを利用するコーディング方法です。

この方法で利用は可能ですが、メソッドやプロパティのメンバが見えない欠点があります。

使えればOKという場合はこちらでもいいです。

 

ArrayLlst用のクラスモジュールを用意する方法

ArrayListのメンバを明示するためにクラス化する方法です。

邪道と言われるかもしれませんが、プロパティやメソッドの入力がラクになり使い勝手が良くなります。

この方法はクラスモジュールと利用する側のモジュールを分けます。

まずクラスモジュールを作ります。クラス名はDNetArrayListです。

ArrayListのメソッドやプロパティを自作クラスのメンバ化するのが面倒な場合もあったりするので3行目のArrayListのインスタンスの変数arはPrivateではなくPublicにしています。 そのため上のコードのように直接使うことも可能です。

利用する側のモジュールはDNetArrayListクラスでなければ標準モジュールでもフォームモジュールでもなんでもいいです。

クラスモジュール:DNetArrayList

Microsoftのヘルプに書いてある全メンバは実装していません。必要最低限のプロパティやメソッドのみを実装しています。

追加したいプロパティやメソッドがある場合はクラスに追加するか、3行目の変数arに対して直接プロパティやメソッドを使ってください。

変数arに対して直接コーディングする方法は後述の利用例を参考にしてください。

DNetArrayListクラス利用例

コード自体は上の直接コーディングする方法とほとんど同じです。ただいくつか異なります。

2行目と4行目の型がObject型ではなくDNetArrayListクラスになっています。

また、CreateObject関数はクラス側に実装しているため利用するコードには不要なため存在しません。

40行目はクラスのプロパティ変数に対して直接Addメソッドを行っています。クラスに未実装のプロパティやメソッドを使いたい場合はこのような使い方も可能です。