VBA Stepup10
第10章 配列について
第6章のCSVの単純取込の時に、配列が出てきました。配列とは、複数のデータを連続的に並べたデータ構造のことです。配列は、変数として定義しますが、普通の変数は値が1つしか入りませんが、配列は複数の値を持つことができます。 プログラムを効率的に組む手法として、配列は非常によく使われますし、プログラムのスキルの高い人ほど配列を上手に使います。逆にプログラムに慣れない人ほど配列がわかりづらいです。
Excelはセルが行と列で構成されていて、特定の複数のセルを繰返し参照することがあります。毎回複数セルを参照してもいいのですが、セルには値以外の情報もあり、値だけを繰返し参照すると以外に時間がかかります。そのような場合、配列を使うとプログラムが意外に楽に組め、またセル参照に比べると配列は圧倒的に高速です。 細かいことはされおき、ただの変数は値が1つだけ、配列では値が複数持てるというように理解してください。
静的配列
静的配列とは、配列を宣言するときに繰返す回数を決めて使う配列のことです。この配列は最大10件だから10件の配列として使ういうものです。例として、文字で10件の配列の定義は、VBAではこのように宣言します。
Dim sAry(9) As String
括弧内が繰り返す回数ですが、10なのに9になります。これは配列は、0から数えるため0~9で10個になります。
A1~A10セルの値の文字データを配列にセットする場合は、以下のとおりになります。
Dim sAry(9) As String
Dim i As Long
For i = 1 to 10
sAry(i - 1) = Cells(i, 1).Value
Next
配列の中にデータを入れる場合、何番目の配列に入れるかを指定する必要がありますので、指定するには括弧内の添字を使います。 上の例では、iが1の時にはA1セルの値を配列の0番目に入れ、iが2の時はA2セルの値を配列の1番目に入れます。 配列内を参照する場合も、添字を使って参照します。
動的配列
動的配列は、配列を宣言するときは繰り返す回数を決めないで使う配列のことです。データを読んでみて、配列の数が決まるときに使います。動的配列は以下のように宣言します。
Dim dAry() As String
配列の数を指定せず、配列の定義をします。
データが入力されている行数分配列をとる場合は、以下のようになります。 (A1セルを開始セルとする)
Dim dAry() As String
Dim Ctr As Long , i As Long
Ctr = Cells(1, 1).End(xlDown).Row - Cells(1, 1).Row
Redim dAry(Ctr)
For i = 1 to Ctr + 1
dAry(i - 1) = Cells(i, 1).Value
Next
動的配列は、データを代入する前に、配列数を定義しなおす必要があります。配列の再定義はRedimステートメントで行います。 このようにすると、データが入っているだけの行分だけ配列にすることができ、行を読みながら配列にセットすることができます。
●Split関数で使用する配列
Split関数を使って、特定の記号を区切りに、文字列を分割するときに、分割した文字列を配列に代入することができます。 CSVデータのようにカンマで区切ってある文字を分ける場合に、Split関数と配列を組み合わせて使います。 配列の定義には、バリアント型の変数を使います。これはSplit関数を実行すると、バリアント変数にカンマで分けたデータを配列に分けて代入してくれます。Split関数が引数として必要なのはバリアント型の変数で、Split関数を実行した後にはバリアント変数が配列に変身するのです。
Dim varArray As Variant
Dim i As Long
varArray = Split(CSVデータ, ",")
For i = 0 To Ubound(varArray)
Cells(i +1 ,1).Value = varArray(i)
Next
変数をバリアント型で定義した場合のみ、代入されるデータに従って配列にしてくれます。
なお、Split関数で分割してできた配列は、Ubound関数で配列の最後の添字を取得できます。
私もプログラムを組み始めたときに、配列を完全に理解するのに2ヶ月はかかりました。プログラム初心者にはハードルが高いですが、一度理解ができるといろいろと応用がききます。 逆に配列まで使えるようになったら、VBAとしてはかなり使いこなせるようになったことになります。
なお、この配列の概念がわかりますと、HTMLに動きをつけるJavascriptも理解できるようになります。