こちらの記事で、MAX関数やMIN関数を使った場合の日付の取り扱いを解説しました。
MAX関数やMIN関数は配列に対しても使うことができるのです。
本記事では、「配列の中から最大値や最小値を探す方法」について解説します。
ワークシート上で解決するケースのほか、マクロを組むケースも考えてVBAコードを紹介しますね。
1.配列とは
こんにちは。エクセルマン・ブリーダーのしもむぎ(@re_znd13)です。
まずは配列とはなにか?について見ていきましょう。
配列とは文字列や数値を入れる器のようなものです。
というと、変数と違うの?と思われるかもしれませんね。
変数は入れられる値がひとつでした。
配列は値を複数入れられるという点が特徴です。
配列には1次元、2次元、・・・という風に次元があります。
1次元は1行分(もしくは1列分)の値の群をいいます。
2次元は複数行×複数列分の値の群をいいます。
エクセルのワークシートを想像すると、2次元までの配列はイメージがつきやすいかもしれません。
2.配列中の最大値をMAX関数で求めよう(ワークシート上のケース)
次のようなケースを考えてみます。
性別とそれぞれのBMIを表したものです。
この中からBMIの最大値を探したい場合、どうしますか?
配列を使う場合、下の式を入力して、shift+ctrl+Enterを押して確定します。
=MAX(B2:B6)
shift+ctrl+Enterによって、配列として扱うことになります。
この場合、式が{ }で自動的に括られて表示されます。
ただ、1次元の配列として扱う場合だとあまりうまみがありませんね。
配列の得意とするところで、女性のBMIの最大値を求めることを考えてみましょうか。
下の式を入力して、shift+ctrl+Enterで確定してみてください。
この式では、配列のうちA列の要素が女性であるかを見て、それがTrueの場合に、B列の要素を取り出しています。
その中からMAX関数で最大値を取り出している、ということになります。
=MAX(IF(A2:A6="女性",B2:B6))
最大値の例を見てきましたが、MIN関数でも同様にして最小値を求めることが可能です。
3.配列中の最大値をMAX関数で求めよう(VBAのケース)
前章の例のうち、女性のBMIの最大値を取り出す場合のVBAコードを考えてみましょう。
VBAコードの例は以下のようになります。
arrという配列をvariant型で宣言しています。
fmaxbmiはBMIの最大値を入れる変数です。
小数になるので、single型としました。
Redim arr(4,0)というのは、5行1列の配列として再定義をする箇所になります。
配列は0から始まるので、5要素ある場合は4と記述しなければなりません。
For文で2行目から6行目までループさせつつ、1列目、つまりA列の要素が女性である場合のみ、配列に2列目(B列)の値を格納していくようにしました。
最後に、ワークシートファンクションとしてMAX関数を使い、上記で作った配列から最大値を取り出す、というものです。
Sub 配列のmaxとmin()
Dim arr() As Variant
Dim fmaxbmi As Single
Dim i As Long
ReDim arr(4, 0)
For i = 2 To 6
If Cells(i, 1) = "女性" Then
arr(i - 2, 0) = Cells(i, 2)
End If
Next i
fmaxbmi = Application.WorksheetFunction.Max(arr)
MsgBox fmaxbmi
End Sub
メッセージボックスに表示させた結果は以下の通り。
ちゃんと、女性の最大値が得られましたね。
こちらの例でも最大値を取得するケースを見ましたが、MIN関数として最小値を取得することも可能です。
4.まとめ
本記事では、「配列の中から最大値や最小値を探す方法」について解説しましたが、いかがでしたか?
配列はVBAの高速化にも寄与するテクですので、ぜひ使っていきたいですね。