オフィス プログラミング

VBA超入門シリーズ:その11 ~配列~

はじめに

 

VBA超入門シリーズ:その10 ~ループ処理~

 

今回はさらにプログラミングっぽくなります。難しいですが「配列について」入門らしく少しだけまとめました。

 

VBAの配列

さて、VBAを使える皆さんは口を揃えて「VBAの配列はめんどくさい」と言います。
初心者にとってはVBAの配列は使い勝手が悪く面倒です。しかしとても便利で効率的な処理が可能です!!

 

配列...

ところで配列って?

配列とは、複数のデータを連続的に並べたデータ構造。各データをその配列の要素といい、自然数などの添字(インデックス)で識別される。

IT用語辞典 e-Words 配列とはより引用

要約すると、1つの配列名にたくさんのデータを格納できるよ!ということです。 
Excelは行と列の2要素で構成されているので「2次元配列」というものと相性バツグンです。大量のデータをやり取りする場合にとても効果的です。

 

書式

配列の要素数を指定して宣言します。

Dim 配列名(要素数) As データ型

 

デフォルトの配列の要素は「0」からスタートです。
要素数を「2」と宣言すると(0, 1, 2)の3個の要素をもつ配列を宣言します。

 

「0」スタートはちょっと馴染みにくいです…

 

なので要素を「1」からスタートする方法もあります。

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

下限に「1」、上限に「3」と宣言すれば(1, 2, 3)の3個の要素をもつ配列になります。

 

やってみる

3名の名前を扱うリスト「nameList」を宣言してみます。
要素数は「2」、型は文字列型です。

Dim nameList(2) As String

 

宣言した配列に文字を代入するときには () のなかの要素の番号を指定して格納します。

nameList(0) = "川畑"
nameList(1) = "佐藤"
nameList(2) = "鈴木"

 

取り出すときも同じように番号を指定します。

 

以上まとめるとこのようになります。

Sub 配列()
 Dim nameList(2) As String
 nameList(0) = "川畑" 
 nameList(1) = "佐藤" 
 nameList(2) = "鈴木"
 Debug.Print nameList(0), nameList(1), nameList(2) 
End Sub

 

いい感じですね!

 

この配列は横方向(列)の入力に対応しています。
同じサイズであれば一気に格納できます。イミディエイトウィンドウではなくセルに格納してみます。

Sub 配列()
 Dim nameList(2) As String '配列の宣言
 nameList(0) = "川畑"  '格納
 nameList(1) = "佐藤"
 nameList(2) = "鈴木"

 'セルに格納
 Range("B2:D2").Value = nameList
End Sub

 

横方向(列)に別々に格納できましたね!

 

配列で使う便利な関数たち

もう少し詳しく書いておきます。配列では便利な関数がたくさんありますので、一部ご紹介です。

配列使いこなそう!

 

簡易リスト作成する関数

Array関数を使い引数に値やオブジェクトをカンマ区切りで書くと、その値を要素に持つVariant型の配列にしてくれます。

書式は以下の通りです。

Array (要素1, 要素2, …)

 

Array関数を使うと、先程の配列の宣言は以下のような簡単書き方になります。

Dim nameList()
nameList = Array("川畑", "佐藤", "鈴木")

 

宣言合わせても2行で済みました!

かんたん!わかりやすくなった!

 

しかしArray関数はVariant型しか使えません。
「お手軽だけどデータ型の指定ができない」ということは、予定と違った値を格納してしまうミスがあるかもしれません。長期且ついろいろな人が使うマクロでは避けた方がよいです。
 
とはいえ、なんとなくでも動くのがVBAの良いところ。うまく使い分けましょう。

 

配列を作成・確認する関数

配列を(CSV形式)文字列にする場合はSplit関数を使用します。
逆に「川畑, 佐藤, 鈴木」のようなカンマ区切り(CSV形式)の文字列を配列に変換する場合はJoin関数を使います。
 
書式は以下の通りです。

Split(文字列[, 区切り文字])
Join(文字列[, 区切り文字])

 

第1引数に文字列を指定し、第2引数に区切り文字を指定します。
区切り文字は省略可能です、その場合はスペース区切りになります。

 

サンプル

次のコードは、カンマ区切りの文字列から配列を作成します。

Sub 配列()

'配列の宣言
Dim nameList() As String, str As String 

'文字列の格納
str = "川畑, 佐藤, 鈴木"

'Split関数で変数strを配列に変換
nameList = Split(str, ",")

Debug.Print nameList(0); nameList(1); nameList(2)

End Sub

 

イミディエイトウィンドウでそれぞれの配列に格納できていることが確認できます。
 
次はJoin関数を使って「:」区切りで連結させた文字列に変換します。
文字列 → Splitで分割 → Joinで連結
と意味のない操作ですが練習のために見てみましょう

Sub 配列()

Dim nameList() As String, str As String

str = "川畑, 佐藤, 鈴木"
nameList = Split(str, ",")

Debug.Print Join(nameList, ":")

End Sub

 

ちゃんと「:」区切りの文字列になっていますね。

 

話はそれますが、イミディエイトウィンドウ内で改行表示させたいときは、第2引数を改行文字コードの「vbCrLf」にすると可能です。

 

 

配列の情報を得る

配列の最初と末尾のインデックス番号を得るために専用の関数があります。
先頭の番号を取得するためにはLBound関数を、
末尾の番号を取得するためにはUBound関数を使用します。 構文は以下の通りです。

LBound (配列名[, 次元数])
UBound (配列名[, 次元数])

第2引数には調べる配列の次元数を指定します。省略した場合は「1」になります。

 

サンプル

次のコードは配列「nameList」の先頭末尾の要素の番号を利用してループ処理を組み込んだものです。

Sub 配列()
'配列の宣言 -1
Dim nameList() As Variant, i As Long

'値の代入 -2
nameList = Array("川畑", "佐藤", "鈴木")

'情報取得 -3
Debug.Print "先頭:", LBound(nameList)
Debug.Print "末尾:", UBound(nameList)

'ループ処理 -4
For i = LBound(nameList) To UBound(nameList)
 Debug.Print i, nameList(i)
Next

End Sub

 

長く見えますが分解するとすべて今までやってきたことです。 

① 配列の宣言
Array関数を使い配列に値の代入
Debugを使い一度情報取得(視覚的な意味なので無くても動く)
ForNext文でループ処理

 

無事にできました~!

 

配列は他にも3次元以上の多次元配列や連想配列などまだまだ深い内容がいっぱいですが、超入門としてまとめるのはここまでにします。
興味をもってさらに勉強してみてもよし、実際に使ってみてから理解するために調べてもよしです。

 

初心者用として書いていた記事ですが、最後はループ処理や配列までできるようになりました。
書きたいことが多く、すこし長くなってしまいましたがVBA超入門シリーズは今回で一通り終了となります。
この記事を見ていただいた方のVBAに取り組むきっかけになれば良いなと思います。
 
それではまた別の記事で!お疲れ様でした!

ここまで読んでいただきありがとうございます!