今回のVBA超入門講座では配列について解説します。
配列を使うと文字列や数字など様々なデータを複数格納しておくことが出来ます。
配列はマクロを作るうえで、必ずと言っていい程よく使います。
「配列とは何か?」基礎から具体的な使い方まで分かりやすく解説します。
ぜひ最後までご覧ください。
配列とは
配列とは、文字列や数字など様々なデータを複数格納できる機能の事です。
変数と同じく、データを入れる箱の事です。
配列にデータを格納したり、格納したデータを参照する事ができます。
様々なデータを格納できるって変数でも出来ますよね?
そしたら変数で良いんじゃないですか?
良いところに気が付いたね!変数と似ているけど配列にしか出来ない特徴があるよ。
配列には次のような特徴があります。
- 1つの配列で複数の箱を一度に確保できる
- どの変数を参照するか、添え字で簡単に参照できる
- 後から箱の数を自由に増やせる
それでは、一つずつ見ていきましょう。
1つの配列で複数の箱を一度に確保できる
次のような表のデータを格納する場合を想定します。
変数を使う場合、次のようにデータの個数分の箱を用意しないといけません。
配列を使えば次のように数行で完結します。
配列を使えば、このように複数のデータも1つの配列の宣言で書くことができるよ。
見た目もかなりすっきりしますね。
イメージ的には変数がバラ売り。配列がセット売りみたいな感じかな。
変数の場合、データの個数分箱を用意するため、準備も管理も大変です。
一方、配列は1つのセットで複数の箱を用意できるため、準備も管理も簡単です!
データの個数が数個程度であれば変数のみで対応も可能ですが、数十~数千件のデータとなると変数のみではとても煩雑になります。
ぜひ配列を使いましょう。
どの変数を参照するか、添え字で簡単に参照できる
1つの配列で複数のデータを格納できるため、データを参照する場合は添え字で簡単に参照することが出来ます。
例えば、配列2つ目の「佐藤 B次郎」はstrStudent(1)、「田中 E美」はstrStudent(4)といった具合です。
添え字の具体的な使い方については後述します。
後から箱の数を自由に増やせる
変数では対応できない主な特徴の3つ目は「後から箱の数を自由に増やせる」です。
箱を5個用意していて、後でやっぱり10個必要になった!という場合も簡単に箱を増やすことが出来ます。
変数だとその都度、変数の定義(DIM)する必要がありますが、変数だとその操作が簡単です。
具体的なやり方については後述します。
配列の使い方
変数の特徴を簡単にご紹介したところで、配列の使い方について具体的に解説していきます。
配列の定義方法
VBAで変数を定義するときには「Dim」と「As」を使用して次のように記載します。
※データ型名の種類については第9回講座(DIM)の使い方を参照ください。
具体例を見てみましょう。
生徒名の表を配列に格納するマクロを作成してみます。
生徒名の配列(文字列)を定義する場合は以下のようになります。
この定義によって、まずデータを入れる空の箱が用意されます。
下限値を1、上限値を7としているため、1~7の7つの箱が用意されます。
データ格納方法
データの格納にはFor文を使うと簡単に記述が可能です。
VBAでは次のように記載します。
配列名(添え字) = 格納するデータ
next
先ほどの生徒の名簿を配列strStudent()に格納してみましょう。
1つずつ解説してきます。
添え字を定義する
配列には添え字(インデックス)が必須となります。
添え字とは「何番目の箱か」を表わす数値です。
1番目の箱はstrStudent(1)、6番目の箱はstrStudent(6)と指定します。
添え字(インデックス)は今回のVBAでは1からスタートするため、「Index = 1」をまず記載します。
ループ処理でデータ格納を行う
For文やDo~Loop文などのループ処理でデータ格納を行います。
今回の例では、2行目から8行目まで処理するため、For文を使って「For i = 2 To 8」で2から8までループ処理します。
データ格納
データを格納するには以下の記述をします。
今回の場合は、配列strStudentにデータを格納するため
strStudent(Index) = Cells(i, 1).Value
と記載します。
i行目、1列目のデータを配列strStudentに格納します。
添え字の値を増加する
1番目の箱、2番目の箱・・・7番目の箱と入れる箱の番号を増やすために、添え字Indexの値を増やしていきます。
「Index = Index + 1」と記述します。
これにより全ての箱にデータが格納されます。
これを忘れると、ずっと1番目の箱しか使われず1番目の箱のみに最後のデータが入るだけになってしまいます。
添え字(インデックス)を増やすことを忘れずに行いましょう。
配列のデータ取得方法
配列のデータを取得するには次のように記述します。
メッセージボックスをつかってデータの取得をする例を見てみましょう。
5番目の箱のデータ「田中E美」を取得してみます。
VBAでは次のように記載します。
実行すると次のメッセージボックスが表示されます。
添え字の下限値を省略する
配列は次のように定義すると解説しました。
この下限値は次のように省略可能です。
下限値を省略する場合、上限値のみを指定します。
下限値を省略した場合、添え字が0から開始されます。
ただし、添え字の上限値は省略できません。上限値を省略してデータ格納するとエラーとなります。上限値の設定は忘れずに行いましょう。
配列定義時に上限値の指定を行わなくても、次に紹介する上限値を後から定義する事も可能です。
データ格納前に上限値を定義すれば問題ありません。
配列定義時に上限値も省略する場合は次のように記述します。
添え字の下限値・上限値を後から定義する
添え字の下限値・上限値は後から定義(再定義)することが可能です。
再定義する場合は次のように記述します。
例を見てみましょう。
まず、下限値・上限値を省略して配列を準備します。
この箱を10個に増やす場合、次のように記述します。
これにより、箱が10個用意されます。
このようにReDimで再定義する場合も下限値は省略可能だよ。
下限値を省略された場合は添え字が0から開始されるよ。
再定義の注意点
便利な再定義ですが、1つ注意点があります。
それはデータが格納された状態でReDimで再定義すると、せっかく格納したデータがクリアされてしまいます。
具体例で解説します。
次のマクロを見てみましょう。
添え字番号Indexが1のとき、「Redim strStudent(Index)」で箱が1つ用意されます。
そして、「strStudent(Index) = Cells(i, 1).Value」で1番目の箱に「鈴木 A太郎」が格納されます。
次に、For文が1つ進んだとき、「i = 3」「Index = 2」となり、「Redim strStudent(Index)」で箱が2つになります。
このとき、1番目に入れたデータがクリアされてしまいます。
格納データを保持したまま上限値を増やす方法を解説します。
格納したデータを保持したまま上限値を増やす
一度格納したデータを保持したまま上限値を増やすには次のように記述します。
具体的で解説します。
次のマクロを見てみましょう。
添え字番号Indexが1のとき、「Redim strStudent(Index)」で箱が1つ用意されます。
そして、「strStudent(Index) = Cells(i, 1).Value」で1番目の箱に「鈴木 A太郎」が格納されます。
次に、For文が1つ進んだとき、「i = 3」「Index = 2」となり、「Redim Preserve strStudent(Index)」で箱が2つになります。
このとき、1番目の箱のデータを保持したまま2つ目の箱が用意されます。
このループ処理が最後まで進むと、1~7までの全ての箱にデータが格納されます。
Redim Preserve使用時の注意点
「Redim Preserve」を使うと上限値を増やすことが出来ますが、下限値は変更する事が出来ません。
すでに入っているデータより前の箱は用意できないからです。
上限値のみ増やす事が可能という事を覚えておきましょう。
要素数の習得
配列は要素数(箱の数)を取得する事ができます。
要素数を取得するには次のように記述します。
要素数が不明なときや、処理の途中で要素数を使いたい場合などに役立ちます。
まとめ
今回の講座では配列の使い方について解説しました。
- 1つの配列で複数の箱を確保できる
- 添え字で簡単にデータの参照が可能
- データを保持しながら要素数を後から要素数を増やすことができる
- 配列の要素数を取得することができる
変数と似ていますが、1つの配列で複数の定義が使用可能で、とても便利です。
配列使用時の注意点についても解説しました。
今回解説した配列は1次元配列と呼ばれるものです。
次回、2次元配列について解説します。
最後までお読みいただき、ありがとうございました!
~天然マクロ学校~
コメント