配列変数を使いたい(VBAの「配列」を基礎の基礎から応用まで丁寧に解説)初歩的配列から連想配列まで-Excel VBA Tips

初心者のためのExcel VBA

Excel VBAにおける配列の使い方

Excel VBAに限らず配列はプログラミングをする上で避けては通れないものです

このページでは、配列変数の使い方を基礎から丁寧に解説します

配列とは何か

普通の変数を「一戸建て」だとすると、配列は「マンション」のようなものです。

普通の変数には値を1つしか設定できませんが、配列変数には複数の値を入れることができます

[スポンサードリンク]

下記の画像は配列のイメージ図です。

配列のイメージ図

上図の「配列変数のイメージ」をよく見てみると、配列変数の各部屋の下に、

0,1,2,3,4,5,6,7」という番号がふってありますね。

普通の変数は一軒家ですから、格納できるデータも1つですし、マンションのように部屋番号は必要ありません。

ですが、配列はマンションのようなものなので、101号室、102号室などと、1つ1つの「箱」に「部屋番号」をふってあげる必要があります

もし部屋番号がないと、例えば、「配列変数イメージ図」の中の、「データ3」が入っている部屋(=部屋番号が【2】の箱)に訪問したいと思っても、訪問できなくなってしまいます。

配列の部屋番号はマンションのような「203」みたいな値ではなく、「0」、「1」、「2」といった数値なんです。配列マンションでは、左から順番に0,1,2,3、…、7という風に【0からはじまる連続した数値】で配列変数内の各部屋に部屋番号をつけていく決まりになっています。

このような番号付けのルールは配列界の鉄の掟なんです

(↑※但し稀に例外あり。1から始まるケースも存在する…)

ここで注意すべきことは、

配列マンションの最初の部屋の部屋番号は必ず「0」になるという点です

※但し、配列の部屋番号が「1」から始まるケースも稀に存在します。

配列変数の宣言

Excel VBAでは下記の書式で配列変数を宣言します。

【数値】は「その配列の最後の部屋番号」を表します。

例えば、Dim a(3) As Integerという配列は、整数型の配列なのですが、この配列にはいったい「いくつの整数」を入れることができるでしょうか???

結論から言うと、4つです。3つではありません!

この結果は直観に反するかもしれませんが、下図をご覧いただければ理解しやすいと思います。

VBAの配列の要素数と宣言時に指定する数値の関係図

そうなんです! 💡 配列変数を宣言するときに、指定する数値は、その配列に「何個のデータを入れることができるか?」ではなく、「最後の部屋番号」なんです 💡 。

ちなみに、「ある配列に何個の値を入れることができるか?」のことを、
配列の要素数」と呼びます。要は配列の部屋数のことですね。

従って、例えば、Dim b(10) As Stringと書いた場合、配列変数「b()」の要素数は、10+1個です。

つまり配列の要素数は「配列を宣言したときに指定した数値+1」なのです。

例1:文字列型の配列、要素数は6

Dim ary(5) As String

上記の配列変数「ary()という配列は6個の文字列型のデータを格納することができます。

例2:Rangeオブジェクト型の配列、要素数は16

Dim ary(15) As Range

上記の配列変数「ary()には16個のセル(Rangeオブジェクト)を格納することができます。

配列への理解を深めるために、下記にごく初歩的な配列のサンプルプログラムを示します。

[スポンサードリンク]

簡単なサンプルプログラムで実際に配列変数を使ってみよう!

まずは配列の初歩の初歩とも言える、ごく簡単なサンプルプログラムを見てみましょう。

とありますから、配列変数「ary(2)」には3つの部屋があります。また、配列変数の部屋番号は、0から始まって1,2と連続した数値で表すという鉄則がありましたね。

配列変数「ary(2)」のイメージをざっくり図示するとこんな感じになります。

配列のイメージ図-2

で、配列の各部屋に具体的な値を入れるには、

と書きます。なので、配列変数「ary()」の0号室に値を代入するには、

ary(0) = “iPhone4”

と書きます。

で、上記のコードでは、Cells(1, 1)つまりA1セルにary(0)に入っている値を入れています。ary(0)の中身は“iPhone4”ですから、A1セルには「iPhone4」という文字列データが入ります。

このサンプルプログラムの実行前のExcel画面は下記になります。

配列の基礎の基礎-1

で、サンプルプログラムを実行すると、A1セルにary(0)の持っている値が入り
A2セルにary(1)の持っている値が入り、A3セルにary(2)の持っている値が入るので、
このサンプルプログラムの実行結果は下記のようになります。

配列の基礎の基礎-実行結果

で、ary(0)の「0」やary(1)の「1」等を、今まで説明の都合上、「部屋番号」と呼んできましたが、こういった番号のことを一般に「添え字(そえじ)」と呼びます。

尚、例外的に添え字が「0」からではなく「1」から始まる配列も、ごく稀に存在しています。要注意ですね!

配列を使うと何が嬉しいの?

配列を使うメリットを理解するために、まずは下記の「配列を使わない版サンプルプログラム」をご覧下さい。

その後「配列を使った版サンプルプログラム」と見比べてみると、配列の持つパワーを実感できると思います。

配列を使わない版サンプルプログラム

このサンプルプログラムはA1セル[Cells(1, 1)]~A12セル[Cells(1, 12)]に対して、上から順番に、1月、2月、3月、…、12月と入力するマクロです。

【実行結果】

配列のサンプルプログラムの実行結果

ただ単にA1セル~A12セルに1月~12月を入力するだけのマクロなのに、なんて長くてめんどうで、センスの無いコードなのでしょう!!!

ではこの長ったらしい割りに、役に立つ機能の無いサンプルプログラムを「配列を使った版サンプルプログラム」で書き換えてみます。

すると、あら不思議!配列がいかに強力な武器になるのかが一目瞭然です!!!

[スポンサードリンク]

配列を使った版サンプルプログラム

尚、このサンプルプログラムの実行結果は「配列を使わない版サンプルプログラム」と全く同じです

先に【実行結果】画像を掲載します。

配列のサンプルプログラムの実行結果

なんと!配列を使ったら、めっちゃスッキリしました!!

さて、簡単にこのサンプルプログラムの流れを解説致します。

文字列型の配列変数「month(11)」は、

month(0)に“1月”、month(1)に“2月”、month(2)に“3月”・・・month(11)に“12月”

をそれぞれ格納するためのものです。

となっているので、カウンタ変数「i」の値は、For-Nextループを1周するたびに、

0,1,2,3,4,5,6,7,8,9,10,11

と変化していき、For-Nextループは12週します。

従って、

は、Forループの1週目では、month(0) = 0 + 1 & “月”となり、
結果的にmonth(0)には“1月”が格納されます。

同様に2週目では、month(1) = 1 + 1 & “月”となり、
結果的にmonth(1)には“2月”が格納されます。

この調子で12周目のループでは、month(11) = 11 + 1 & “月”となり、結果的に、
month(11)には“12月”が格納されます。。

その結果、配列変数month()は下図のような状態になります。

配列を用いたサンプルプログラムの実行結果

カウンタ変数「i」は「0,1,2,3,4,5,6,7,8,9,10,11」と変化していきますよね。

この行でやりたいことは、

A1セル=Cells(1, 1)A2セル=Cells(2, 1)・・・A12セル=Cells(12, 1)

という値を得ることなので、

i」に1を加算したものを、Cells(第1引数, 第2引数)の「第1引数」に指定しています。

従って、具体的な値の変化は下記のようになります。

Cells(0 + 1, 1) = month(0)、Cells(1 + 1, 1) = month(1)、Cells(2 + 1, 1) = month(2)

・・・Cells(11 + 1, 1)=month(11)

以上のプログラムの構造より、下図の結果が得られます。

配列のサンプルプログラムの実行結果

2つのサンプルプログラムの比較を通じて「配列という道具が、いかに強力で、頼もしい存在なのか」をご理解いただけたのではないでしょうか!? 😎

Variant型の変数とArray関数による配列の生成

Variant型の変数は「どんな値でも入れることができる万能の変数」です。

しかし、プログラミングにおいては、どんなデータ型の値でも入れることができてしまう変数ほど危険なものはありません

従ってVariant型の変数の使用は、極力、控えるべきです

しかし、これから紹介するArray関数Variant型の変数と組み合わせて用いるものなので、ここではVariant型の変数を解禁したいと思います。

Array関数は、指定した値を配列に変えて返す関数です

(例)vt = Array(“ネズミ”, “ウシ”, “トラ”)

Array関数のサンプルプログラム

ちなみに英語の「array(あれい)」は「配列」という意味です。

このサンプルプログラムは十二支、「子・丑・寅・卯・辰・巳・午・未・申・酉・戌・亥」をArray関数で配列に変換し、Variant型の変数「eto」に、この配列を代入した上で、
A1セル~A12セルに十二支を表示するマクロです。

【実行結果】

array関数のサンプルプログラム実行結果

Array関数を使って生成した配列をVariant型の変数に代入すると、配列を宣言しなくてもVariant型の変数(添え字)と書くだけで、Variant型の変数が配列の役目を果たします

上記の行では「Dim ary(最後の添え字の番号) As データ型」のように、配列変数を宣言しているわけではない点に注意して下さい。

動的配列

今まで解説した配列は「Dim ary(最後の添え字の番号) As データ型」という形式で、予め、これから使う配列変数に「何個のデータを入れるのか」を決めておく必要がありました

※注意※配列に入れられるデータの数は「最後の添え字の番号+1」個です。

このような「配列の長さを予め決めておく」ような配列変数を静的配列と呼びます。

しかし、配列変数を宣言する時点では、「いったい何個くらいデータを入れるスペースを用意しておけばいいのか」が分からない場合も少なくありません。

そんなとき、動的配列というものを使えば、配列に「何個のデータを入れるのか」が、分かった時点で、配列の要素数を指定することができて便利です

動的配列の使用方法

動的配列を使うには、配列を宣言する際に、「要素数」を空欄にします。そして、その配列に必要な要素数が判明した時点で、ReDimステートメントを用いて、配列の要素数を確定します。

(例1)動的配列の宣言

Dim ary() As データ型

上記の(例1)ではary()と、配列の変数の要素数の指定を省略していますね。

動的配列に必要な要素数が判明した時点で、ReDim ary(10)等と書き、要素数を確定させます。

尚、ReDimステートメント何度でも使用できます。例えば、プログラムの5行目で、配列の要素数が3個だと判明したら、ReDim ary(2)と書きますよね?

で、その後、プログラムの20行目で、「やっぱり配列の要素数は9個必要だ!」となった場合、改めて、ReDim ary(8)と書けばOKです 8-)!

動的配列のサンプルプログラム

下記画像のA1セル~A12セルの値を動的配列「ary()」に一旦格納した上で、ary()の中身を、
B1セル~B12セルに書き込むサンプルプログラムです。

結果的にはただ単に、A1:A12の値をB1:B12にコピーしているだけのあまり生産的ではないサンプルプログラムですが、動的配列を理解する助けにはなると思います。

動的配列のサンプルプログラム実行前の画面

【実行結果】

動的配列のサンプルプログラムの実行結果

UsedRangeプロパティは既に使用されているセル範囲を表すプロパティです。

SelectionプロパティUsedRangeプロパティで選択したセル範囲を表しています。

Rowsはセル範囲の「」を意味しますので、Countでセル範囲の行数を取得しています。

尚、行末で「-1」をしている理由は以下の通りです。

例えば、あるセル範囲の行数が5だった場合、5個のデータを格納できる配列にする必要があります5個のデータを格納できる配列は、配列変数(4)なので、
5行-1=配列の要素数となります。

配列の要素数を求める方法

配列の要素数は下記の式で求めることができます。

「最後の添え字」 – [最初の添え字] + 1

配列の要素数を算出する方法を図解すると下記のようになります。

vbaで配列の要素数を算出する方法

ある配列の「最初の添え字」を求めるには、LBound関数を使います。

一方、ある配列の「最後の添え字」を求めるには、UBound関数を使います。

(使用方法)LBound(配列変数)UBound(配列変数)

配列の要素数を求めた上で、配列の中身を一覧表示するサンプルプログラム

【実行結果】

配列の要素数を求めるサンプルプログラムの実行結果

連想配列

連想配列とは、添え字が「数値」ではなく、「文字列」の配列のことです。

例えばaryという配列変数があるとします。今まで解説してきた普通の配列は、
ary(0)、ary(3)のように、数値を利用して配列にしまってあるデータを呼び出しました。

これに対して、連想配列は、ary(“猫”)のように文字列でデータを呼び出すことができます。

VBAの連想配列の場合、データを「アイテム」、添え字を「キー」と呼びます

VBAで連想配列を使うにはCollectionオブジェクトを利用し、以下のように書きます。

Dim 連想配列名 As New Collection

(例)Dim ary As New Collection

連想配列に値を代入するにはAddメソッドを使って、下記のようにします。

連想配列.Add Item:=”アイテム”, Key:=”キー”

(例)ary.Add Item:=”8%”, Key:=”消費税”

上記の例で、ary(”消費税”)と書くと、“8%”という値が返ってきます。

つまり連想配列の「アイテム」を呼び出すには、連想配列(“キー”)と書きます。

VBAにおける連想配列のサンプルプログラム

まずは簡単なサンプルプログラムを通じて、VBAの連想配列の使い方を見てみましょう。

【実行結果】

vbaにおける連想配列のサンプルプログラムの実行結果

また、連想配列の一覧を取得するには以下のサンプルプログラムのようにします。

連想配列のアイテムを一覧表示するサンプルプログラム

【実行結果】

vbaで連想配列の値を一覧表示するサンプルプログラムの実行結果

 

関連項目

[スポンサードリンク]

1 件のコメント

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA