エクセルVBAで、ワークシート関数 Max・Min・Averageを利用して最大値・最小値・平均を求めます。
利用頻度の高いワークシート関数です。
こんにちは、じゅんぱ店長(@junpa33)です。
今回のテーマは、エクセルワークシート関数 「Max」・「Min」・「Average」についてです。
「Max関数」・「Min関数」・「Average関数」は、指定のデータ範囲の中で、最大値、最小値、平均値を求めることが出来ます。
エクセルシートでは、皆さんお馴染みの関数です。
コンテンツ
「Max関数」「Min関数」「Average関数」とはどんな関数
エクセルVBAの中には、VBA関数、メソッドやプロパティを含めても、Max・Min・Averageという関数はありません。
これは、エクセルの中でもワークシートに付随した関数になります。
ですので、いきなりVBAコードでMaxと記述してもVBAでは「何ですかそれ?」というエラーが返ってきます。
Max関数・Min関数・Average関数などのワークシート関数をエクセルVBAで使いたいときは、
ちゃんと決まった、利用するための流儀があります。
「Application.WorksheetFunctionプロパティ」というものを使って「使いますよ!宣言」を行う必要があります。
このようなワークシート関数は、他にもたくさんあり、
有名どころですと、Vlookup関数、Sum関数、Match関数などなど
非常に多くのワークシート関数を使うことが出来ます。
Max関数の構文
- WorksheetFunction . Max ( 範囲1 [ , 範囲2・・])
「WorksheetFunction . 」は関数の前に必ずつけます。(接頭語のようなものです。)
「範囲」は「 , 」(カンマ)でで区切って複数設定できます。
「範囲」として、セルでの範囲だけでなく、配列の要素群を範囲として指定することもできます。
Min関数の構文
- WorksheetFunction . Min ( 範囲1 [ , 範囲2・・])
「WorksheetFunction . 」は関数の前に必ずつけます。(接頭語のようなものです。)
「範囲」は「 , 」(カンマ)でで区切って複数設定できます。
「範囲」として、セルでの範囲だけでなく、配列の要素群を範囲として指定することもできます。
Average関数の構文
- WorksheetFunction . Average ( 範囲1 [ , 範囲2・・])
「WorksheetFunction . 」は関数の前に必ずつけます。(接頭語のようなものです。)
「範囲」は「 , 」(カンマ)でで区切って複数設定できます。
「範囲」として、セルでの範囲だけでなく、配列の要素群を範囲として指定することもできます。
「Max関数」「Min関数」「Average関数」の使い方
非常に簡単に使える関数ですが、使い方をサンプルで説明していきます。
「Max関数」「Min関数」「Average関数」の使い方
この3つの関数のサンプル説明として、分かり易いように同じ前提の例題とします。
エクセルシートA列に45個のIDを作り、Rnd関数で3桁までの数値をランダムに割り当てていきます。
- 「Max関数」を使って、45個の中で最大の値を探して別セルに表示します。
- 「Min関数」を使って、45個の中で最小の値を探して別セルに表示します。
- 「Average関数」を使って、45個の平均値を計算して別セルに表示します。
実務上の多くは、実際に「Max関数」「Min関数」で最大値、最小値を取り出しても、
それが「どこのID番号や行番号のものなのか?」を知ることは出来ません。
「さて、それをどのようにして知るか?」
このサンプルでは、その答えの一つを提示しました。
ここでは、Match関数を使って対策しています。
Max関数
設定する変数
- i ・・・・ ループカウント変数(ID番号を追いかける)
- r ・・・・ 求める値(最大値)がある相対的行番号(ID番号)
Option Explicit
Sub Max関数サンプル()
Dim i As Long, r As Long
'項目を表示します
Range("A2") = "ID"
Range("B2") = "値"
Range("D2") = "最大値"
Range("E2") = "最大値ID"
'45個分乱数で数値を作ります
For i = 1 To 45
Range("A" & 2 + i) = i
Range("B" & 2 + i) = _
WorksheetFunction.Round(Rnd * 1000, 0)
Next i
'Max関数で最大値を調べます
Range("D3") = WorksheetFunction.Max(Range("B3:B47"))
'Match関数で最大値があるIDを調べます
On Error Resume Next
r = WorksheetFunction.Match(Range("D3"), Range("B3:B47"), 0)
Range("E3") = r
End Sub
最大値は「997」 最大値IDは「19」と表示されました。
- Round関数 ・・・・ 数値の切り捨て、切り上げ、四捨五入を行う
- Rnd関数 ・・・・ 乱数を発生させる
- Match関数 ・・・・ 指定された値が検索対象範囲に存在するかを調べ、存在すればその位置を表示する
Min関数
設定する変数
- i ・・・・ ループカウント変数(ID番号を追いかける)
- r ・・・・ 求める値(最小値)がある相対的行番号(ID番号)
Sub Min関数サンプル()
Dim i As Long, r As Long
'項目を表示します
Range("A2") = "ID"
Range("B2") = "値"
Range("D2") = "最小値"
Range("E2") = "最小値ID"
'45個分乱数で数値を作ります
For i = 1 To 45
Range("A" & 2 + i) = i
Range("B" & 2 + i) = _
WorksheetFunction.Round(Rnd * 1000, 0)
Next i
'Min関数で最小値を調べます
Range("D3") = WorksheetFunction.Min(Range("B3:B47"))
'Match関数で最小値があるIDを調べます
On Error Resume Next
r = WorksheetFunction.Match(Range("D3"), Range("B3:B47"), 0)
Range("E3") = r
End Sub
最小値は「16」 最小値IDは「32」と表示されました。
Average関数
設定する変数
- i ・・・・ ループカウント変数(ID番号を追いかける)
Sub Average関数サンプル()
Dim i As Long
'項目を表示します
Range("A2") = "ID"
Range("B2") = "値"
Range("D2") = "平均値"
Range("E2") = ""
'45個分乱数で数値を作ります
For i = 1 To 45
Range("A" & 2 + i) = i
Range("B" & 2 + i) = _
WorksheetFunction.Round(Rnd * 1000, 0)
Next i
'Average関数で平均値を調べます
Range("A1").Select
Range("D3") = WorksheetFunction.Average(Range("B3:B47"))
End Sub
平均値は「531.1333」と表示されました。
最大値と最小値を同時に出せる別のコード組み立て
実務的には、Max関数もMin関数を使う場合でも、
他の関数にもお世話にならないと「事が済まない(目的が達成されない)」と感じられたことがあるでしょう。
例えば、「検索系関数が必要なんだけど・・・」
そこで、全く発想の違う考え方で、
最大値と最小値を同時に、しかもID番号まで即判明する方法を紹介します。
と言っても、
For~Next で、「一個ずつ大小比べて行く」ような
思考停止の力業の話ではありません。
いろんな解決法の一つとして参考にしてください。個人のアイデアの出し所です。
Sortメソッド
エクセルのソート機能を利用してデータ群を昇順や降順に並べ替えします。
この方法で、最上段または最下段のデータを拾えば、そのものが最大値や最小値となっています。
設定する変数
- i ・・・・ ループカウント変数(ID番号を追いかける
Sub sort関数()
Dim i As Long
'項目を表示します
Range("A2") = "ID"
Range("B2") = "値"
Range("D2") = "最大値"
Range("E2") = "最大値ID"
Range("D4") = "最小値"
Range("E4") = "最小値ID"
'45個分乱数で数値を作ります
For i = 1 To 45
Range("A" & 2 + i) = i
Range("B" & 2 + i) = _
WorksheetFunction.Round(Rnd * 1000, 0)
Next i
'データ範囲A2からB47を降順並び替えをします
Range("A3:B47").Sort key1:=Range("B3"), order1:=xlDescending
'最大値
Range("D3") = Range("B3")
Range("E3") = Range("A3")
'最小値
Range("D5") = Range("B47")
Range("E5") = Range("A47")
Range("A1").Select
'データ範囲A2からB47を降順並び替えをします
Range("A3:B47").Sort key1:=Range("A3"), order1:=xlAscending
End Sub
キーを「B3」にした並び替えの時に、最上段(この場合は最大値)・最下段(この場合は最小値)としてデータを取り込みます。
最大値は「984」 最大値IDは「11」、最小値は「75」 最小値IDは「18」と表示されました。
データ取得後にID番号で再整列させて表を整えます。これだけです。
- Sortメソッド ・・・・ 数値データなどのデータ群を順番に並び替える
関数 Max・Min・AverageをVBAで使う まとめ
エクセルVBAで、最大値、最小値、平均値を調べるコードを組み立てる場合は、
ご覧いただいたように、ワークシート関数を拝借利用するのが、一番簡単です。
エクセルVBAのいろんなコード解説の中には、難解なコードやコード進行がややこしい組み立て方なども多くあります。
「やるならこれぐらいは知っていて・・・」なのかもしれませんが、
自分的には、VBAコード組み立てのポリシーは「平易で簡単なコード設計」を目指していきたいと思っています。
ワークシート関数は、そういった意味でもお助けマンになってくれる存在です。
エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。
エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です今回の記事はここまでです。 最後までご覧いただき有難うございました。
<記事内容についての告知>
VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。
アンケートでポイ活しよう!!
アンケートに答えれば答えるほど ”使える” ポイントがたまります。