
VBA超入門シリーズ:その11 ~配列~
気が付けばその10を超えてますね。
今回は配列です。難しいですが入門らしく少しだけまとめます。
VBAの配列
みなさん口を揃えて「VBAの配列はめんどくさい」と言います。
ほかのプログラミング言語でも用意されてる「配列」ですがVBAは使い勝手が悪く少々面倒です、しかしすごく便利で効果があるのがVBAの配列です。
配列…
配列とは、複数のデータを連続的に並べたデータ構造。各データをその配列の要素といい、自然数などの添字(インデックス)で識別される。
要約すると1つの配列名にたくさんのデータを格納できるよ!ということです。
Excelは行と列で構成されているので「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関数
Array関数を使い引数に値やオブジェクトをカンマ区切りで書くと、その値を要素に持つVariant型の配列にしてくれます。
構文は以下
Array (要素1, 要素2, …)
先ほどはめんどくさい書き方をしました。
Dim nameList(2)
nameList(0) = "川畑"
nameList(1) = "佐藤"
nameList(2) = "鈴木"
上の構文を下のように書き直すことができます。
Dim nameList()
nameList = Array("川畑", "佐藤", "鈴木")
簡単になりましたね!とても楽です!
しかしArray関数はVariant型しか使えません。
「お手軽だけどデータ型の指定ができない」ということは、予定と違った値を格納してしまうミスが起こりえます。長期且ついろいろな人が使うマクロでは避けた方がよいです。
とはいえ、なんとなくでも動くのがVBAの良いところ。うまく使い分けましょう。
配列を作成確認する関数
「川畑, 佐藤, 鈴木」のようなカンマ区切り(CSV形式)の文字列を配列に変換する場合はJoin関数を使います。
逆に配列を(CSV形式)文字列にする場合はSplit関数を使用します。
構文は以下
join(文字列[, 区切り文字])
Split(文字列[, 区切り文字])
第1引数に文字列を指定し、第2引数に区切り文字を指定します。
区切り文字は省略可能で、その場合はスペース区切りになります。
サンプル
次のコードは、カンマ区切りの文字列から配列を作成します。
Sub 配列()
Dim nameList() As String, str As String
str = "川畑, 佐藤, 鈴木"
nameList = Split(str, ",")
Debug.Print nameList(0); nameList(1); nameList(2)
End Sub
イミディエイトウィンドウでそれぞれ格納できていることが確認できます。
次は「:」区切りで連結させた文字列に変換します
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 配列()
'配列の宣言
Dim nameList() As Variant, i As Long
'値の代入
nameList = Array("川畑", "佐藤", "鈴木")
'情報取得
Debug.Print "先頭:", LBound(nameList)
Debug.Print "末尾:", UBound(nameList)
'ループで走査
For i = LBound(nameList) To UBound(nameList)
Debug.Print i, nameList(i)
Next
End Sub
長く見えますが分解するとすべて今までやってきたことです。
① 配列の宣言
② Array関数を使い配列に値の代入
③ Debugを使い一度情報取得(視覚的な意味なので無くても動く)
④ For ~ Next文でループ処理
おしまい
配列は他にもワークシート関数やコレクションを配列代わりにしたり、多次元配列、連想配列などまだまだ深い内容がいっぱいですが、超入門としてまとめるのはここまでにします。
初心者用として書いていた記事ですが最後はループ処理や配列までできるようになりました。
最初に記事を上げたときに思っていたよりは長くなってしまいましたが、VBA超入門シリーズは今回で終了となります。
この記事を見つけていただいた方のVBAに取り組むきっかけになればよいなと思います。
それではまた別の記事で!お疲れ様でした!