こんにちは、Ryoです。
VBAで配列を使う機会は多いのですが、膨大なデータ量を配列に格納した中に必要とするデータ有無を確認したいことがあると思いますが、格納数分をループ処理などで検索させるのは、やや面倒だったりします。
そこで格納した配列(1次元)から条件に一致するデータ、しないデータを取得するFilter関数について書いてみたいと思います。
1.サンプルコード
サンプルとして1次元配列に1~100までの数値を入れ、この中から「0」を含む数値を取得したいと思います。
Sub Sample1() Dim Samp(1 To 100) As Variant Dim i As Integer For i = 1 To 100 Samp(i) = i Next i MsgBox "0を含む:" & Join(Filter(Samp, "0", True), ",") End Sub
サンプル配列としてSampに1から100までの数値を入れます。
通常ならInteger型を指定するものなのですが、私が動作を確認する限りではVariant型を指定しないと「型が一致しません」というエラーになるようです。
その配列から「0」を含むものを取得しますが、ここでFilter関数を使い、
Filter(指定する配列,条件,True又はFalse)の様に指定します。
サンプルで言えばFilter(Samp⇒配列,”0″⇒条件,True⇒一致するもの)となっていますが、Trueは省略しても規定値がTrueなので問題ないです。
このFilter関数は配列で返ってくるのでサンプルの様に一覧で表示させる場合は、併せてJoinを使いFilterで取得した配列データを結合させ、見やすいように “,” で区切るようにします。
これを実行すると以下の様に表示されます。
ちなみに、MsgBox “0を含む:” & Join(Filter(Samp, “0”, False), “,”)で実行すると。。。
0を含まない指定になりますから、当然こうなりますね。
先程お話した配列で返ってくることを説明しますと、以下の様な記述で実行した場合。。。
Sub Sample2() Dim Samp(1 To 100) As Variant Dim i As Integer Dim Num As Variant For i = 1 To 100 Samp(i) = i Next i Num = Filter(Samp, "0", True) End Sub
このように配列になって戻ってくるので、Joinを使って配列を結合し表示させているということになります。
2.まとめ
Filter関数を使うことで配列(1次元)から条件に一致するデータを取得することが出来ますので配列データを扱う際には知っておくと使える局面もあるかと思います。
但し、やや扱いにくい部分もありますのでそれほど多くないデータから抽出する場合はループ処理など使った方が良い場合もありますから、そこは臨機応変に!
以上、配列(1次元)から条件一致データを取得する方法についてでした!
今回の記事が何かの参考になれば幸いです。
Ryo