エクセルVBA超入門講座(第12回)配列の使い方

excel-vba-lecture12 Excelマクロ

今回のVBA超入門講座では配列について解説します。

配列を使うと文字列や数字など様々なデータを複数格納しておくことが出来ます。

配列はマクロを作るうえで、必ずと言っていい程よく使います。

「配列とは何か?」基礎から具体的な使い方まで分かりやすく解説します。

ぜひ最後までご覧ください。

配列とは

配列とは、文字列や数字など様々なデータを複数格納できる機能の事です。

変数と同じく、データを入れる箱の事です。

配列にデータを格納したり、格納したデータを参照する事ができます。

たけし
たけし

様々なデータを格納できるって変数でも出来ますよね?

そしたら変数で良いんじゃないですか?

天馬先生
天馬先生

良いところに気が付いたね!変数と似ているけど配列にしか出来ない特徴があるよ。

配列には次のような特徴があります。

  • 1つの配列で複数の箱を一度に確保できる
  • どの変数を参照するか、添え字で簡単に参照できる
  • 後から箱の数を自由に増やせる

それでは、一つずつ見ていきましょう。

1つの配列で複数の箱を一度に確保できる

次のような表のデータを格納する場合を想定します。

student-list

変数を使う場合、次のようにデータの個数分の箱を用意しないといけません。

set-student-list

配列を使えば次のように数行で完結します。

set-student-list2

天馬先生
天馬先生

配列を使えば、このように複数のデータも1つの配列の宣言で書くことができるよ。

 

たけし
たけし

見た目もかなりすっきりしますね。

天馬先生
天馬先生

イメージ的には変数がバラ売り。配列がセット売りみたいな感じかな。

変数の場合、データの個数分箱を用意するため、準備も管理も大変です。

individual-box

一方、配列は1つのセットで複数の箱を用意できるため、準備も管理も簡単です!

layout-box3

データの個数が数個程度であれば変数のみで対応も可能ですが、数十~数千件のデータとなると変数のみではとても煩雑になります。

ぜひ配列を使いましょう。

どの変数を参照するか、添え字で簡単に参照できる

1つの配列で複数のデータを格納できるため、データを参照する場合は添え字で簡単に参照することが出来ます。

student-list

例えば、配列2つ目の「佐藤 B次郎」はstrStudent(1)、「田中 E美」はstrStudent(4)といった具合です。

添え字の具体的な使い方については後述します。

後から箱の数を自由に増やせる

変数では対応できない主な特徴の3つ目は「後から箱の数を自由に増やせる」です。

箱を5個用意していて、後でやっぱり10個必要になった!という場合も簡単に箱を増やすことが出来ます。

変数だとその都度、変数の定義(DIM)する必要がありますが、変数だとその操作が簡単です。

layout-box4

具体的なやり方については後述します。

配列の使い方

変数の特徴を簡単にご紹介したところで、配列の使い方について具体的に解説していきます。

配列の定義方法

VBAで変数を定義するときには「Dim」と「As」を使用して次のように記載します。

Dim 配列名([下限値] to [上限値]) As データ型名

※データ型名の種類については第9回講座(DIM)の使い方を参照ください。

具体例を見てみましょう。

生徒名の表を配列に格納するマクロを作成してみます。

student-list

生徒名の配列(文字列)を定義する場合は以下のようになります。

Dim strStudent(1 to 7) As String

この定義によって、まずデータを入れる空の箱が用意されます。

下限値を1、上限値を7としているため、1~7の7つの箱が用意されます。

layout-box14

データ格納方法

データの格納にはFor文を使うと簡単に記述が可能です。

VBAでは次のように記載します。

For 変数 = 開始数値 to 終了数値
    配列名(添え字) = 格納するデータ
next

先ほどの生徒の名簿を配列strStudent()に格納してみましょう。

set-student-list3

1つずつ解説してきます。

添え字を定義する

配列には添え字(インデックス)が必須となります。

添え字とは「何番目の箱か」を表わす数値です。

layout-box5

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」と記述します。

これにより全ての箱にデータが格納されます。

layout-box6

これを忘れると、ずっと1番目の箱しか使われず1番目の箱のみに最後のデータが入るだけになってしまいます。

layout-box7

添え字(インデックス)を増やすことを忘れずに行いましょう。

配列のデータ取得方法

配列のデータを取得するには次のように記述します。

配列名(添え字)

メッセージボックスをつかってデータの取得をする例を見てみましょう。

5番目の箱のデータ「田中E美」を取得してみます。

VBAでは次のように記載します。

MsgBox “5番目のデータは ” & strStudent(5) & ” です”

実行すると次のメッセージボックスが表示されます。

msgbox-student05

添え字の下限値を省略する

配列は次のように定義すると解説しました。

Dim 配列名([下限値] to [上限値]) As データ型名

この下限値は次のように省略可能です。

Dim strStudent(6) As String

下限値を省略する場合、上限値のみを指定します。

下限値を省略した場合、添え字が0から開始されます。

layout-box8

ただし、添え字の上限値は省略できません。上限値を省略してデータ格納するとエラーとなります。上限値の設定は忘れずに行いましょう。

index-error

配列定義時に上限値の指定を行わなくても、次に紹介する上限値を後から定義する事も可能です。

データ格納前に上限値を定義すれば問題ありません。

配列定義時に上限値も省略する場合は次のように記述します。

Dim strStudent() As String

添え字の下限値・上限値を後から定義する

添え字の下限値・上限値は後から定義(再定義)することが可能です。

再定義する場合は次のように記述します。

ReDim 配列名([下限値] to [上限値]) As データ型名

例を見てみましょう。

まず、下限値・上限値を省略して配列を準備します。

Dim strStudent() As String

この箱を10個に増やす場合、次のように記述します。

ReDim strStudent(1 to 10) As String

これにより、箱が10個用意されます。

layout-box10

天馬先生
天馬先生

このようにReDimで再定義する場合も下限値は省略可能だよ。

下限値を省略された場合は添え字が0から開始されるよ。

再定義の注意点

便利な再定義ですが、1つ注意点があります。

それはデータが格納された状態でReDimで再定義すると、せっかく格納したデータがクリアされてしまいます。

具体例で解説します。

次のマクロを見てみましょう。

set-student-list4

添え字番号Indexが1のとき、「Redim strStudent(Index)」で箱が1つ用意されます。

そして、「strStudent(Index) = Cells(i, 1).Value」で1番目の箱に「鈴木 A太郎」が格納されます。

layout-box11

次に、For文が1つ進んだとき、「i = 3」「Index = 2」となり、「Redim strStudent(Index)」で箱が2つになります。

このとき、1番目に入れたデータがクリアされてしまいます。

格納データを保持したまま上限値を増やす方法を解説します。

格納したデータを保持したまま上限値を増やす

一度格納したデータを保持したまま上限値を増やすには次のように記述します。

ReDim Preserve 配列名([下限値] to [上限値]) As データ型名

具体的で解説します。

次のマクロを見てみましょう。

set-student-list5

添え字番号Indexが1のとき、「Redim strStudent(Index)」で箱が1つ用意されます。

そして、「strStudent(Index) = Cells(i, 1).Value」で1番目の箱に「鈴木 A太郎」が格納されます。

layout-box11

次に、For文が1つ進んだとき、「i = 3」「Index = 2」となり、「Redim Preserve strStudent(Index)」で箱が2つになります。

このとき、1番目の箱のデータを保持したまま2つ目の箱が用意されます。

layout-box13

このループ処理が最後まで進むと、1~7までの全ての箱にデータが格納されます。

layout-box6

Redim Preserve使用時の注意点

「Redim Preserve」を使うと上限値を増やすことが出来ますが、下限値は変更する事が出来ません

すでに入っているデータより前の箱は用意できないからです。

上限値のみ増やす事が可能という事を覚えておきましょう。

要素数の習得

配列は要素数(箱の数)を取得する事ができます。

要素数を取得するには次のように記述します。

UBound(配列名)

要素数が不明なときや、処理の途中で要素数を使いたい場合などに役立ちます。

まとめ

今回の講座では配列の使い方について解説しました。

  • 1つの配列で複数の箱を確保できる
  • 添え字で簡単にデータの参照が可能
  • データを保持しながら要素数を後から要素数を増やすことができる
  • 配列の要素数を取得することができる

変数と似ていますが、1つの配列で複数の定義が使用可能で、とても便利です。

配列使用時の注意点についても解説しました。

今回解説した配列は1次元配列と呼ばれるものです。

次回、2次元配列について解説します。

最後までお読みいただき、ありがとうございました!

~天然マクロ学校~

コメント

タイトルとURLをコピーしました