Visual Basic 6.0 初級講座
VB6対応

 

Visual Basic 中学校 > VB6 初級講座 >

第23回 コレクション

 

 

今回はVBの強力な機能である「コレクション」について説明します。今回説明するのは主にコレクションの利用法で、コレクションを作成する方法までは説明しません。

 

1.コレクションとは

 

コレクションとは配列に似たものです。実際「配列」の変わりに「コレクション」を使うこともできます。ただここで「配列」と「コレクション」の違いを説明していってもイメージが湧かないと思いますので今回はいきなりサンプルを打ち込んでいただいてから説明することにしましょう。

フォームにコマンドボタンを3つ配置してください。名前や位置などはすべてご自由にしてください。

次にフォームのクリックイベントに次のように記述してください。

Private Sub Form_Click()

Dim ob As Object

For Each ob In Me.Controls

ob.Caption = "成功!"

Next ob

End Sub

打ち込み終わったら実行してフォームをクリックしてみてください。エラーがなければコマンドボタンの文字(キャプション)がすべて「成功!」になるはずです。

コレクションの最大の利点はこのように「まとまりに対して命令できる」という点にあると思います(この意見には異論のある人もいるかもしれませんが、どのみちほかの利用方法もちゃんと説明しますから安心してください)。

さて、上の例ではどれが「コレクション」なのでしょうか。答えは、Controls (読み方:Controls = コントロールズ) です。この例はControlsコレクションに対してループをまわす例なのです。Me.Controlsとなっているのでこの場合のControlsコレクションはフォームに配置されているすべてのコントロールを指します。たとえば、コマンドボタンのほかにラベルを配置したとしましょう。そうすると新たにラベルがControlsコレクションに加わるのでコードを1行も修正しないで先ほどと同じことができます。

試してみてください。確かに新たに配置したラベルのキャプションも「成功!」に変わるでしょう。

もう少し詳しく説明しましょう。For EachNext はコレクションに対してループ処理をする場合に使う文です。そして、Controlsコレクションは文字通りコントロールの集合ですからFor Eachに続く部分にはコントロールを格納できる変数を用意する必要があります。この例ではObject型の変数Obを用意しました。

これで、For EachNext ループでControlsコレクションに属するコントロールがひとつずつ取り出されてObに格納されるわけです。

さて、「配列」とコレクションの違いはなんとなく実感していただけたのではないでしょうか?

 

2.コントロール配列とコレクション

 

コントロール配列は名前からすると「配列」ですが実は「コレクション」です。そのため上で説明したのと同じ方法でコントロール配列全体に対して命令を出すことができます。

ラベルを使った例でこのことを証明してみましょう。まず、いくつかのラベルをコントロール配列にして配置してください。名前はlblTestsにします。コントロール配列のことが良くわからない方は第20回 配列2 コントロール配列をご覧下さい。但し、このページの他の節ではコントロール配列の知識は必要ないのでこの部分だけ飛ばして読むこともできます。

さて、ラベルの配置が完了したらボタンを1つ配置して次のようにプログラムしてください。

Private Sub Command1_Click()

Dim o As Label

For Each o In LblTests

o.BackColor = vbRed

Next o

End Sub

これで完了です。実行してコマンドボタンをクリックするとlblTestsに属するすべてのラベルの色が赤になります。ラベルがいくつあっても同じです。単純な例ですがいろいろ役に立ちそうだと感じられることでしょう。

念のためにもうひとつラベルを配置してみてください。今度はコントロール配列にしないで名前は適当に付けてください。実行するとそのラベルの色は変化しないことが確認できます。このようにコントロール配列はコレクションという観点からグループ化して制御することができるのです。

 

3.添字(そえじ)(インデックス)

 

以上の例ではコレクションに属する「物(コントロール)」をまとめて扱う方法を説明しました。最初はフォーム上のコントロールすべてが属しているControlsコレクション、次はコントロール配列になっているコレクション。これだけでもコレクションが便利なことがわかりますがコレクションの機能は他にもあります。

まず、最初に「コレクションは配列に似たものです」と書いたことを思い出してください。このことから想像できるようにコレクションは添字(そえじ)(インデックス)を使ってその要素にアクセスできます。たとえば、Controls(1)と書くとControlsコレクションに属している1番目の要素(メンバー)を指すことになります。

何が1番目の要素なのかControlsコレクションではわかりにくいと思います。というのはControlsコレクションは自動的に作られているコレクションだからです。でもためしに次のコードを実行して見てください。


MsgBox Me.Controls(1).Name
 

Controlsコレクションに属している1番目の要素の名前が表示されてます。(フォームに何も配置されていない場合はエラーになります)。

なお、配列の添字は0から始まりますが、コレクションの場合は1から始まるので注意してください。

この添字使う方法はControlsコレクションではあまり役に立ちませんがその他のコレクション、たとえばコントロール配列などでは非常に有効です。

 

4.キー

 

コレクションには配列にはない「キー」という機能が提供されています。この機能を実際に使ってみましょう。

次のコードを打ち込んでください。

Private Sub Command1_Click()

Dim colMine As Collection

Set colMine = New Collection

colMine.Add "源頼朝", "鎌倉幕府"

colMine.Add "足利尊氏", "室町幕府"

colMine.Add "徳川家康", "江戸幕府"

colMine.Add "神武天皇", "朝廷"

colMine.Add "伊藤博文", "内閣"

MsgBox colMine(1)

End Sub

このプログラムを実行すると、 源頼朝 と表示されるはずですがそれだけではこのプログラムが何をやっているかわからないと思いますので説明します。

Dim colMine As Collectionは今まで出てきたDim文と同じで変数を宣言するものです。ここではcolMineというコレクションを宣言しています。このように自分で空のコレクションを作成することもできます。

次のSet colMine = New Collectionでは、宣言したcolMineに実際のコレクションを代入しています。このコードを記述しないとcolMineは実体のないコレクションとなり使用することはできません。コレクションに限らずすべてのオブジェクト変数は宣言した後に実体化(インスタンシング)しないと使用することができません。インスタンシングするにはこの例のようにNewキーワードを使用 することが多いです。なお、Dim文で Dim colMine As New Collectionのように記述すると宣言と実体化(インスタンシング)を同時に行うことができますが性能が悪くなるのでお勧めしません。

以下のcolMine.Addはすべてコレクションに要素を追加しています。5つのAddメソッドが実行されているので5つの要素が追加されます。このコードを実行した段階でcolMineコレクションには次の5つの要素が追加されます。

源頼朝,  足利尊氏,  徳川家康,  神武天皇,  伊藤博文

そのためこの後の MsgBox colMine(1) で 源頼朝 と表示されるわけです。だから、もしこれがMsgBox colMine(2)だったら足利尊氏と表示されるわけです。

ここまでは配列もコレクションも大差ありませんがコレクションの「キー」の威力を説明するのはこれからです。

Addメソッドを使ったときに「源頼朝」や「足利尊氏」などの要素のほかに「鎌倉幕府」や「室町幕府」などの文字列を指定しています。これらの文字列が「キー」と呼ばれるものです。(Addメソッドではキーは省略できるので特に必要がなければキーを指定する必要はありません。)

コレクションでは添字の他にこのキーを使ってここの要素にアクセスすることができます。たとえば、MsgBox colMine("江戸幕府") とすると 徳川家康 と表示されます。これがキーの機能です。

 

5.その他

 

コレクションはオブジェクトなのでメソッドやプロパティを備えています。すでにAddメソッドが登場していますが他にどんなメソッドやプロパティがあるか簡単に説明します。

Countプロパティ

コレクションに属している要素の数を返します。たとえば、MsgBox Me.Controls.Count とするとフォームに配置されているコントロールの数が表示されます。

Removeメソッド

コレクションから要素を1つ削除します。削除するメンバーは添字(インデックス)かキーで指定します。

Itemメソッド

コレクションの要素にアクセスします。このメソッドは省略できるので通常省略します。このため次の2つは同じ意味です。

colMine.Item("内閣")

colMine("内閣")

さらに ! を使って次のように記述することもできます。これも同じ意味です。

colMine!内閣

ただし、記号 ! はあまり一般的ではありませんし、VBの型チェック機能が有効に働かないなどデメリットもありますので、使用しないことをお勧めします。

なお、配列でも同様の処理ができますがこれらの処理の性能はコレクションのほうが上です。

 

6.これからは

 

コレクションを今回始めて知った方はこれからVBの説明を読むときによく注意してください。「コレクション」という言葉は結構良く出てきます。「このオブジェクトはコレクションである」と記述されている場合そのオブジェクトは今回説明したコレクションの機能をすべて備えているということを意味します。とりわけ、そのオブジェクトに対してはFor EachNextが有効であるという点は重要です。

また、あるオブジェクトがコレクションであるとされている場合「何のコレクションなのか」という点にも注意が必要です。あらかじめ用意されているコレクションはたいていはじめから意味のある集合を表しています。

たとえば、今回出てきたControlsコレクションは「フォームに配置されているコントロールのコレクション」でした。他の例はFileSystemObjectなど標準でないオブジェクトに豊富です。このFileSystemObjectにはファイルの集合をあらわすFilesコレクションやフォルダの集合をあらわすFoldersコレクションなどがあります。

VB中級者以上の方はコレクションを利用するだけでなく積極的に作成することも重要ですがコレクションの作成についてはまたの機会に説明します。

それから、最後になりますがコレクションをさらに拡張したDictionary(ディクショナリ)というオブジェクトもありますので興味のある方、コレクションの機能に不満のある方は調べてみてください。Dictionaryオブジェクトを使用するにはMicrosoft Scripting Runtimeの参照が必要です。

それでは今回は失礼します。