配列の使い方

かばくん

たくさんデータを扱うようになると、
変数を1つずつ定義すると、すごい数の変数が必要になります

へびせんせい

そういうときは配列を使いましょう。
変数では1つのデータしか格納できませんでしたが、配列なら複数のデータを扱えます。
同じ系統のデータは1つの配列にまとめるとスマートなコードが書けます。

Point!
配列とは、複数のデータを格納できる変数のようなもの

配列の基本構文

VBAにおけるforの使い方

配列の定義の方法

Dim 配列名(要素数) As 型名

配列の定義方法は、変数の定義方法と似ています。
変数名のあとに()をつけて、その中に、何個の要素数を扱うか、を数字で入力します。

配列の基本 サンプルコード

Sub 配列1()
  Dim box(3) As String
  
  box(1) = "みかん"
  box(2) = "りんご"
  box(3) = "ばなな"
    
  Cells(1, 1).Value = box(1)
  Cells(1, 2).Value = box(2)
  Cells(1, 3).Value = box(3)
End Sub

boxという配列を定義して、その配列の数は3つ、としてます。
自分で必要な数を考えて、配列を定義しましょう。

配列へのアクセス方法

配列の定義ができたら、次は配列の中にデータを格納してみます。
配列名の後の()の中に何番目の要素か(インデックス)を指定して、アクセスします。
上のサンプルコードでは、boxという配列の1番目にみかん、2番めにりんご、3番目にばななという文字列を格納しています。
そして、その値を使うときも、同様にbox(1)とすると、みかんという値が取り出せます。

Box(インデックス) = "データ"

実は、0番があるので配列には注意する

上の例では、boxという3つの要素をもつ配列を定義しているので、box(1),box(2),box(3)が使えるようになります。
ただしこの3つに加えて、実はbox(0)というデータも扱うことができます。
この0番目の要素は使っても良いし、使わなくても構いません。

box(3) As String
これは、box(0), box(1), box(2), box(3)の4つの要素が使える

なぜ0が存在するのか?
0番目の要素は、他のプログラミング言語では当たり前のように使われます。
少し、説明が難しいのですが、コンピューター上で演算するときは、0から始まったほうが扱いやすいのです。
しかし、VBAではセルを主に扱うことになります。 そして、セルの始まりはCells(1, 1)であり、1番目から始まります。
そのため、0番目よりも1番目から始まったほうが扱いやすいことが多いでしょう。
どちらかというと、Excelを扱うVBAが特殊なので、0番をあまり使わない傾向にあるのです。
もちろん好みにもよるので、0番を積極的に使ってもなんの問題もありません。

配列の応用・動的配列

多くの場合は、上記の配列の基本構文で問題をクリアできます。
ただし、主に次の2点の場合は動的配列という定義方法を使用することが必要になります。

・配列の大きさ(要素数)をプログラムの途中で変えたい場合
・配列の大きさ(要素数)を変数を使って定義したい場合

動的配列の使い方(プログラムの途中で配列の大きさを変える)

動的配列では、Dimを使って、配列を定義するときに、要素数を指定せずに定義します。
そのあとで、ReDimを使って、配列の大きさを指定(再定義)します。

Dim 配列名() As 型名
ReDim 配列名(5)
Sub 動的配列1()
  Dim box() As String
  
  ReDim box(3)
  
  box(1) = "みかん"
  box(2) = "りんご"
  box(3) = "ばなな"
    
  Cells(1, 1).Value = box(1)
  Cells(1, 2).Value = box(2)
  Cells(1, 3).Value = box(3)
End Sub

ReDimは何度でも使うことができます。
例えば、プログラムの途中でboxという配列に4つ目の要素が必要になったとします。
その場合でも、次のように途中でReDimステートメントを使って再定義することができます。

Sub 動的配列2()
  Dim box() As String
  
  ReDim box(3)
  
  box(1) = "みかん"
  box(2) = "りんご"
  box(3) = "ばなな"

  ReDim box(4)

  box(4) = "いちご"
    
  Cells(1, 1).Value = box(1)
  Cells(1, 2).Value = box(2)
  Cells(1, 3).Value = box(3)
  Cells(1, 4).Value = box(4)
End Sub

ただし、注意点があります。
途中でReDimを使うと、今まで格納されていたデータが消えてしまいます!
そのため、上の例では、boxの4番目にいちごという値が入ったのですが、1から3番目のデータは消えています。
今までのデータを保存したまま、配列の大きさを変えるには、ReDim Preserveステートメントを使います。

Sub 動的配列3()
  Dim box() As String
  
  ReDim box(3)
  
  box(1) = "みかん"
  box(2) = "りんご"
  box(3) = "ばなな"

  ReDim Preserve box(4)

  box(4) = "いちご"
    
  Cells(1, 1).Value = box(1)
  Cells(1, 2).Value = box(2)
  Cells(1, 3).Value = box(3)
  Cells(1, 4).Value = box(4)
End Sub

動的配列の使い方(配列の大きさを変数を使って定義する)

動的配列はこちらの方が使うケースは多いと思います。
配列の大きさを指定するときに、整数型の変数を使って定義することができます。

Sub 動的配列4()
  Dim num As Long
  Dim staff_list() As String
  
  num = 10
  
  ReDim staff_list(num)
  
  staff_list(1) = "すずき"
  
  MsgBox staff_list(1)
End Sub

例えば、スタッフの名前を格納するstaff_listという配列を作りたいとします。
そのとき、配列の大きさは全スタッフ人数ぶんの大きさ(要素数)があれば良いです。
そこで、整数型の変数に、全スタッフ人数を格納しておき、その変数を使って、配列の大きさを定義します。

配列はFor文と相性が良い

初めのうちは、いまいち配列の使い方が分からないと思います。
何度も繰り返して使う値は、配列を使うと上手くプログラムできることが多いです。
次の例は、曜日を配列に格納して、簡単な(縦1列の)カレンダーを作る例です。

Sub 配列とFor文()
  Dim day_list(7)
  Dim i

  day_list(0) = "日"
  day_list(1) = "月"
  day_list(2) = "火"
  day_list(3) = "水"
  day_list(4) = "木"
  day_list(5) = "金"
  day_list(6) = "土" 
  
  For i = 1 To 30
    Cells(i, 1).Value = i
    Cells(i, 2).Value = day_list(i Mod 7)
  Next
End Sub

配列day_listに曜日を格納しておき、Forのループで30回まわしています。
day_listは7までしか要素がないので、i Mod 7とすることで、0~6の範囲でインデックスがループすることになります。
こういった使い方ができると、配列をつくるメリットが生まれてきます。
*上のコードでは型の指定をせず、Variant型を使ってます


配列についての練習問題

へびせんせい

上のコードをコピーし、以下の条件で、その続きを書き足せ。
3つの要素をもつ配列work_typeを定義し、"日勤"、"夜勤"、"休み"の3つの文字列を格納せよ。
C列の1行目から順に、日勤、夜勤、休みが表示されるように30回繰り返せ
*1行目は「1:月:日勤」となり、2行目は「2:火:夜勤」 ・・・ となる

解答はコチラ

Excelを開いて、コードを確認してください

Download