前回のQ5で行ったことを配列を使用して再現してみるにはどうしたらいいでしょうか?
ちなみに前回の記事はこちら
[Q5.特定の条件に合致するセルの情報を取得するには?][1]
[1]:https://qiita.com/guren111/items/40af20cc74d958603993
Q5では、ForEach文を利用して、Rangeの情報を取得して30歳以上の人が
何人いるかをカウントしました。
今回は、同じようなことを配列を利用して実現する方法を考えていきます。
20歳以下の人を調べて、20歳以下だった場合、名前をまとめて、最終的に
20歳以下の人はこちらです。といった具合に20歳以下の人を表示するマクロを作ってみましょう。
■配列を利用する
配列を利用するのはとても簡単です。
変数を宣言するのと同じように、
Dim 変数名(要素数) as データ型名
といった記述です。
ここで、注意しておきたいのが、要素数が分かっているかという点です。
今回は、より簡単な要素が分かっている場合について説明します。
要素数があらかじめわかっている場合は、要素数をそのまま宣言時に指定してあげればOKです。
ちなみに、要素数が分かっていない場合は何も記載せず空にして宣言します。
■回答
では、マクロを見ていきましょうこちらです。
Sub Q6_Answer()
Dim Names(6) As Variant
Dim j As Variant
Dim i As Range
Dim massage As String
Dim index As Integer
For Each i In Range("C2:C8")
If i.Value >= 20 And i.Value < 30 Then
Names(index) = i.Offset(0, -1).Value
index = index + 1
End If
Next i
For Each j In Names
If Not IsEmpty(j) Then
massage = massage + j + "さん" + vbLf
End If
Next j
MsgBox "20代の人は" & vbLf & massage & "です。"
End Sub
■解説
まず、1行目のDim Names(6) As Variantで、
配列の宣言をしています。
この配列に、20代の人の名前を格納していきます。
今回は、あらかじめ人数が分かっている前提で作成しているので、
このようになります。
ちなみに、7人いるにも関わらずNames(6)としているのは、
配列の要素は0から始まるからです。
この場合、Names(0)からNames(6)までの配列となります。
if文にあるAndは複数の条件に合致したものを判定するのに利用します。
今回は20代以上なので、このように、
If i.Value >= 20 And i.Value < 30 Then
Andを使って複合条件を記述しています。
これで、20代の人をNamesという配列に格納することができました。
ただし、Namesという配列には値が入っている要素とそうでない要素があります。
7人の人全員が20代であるならば、すべて埋まるのですが、そうでない場合は、
空の要素とデータが入っている要素が混在していることになります。
ForEach文を利用して配列の要素ひとつひとつを確認していきます。
If Not IsEmpty(j) Thenという記述で、空でなかった場合という意味になります。
IsEmptyは要素が空かどうかを調べる関数です。空であれば、TRUEを返します。
この記述では、頭にNotを付けているので、TRUEでない場合、
つまり、空でない場合となります。
空でなかった場合に、messageという変数に名前を連結して、格納していき最後に表示させています。
今回はこのように配列を使用する為に、あえてこのようの冗長な記述になっていますが、
同じことを実現するには、後半のForEach文はいらなかったりします。
というかそもそも配列を使う必要も実はあまりなかったりします。
が、あくまで配列を使うには?という観点で見ていただけたらと思います。
(もっといい例があれば、また別の機会に取り扱いたいと思います。)
最後にマクロを実行した結果を載せておきます。