この記事では、初心者向けにVBAを用いて配列の基礎についてご説明します。
配列を覚えるとソースコードをシンプルにコーディングすることが可能になります。
また配列の概念自体は他のプログラム言語でも必須の知識となっています。
他のプログラミングを学習する際に役に立ちますので、これからプログラミングを学習する初学者は最後までご覧ください。
配列とは?
プログラム上で、変数とは、“値を格納する器”のようなものと想像すれば理解することができます。
変数には、1つしか値を格納することができません。
では配列とは何か?
配列も変数と同様、“値を格納する器”のようなものです。
しかし配列は普通の変数と異なり、複数の値を格納することができる変数です。
イメージすると次のような図となります。
そして配列には複数の値を代入することができるため、
・配列の何番目に値を入れるのか
・配列の何番目の値を取り出すのか・・・など
配列の要素を番号で指定する必要があります。
この番号をインデックス番号といいます。
配列の変数宣言のやり方
通常の変数は、つぎのように宣言して使用します。
Dim a as long
a = 100 ’変数に値100を代入
配列の場合は、次の例のように変数の後にカッコをつけて宣言します。
Dim a(3)
デフォルトでは配列のインデックス番号は0からはじまります。
そのため、
Dim a(3) as long
a(0) = 100
a(1) = 200
a(2) = 300
a(3) = 400
と定義すると、0,1,2,3 と4つの値を格納することができます。
a(3)と書いてあると、3つ格納できるのかな?
と思いがちですが、
プログラミングの世界では通常0スタートがスタンダードですので
覚えておきましょう。
配列への値の代入方法
配列で定義した変数に値を代入する際は、必ず、何番目の要素に格納するのか
インデックス番号を指定する必要があります。
(例)
a(0) = 100 ‘一番目の配列に100を代入しています。
では簡単なソースを下記にコーディングしてみますので
実際にVBEを起動して入力してみましょう。
Sub sample_hairetu()
Dim a(5) As Long
Dim cnt As Integer
a(0) = 100
a(1) = 200
a(2) = 300
a(3) = 400
a(4) = 500
For cnt = 0 To 4
Cells(cnt + 1, 1) = a(cnt)
Next cnt
End Sub
ではさっそくVBAを実行してみましょう。
配列 a の値を順に、EXCELのA列に対して、
セルA1 ⇒ セルA2 ⇒ セルA3 ⇒ セルA4 ⇒ セルA5
と繰り返し処理で代入してみました。
配列を使用する際は、インデックス番号を使用しますので
現場では必ずと言っていいほど、ループ処理をセットで
使用することが多いです。
つまり、ループ処理で繰り返し処理を行いながら、
各配列の要素に値を代入したり
各配列に要素を参照したり
することができます。
そのため、繰り返し処理と配列は、とても使いやすい組み合わせなのです。
配列とセットでよく使う関数
配列を使うときに、セットでよく使う関数があります。
使い方を覚えておくと、とても便利ですので、ご紹介します。
①「LBound」関数
引数に指定した配列の最小のインデックス番号を返却してくれる関数です。
②のUBound関数を合わせて覚えましょう。
事例もいっしょに説明します。
②「UBound」関数
引数に指定した配列の最大のインデックス番号を返却してくれる関数です。
では実際に、「LBound」関数と「UBound」関数を用いた、簡単なサンプルソースを解説します。
Sub bound_sample()
Dim weekly() As String
Dim cnt As Integer
weekly = Split("日,月,火,水,木,金,土", ",")
For cnt = LBound(weekly) To UBound(weekly)
Cells(cnt + 1, 1) = weekly(cnt)
Next cnt
End Sub
【解説」
6行目で配列変数weeklyに、”日” “月” “火” “水” “木” “金” “土” の値を7個代入しています。
8行目で繰り返し処理を行っています。
ここで「LBound」関数と「UBound」関数 の登場です!
まず、LBound(weekly)で、配列weeklyの最小インデックス番号の0が求められます。
次に、UBound(weekly)で、配列weeklyの最大インデックス番号の6が求められます。
つまり、
For cnt = 0 to 6
Cells(cnt + 1, 1) = weekly(cnt)
Next cnt
で、配列の要素を0から6まで7コ、セルA列に繰り返し代入しています。
③「Split」関数
特定の文字列から、指定した区切り文字で、文字を取り出し、配列を作成する関数です。
実際に次のソースコードでイメージしてみましょう。
セルのA1に、a,b,c,d,e を入力してください。
そして、下記のコードを実行してみましょう。
Sub Split_sample()
Dim data() As String
Dim i As Integer
data = Split(Range("A1").Value, ",")
For i = 0 To UBound(data)
Cells(i + 1, 2) = data(i)
Next
End Sub
実行すると・・・
次のような結果となります。
B列に取り出した配列変数の値が順に展開されてます。
セルのB列に繰り返し処理で、配列の値を代入しています。
配列を使用すると、セットで繰り返し処理を使う場面が多いです。
そうするとおのずとこれら4つの関数も配列を操作するうえで必須の関数で
よく使いますのでセットで覚えておきましょう!
④「Array」関数
配列が格納されたバリアント型の値を返す関数です。
Array関数の書式
Array(List)
「List」は省略可能で、値のリストをカンマ区切りで指定します。
「List」に格納される配列のインデックス番号は0からSTARTします。
そしてArray関数の戻り値はバリアント型(Variant)になります。
では次のコードで、実際に、「Array」関数に格納された配列の値をExcel上に表示してみよう。
Sub Array_sample()
Dim ArrayData As Variant
Dim cnt As Integer
ArrayData = Array("大阪", "京都", "兵庫", "滋賀", "奈良")
For cnt = 0 To UBound(ArrayData)
Cells(cnt + 1, 1) = ArrayData(cnt)
Next
End Sub
実行すると・・・
次のような結果となります。
A列に取り出した配列変数の値が順に展開されてます。
動的配列と静的配列の違い
静的配列とは、配列の変数を宣言するときに、要素数を固定で宣言する配列です。
一方、動的配列を宣言する場合は、要素数は指定しません。
下記のようにカッコの中を空欄で宣言します。
‘動的配列の宣言方法
Dim 配列名() As データ型名
こうすることで、宣言後、変数を使用して
配列の要素数を可変でいくつでも指定することが可能になるのです。
配列の要素数を指定するにはRedimステートメントで指定することができます。
Redimステートメントを使って要素数を定義する構文は以下の通りです。
Redim 配列名(要素の最大値)
つまり動的配列を使う際には、配列の宣言時に要素数を指定しません。
Redimステートメントで指定すると覚えておきましょう。
実際に、つぎのサンプルコードで、動的配列を作った後に
UBOUND関数と組み合わせて配列の各要素をセルに代入しています。
Sub sample_doteki()
Dim fruits() As String
Dim cnt As Integer
ReDim fruits(2)
fruits(0) = "Apple"
fruits(1) = "Orange"
fruits(2) = "Grapes"
For cnt = 0 To UBound(fruits)
Cells(cnt + 1, 1) = fruits(cnt)
Next cnt
End Sub
実行すると・・・
次のような結果となります。
A列に取り出した配列変数の値が順に展開されてます。
まとめ
プログラミングを上達させるには、配列の基礎知識は必須となります。
また動的配列、静的配列を違いを意識することで
配列を使ったプログラミングが可能になります。
基礎的な概念が理解できるまで何度も
この記事を参考に、VBAを実行してみてください!