Help us understand the problem. What is going on with this article?

Q6.配列を使用するには?

前回のQ5で行ったことを配列を使用して再現してみるにはどうしたらいいでしょうか?

ちなみに前回の記事はこちら
Q5.特定の条件に合致するセルの情報を取得するには?

さて、前回使ったデータはこちらです。
Q5-1.png

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文はいらなかったりします。
というかそもそも配列を使う必要も実はあまりなかったりします。

が、あくまで配列を使うには?という観点で見ていただけたらと思います。
(もっといい例があれば、また別の機会に取り扱いたいと思います。)

最後にマクロを実行した結果を載せておきます。

Q6-1.png

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away