今回は「構造体と配列の違い」について説明します。なおそもそも構造体や配列についてわからない方に対してもなるべくわかりやすく説明します。
この記事はしゃあ@VBA07529852さんの勉強会で学んだVBAにおける構造体と配列について私なりにまとめたものです。
構造体や配列を理解すればプログラミングの幅がより広がりますのでこの記事で理解していってください。
配列と構造体
配列と構造体について調べると以下のような説明が出てきます。
どちらも複数の値を格納できるということは共通しています。
なお一つ一つの値のことをどちらも要素やメンバーといいます。
では何が違うのか?について次にまとめます。
(ちなみにVBAにおいては構造体を「ユーザー定義型」といいます。どちらも同じ意味なのでここでは構造体として説明します)
配列と構造体の特徴
配列と構造体の特徴についてまとめると以下になります。
次からは例を用いて詳しく説明していきます。
一次元の場合
まずは例として一人の社員情報の表(一次元配列)について考えます。
ここには社員名、年齢、性別などの複数の情報が載っています。これを配列、構造体で扱うことを考えます。
配列
図に表すと以下のようになります。
配列では一つ一つの箱にインデックスをつけてその中に値を格納します。
インデックスとは箱につける添え字のことで、その中に先ほどの社員の情報を入れていくイメージです。
なお箱には同じデータの型しか入れることができないというルールがあります。
この例だと「文字列型」の名前と「整数型」の年齢を同じ配列に入れることはできません。
ただし例外として配列の型にVariantを指定すると何でも入れられるようになります。
その為今回はVariant型で考えていきます。
構造体
構造体では1つ1つの箱に名前を付けてその中に値を格納していきます。図にすると以下のイメージです。
この例ではNameという箱、Ageという箱、Genderという箱をつけています。順番は自由です。
名前を付けることでどの箱にどの情報を入っているかがわかりやすくなります。
配列の場合は0,1,2,3,4という数字だけの為中に入っている情報がわかりにくく、特定の情報を抜き出すには一つ一つ覚えておかないといけません。
構造体の場合は情報を追加された場合も名前を定義するだけで簡単に追加することができます。
配列の場合は途中に追加されると番号がずれたりするので構造が変わるテーブルに対しては使いにくいです。
また各要素の型は個別に定義することができます。
構造体ではそれぞれの箱に入る型を指定することができます。
これにより中に入っている型を明確に定義でき、間違いが少なくなります。
配列はVariantか単一の型しか指定できないので中に入っている情報を確認しにくくなります。
その為配列はすべての情報をひとまとめに取得してひとまとめに出力するような処理に向いています。
なお構造体は図の「Shaintype」に当たり、単体では用いることができません。構造体のまとまりを変数や配列として定義することで使用できるようになります(構造体変数、構造体配列といいます)。図にすると以下のイメージになります。
この場合の配列と構造体のコードは以下のようになります。
構造体ではまとまりを変数として定義するのでまとまりとその要素という形で考えることができます。
Rangeオブジェクトに対するプロパティのような考え方がしっくりくるかもしれません。(Range(“A1”).ValueやRange(“A1”).FontColorなど)
二次元の場合
次は社員数が増えた場合を想定します。
配列
二次元配列の場合はインデックスが増えます。ワークシートのCells(1,2)と同じような表記の仕方をします。
増えた社員の情報をまとめて格納することが可能です。
ただこの場合もVariant型で入ることになり、中に何が入っているかは不定です。
また箱の名前はあくまでインデックス番号なのでどの列に何が入っているかはよくわかりません。
構造体
構造体で複数の社員数に対応する場合は配列を用います。
図のShainの部分が配列になっています。構造体を持つ配列なので構造体配列といいます。
構造体の場合は構造体変数で1次元配列、構造体配列で2次元配列のような形にすることができます。
社員は配列により増えましたが個々の社員の情報はまとめられていることがわかっていただけるかと思います。
高次元の場合
次にさらに部門や課の情報を追加された場合を想定します。
配列
配列の場合は二次元配列で部や課を含める方法、三次元、四次元配列で含める方法などがあります。図にすると以下のようなイメージです。
しかしこの方法では部や課など列内で重複している情報なども複数入ってしまったり、それぞれの要素の関連性はまったくわかりません。
配列は大きなまとまりとしてとる場合に適しています。
構造体
一方構造体では構造体変数や構造体配列を用いてを入れ子構造にできるという特徴があります。
以下の例では社員を表す構造体配列を課の構造体に入れ子にしています。
この方法で課に属した社員の情報をまとめることができます。
また部が持つ要素(ここではNameやNumOfShain(部の社員数))を単独で指定することも可能です。
わかりやすくすると以下のようになります。
部の構造体の中に社員の構造体があるのがわかっていただけると思います。
なおさらに部の構造体を作ることも可能です。
具体的には以下のようになります。
部の構造体変数を部門の構造体に入れ子にすることで部門に属する課の情報をまとめることができます。また課に属する社員の情報もまとめることができます。
これが構造体の最も大きな特徴です。
まとまりをまたまとめるという「ツリー構造」にすることができる為複雑なデータ処理に向いています。
「データをひとまとめにしてしか取れない」配列には難しい操作でこれが構造体を用いる一番のメリットということができます。
ここでのまとめ
配列と構造体の違いをまとめると以下のようになります。
配列 | 構造体 | |
値の識別方法 | インデックス | ユーザーが決めた名称 |
格納できる型 | 一つのみ (Variantを除く) | ユーザーが決めた型 |
使用方法(例) | d(4) As String | Shain As ShainData (構造体として定義したうえで変数として用いる) |
拡張方法 | 多次元配列 | 構造体の入れ子構造 |
配列はデータをひとまとめに取ってきてひとまとめに処理する方法に向いています。
一方構造体は複雑なデータを処理する際に有用です。
処理方法に合わせて使っていってもらえれば幸いです。
コメント