初心者用にVBAの配列を基礎から応用までまとめてみた!

18/10/08 15:19:11     19/04/27 19:13:09

VBAのイメージ画像

VBAと言えばマイクロオフィスのシリーズで使えるプログラミング言語で、事務処理の自動化などに最適です。そのためプログラマーだけでなく事務職や営業職など幅広い職種の人に学習メリットのあるプログラミング言語と言えるでしょう。

ソースコードが非常にシンプルで読み書きしやすいことも大きな特徴です。そこで万人にVBAの学習をおすすめしたいのですが、VBA学習のなかでも重要になるのが配列の使い方です。

配列は同じデータを大量に扱う場合に一つのかたまりとして扱うことのできる概念ですが、VBAの主な用途である事務処理では配列の活躍機会が多いです。そこでこのページでは、VBAの配列の基礎から応用までを解説していきます。

VBA配列の基礎

まずは配列の基礎編ですが、宣言やループでの操作について紹介します。

配列の宣言

まずは基本中の基本である配列の宣言です。基本的には変数の宣言と同じような形です。ただし、配列は固定長配列といって配列の長さが決まっているものと、可変長配列といって配列の長さが動的に変わるものがあります。

なので、固定長配列か可変長配列かを意識して宣言しましょう。具体的には以下のようになります。

固定長配列

Dim 配列名(上限値) As データ型名

可変長配列

Dim 配列名() As データ型名

要するに()のなかで上限値を決定すると固定長になり、何も指定しないと可変長になります。

配列の初期化

次に配列の初期化ですが、変数と違ってデータを複数格納するスペースがある分やや複雑です。と言っても難しいというわけではありません。具体的には以下のようになります。

Eraseステートメントを使用

Erase 配列名

これで一発ですべての要素が初期値になります。Eraseは和訳すると消すとう意味ですが、そのまま配列の中身がすべて消えます。テータの型によって初期値は異なりますが、具体的には以下のようになります。

「数値配列:0」「文字列配列:長さ0の文字列」「オブジェクト配列:Nothing」「バリアント配列:Empty」

たまに初期化すると宣言時の状態になると勘違いされることがありますが、それは違います。宣言時の状態がデフォルトの初期状態であれば初期化すれば宣言時の状態になりますが、宣言時に配列に何かしらの値を入れていた場合、初期化するとそれも消えてしまいます。お間違いないように注意してください。

Array関数を使用

Array関数は可変長配列でデータ型がバリアント型の場合のみ使用できます。具体的な使い方は以下です。

Dim 配列名() As Variant
配列名 = Array(要素0,要素1,要素2)

初期化というよりは、厳密には配列に順番に値を格納していく方法になります。上のコードは、配列の前から順番に要素0、要素1、要素2を格納しました。

配列の再定義

配列の再定義は初期化に近い考え方ですが、配列の長さや型を変更できる場合がある点で違いがあります。ただし、データ型の変更が可能なのは最初の宣言を可変長配列のバリアント型で行っていた場合のみです。

ReDimステートメントを使用

ReDim 配列名(インデックス番号の上限値) As データ型

以上のようになります。これにより、インデックス番号で指定した配列の長さ、データ型で指定した型の配列に生まれ変わります。

VBA配列の応用

次に、配列を使用して応用的なコードにチャレンジしましょう。

Excelシート上のセルとVBA配列要素を共有する

VBAは特にExcelで使用することが多く、その場合Excelシートを自由に扱えると便利です。Excelシートは見ての通り行と列の二次元配列になっているため、配列との相性が良いのです。

二次元配列を利用したコードを組めば、たとえばExcelシートの行と列を指定して、そこに意図した値を自動入力するようなことも可能です。具体的には以下のようなコードがそれに該当します。

Excelシートのセルに値を入れていくコード

Sub valueInCell()
'配列の宣言
Dim valueArray As Variant
'配列に値を格納する。
' WorksheetFunctionオブジェクトのTranspose関数を使用。
'配列を二次元配列化。
valueArray = WorksheetFunction.Transpose(Range("A1:B3"))
'セルに値を入れるための変数を宣言。
Dim cellValue As String
'カウント用の変数を宣言。
Dim i As Integer, j As Integer
'3回ループを回す。
For i = 1 To 3
'2回ループを回す。
For j = 1 To 2
cellValue = cellValue & valueArray (j, i) & ", "
Next j
cellValue = cellValue & vbCrLf
Next i
' MsgBox関数でメッセージボックスを表示。
MsgBox cellValue
End Sub

上記のコードを実行すると、Excelシートには以下のように表示されます。

A B
1 1 11
2 2 12
3 3 13

シートへの処理を自動化できる一例ですが、活用するとExcelシートにいちいち手入力しなくて良い処理が出てきます。エンジニアの作業よりも、むしろ事務系の作業で便利な機能かもしれません。

その他配列操作

配列の要素を取得する

上の例よりも簡単ですが、配列の要素を取得するステートメントがあります。基本編で紹介するか迷いましたが、利用頻度がそこまで高くないということで応用編に入れました。

Dim i As Integer
'最小のインデックス番号から最大のインデックス番号までループで回す。
For i = LBound(配列名) To UBound(配列名)
Next i

または、For Eachを使っても同じ処理が実装できます。

For Each Var In 配列名
Next Var

For Eachの場合配列のインデックスを指定しなくても、自動的に最初から最大までループを回して要素を取得することができます。

配列の要素を削除する

なぜかVBAには配列の要素を削除するためのメソッドがないので、要素削除が面倒です。

配列の再定義や初期化は簡単なのですが、ここは欠点です。以下のような方法で要素削除できます。

Sub deleteArrayValue()
Dim foods() As Variant
foods = Array("ラーメン", "チャーハン", "餃子", "天津飯", "小籠包")
'3番目の要素を削除
Dim i As Integer
'0からカウントすると2が3番目の要素になる。
For i = 2 To UBound(foods) - 1
foods (i) = foods (i + 1)
Next i
' ReDim Preserveステートメントで要素数を変更。
ReDim Preserve foods(UBound(foods) - 1)
Dim value As String
For Each Var In cities
value = value & Var & ", "
Next Var
MsgBox value
End Sub

このコードを実行すると3番目の要素である餃子が消えて以下のようになります。

ラーメン,チャーハン,天津飯,小籠包

配列のコピー

Sub copyArray()
    Dim cities1() As Variant, cities2 As Variant
    foods1 = Array("ラーメン", "チャーハン", "餃子", "天津飯", "小籠包")
    foods2 = foods1
    Dim msg As String
    For Each Var In foods2
        msg = msg & Var & ", "
    Next Var
    MsgBox msg
End Sub

上記のコードを実行すると、以下のように出力されます。

ラーメン,チャーハン,餃子,天津飯,小龍包,

配列をコピーする処理では空の配列をもう一つ用意するのではなく、型宣言なし(バリアント型)の空の変数を用意し、そこにループで回しながら配列の中身を入れていきます。

配列の結合

配列の結合にはJoin関数を使用します。サンプルコードは以下です。

Sub JoinArray()
    Dim str1 As String, str2 As String, msg As String
    str1 = "Hello"
    str2 = "VBA"
    Dim arr(3) As String
    arr(0) = str1
    arr(1) = ", "
    arr(2) = str2
    msg = Join(arr, "")
    MsgBox msg
End Sub

まず文字列の入った変数を用意し、それを配列に格納しました。配列に対してJoin関数を使用しています。すると、以下のように出力されます。

Hello,VBA

Join関数は第一引数に対象となる配列を指定し、第二引数に区切り文字を指定します。今回は第二引数を空で指定しているため、区切り文字はなしです。要素として格納した三つの要素がそのまま出力されました。

またVBAには二つの配列を結合する関数がありません。そのため配列同士を結合したい場合、Join関数とSplit関数を組み合わせます。サンプルコードは以下です。

Sub JoinSplitArray()
    Dim foods1() As Variant, foods2() As Variant, foods3 As Variant
    foods1 = Array("ラーメン", "チャーハン")
    foods2 = Array("餃子", "天津飯", "小籠包")

    foods3 = Split(Join(foods1) & " " & Join(foods2))
    Dim msg As String
    For Each Var In foods3
        msg = msg & Var & ", "
    Next Var

    MsgBox msg
End Sub

このコードを実行すると、以下のように出力されます。

ラーメン,チャーハン,餃子,天津飯,小龍包,

配列の要素をいったんすべて文字列として結合し、それを分割しています。分割された要素をループで出力しました。

まとめ

以上のように、VBAの配列の使い方はいろいろあります。

もちろん最初からすべて覚える必要はなく、ざっくりとどのようなことができるのか把握しておけば問題ありまえん。そして、必要になったタイミングでその都度やり方を調べれば良いのです。

ただし、慣れるまではソースコードを見ても意味がよくわからないかもしれません。繰り返しトレースすることや、いろいろな人のソースコードを見る、実際に自分で書いてみる、といったことを繰り返していけば理解できるようになります。

人間はわからないものが連続すると混乱して全部がわからなくなると言われますが、プログラミングはまさにそういったところがあります。つまり、本来一つ一つをじっくり見れば理解できるのに、全体を理解しようとするあまり訳がわからなくなるということです。

一つ一つ落ち着いて理解していけばいずれぱっと見で全体を理解できるようになるので、焦らず一歩一歩着実にステップアップしていきましょう。

人気記事

編集部おすすめ記事

この記事を読んだ人はこんな記事を読んでいます

案件探しやフリーランスになるための相談する