Max・Min・Average関数で最大値・最小値・平均を求める

vbamaxminaveeyecatch

エクセルVBAで、ワークシート関数 Max・Min・Averageを利用して最大値・最小値・平均を求めます。

利用頻度の高いワークシート関数です。

こんにちは、じゅんぱ店長(@junpa33)です。

今回のテーマは、エクセルワークシート関数 「Max」・「Min」・「Average」についてです。

「Max関数」・「Min関数」・「Average関数」は、指定のデータ範囲の中で、最大値、最小値、平均値を求めることが出来ます。

エクセルシートでは、皆さんお馴染みの関数です。

「Max関数」「Min関数」「Average関数」とはどんな関数

vbamaxminavep006

エクセルVBAの中には、VBA関数、メソッドやプロパティを含めても、Max・Min・Averageという関数はありません。

これは、エクセルの中でもワークシートに付随した関数になります。

ですので、いきなりVBAコードでMaxと記述してもVBAでは「何ですかそれ?」というエラーが返ってきます。

Max関数・Min関数・Average関数などのワークシート関数をエクセルVBAで使いたいときは、

ちゃんと決まった、利用するための流儀があります。

「Application.WorksheetFunctionプロパティ」というものを使って「使いますよ!宣言」を行う必要があります。

このようなワークシート関数は、他にもたくさんあり、

有名どころですと、Vlookup関数、Sum関数、Match関数などなど

非常に多くのワークシート関数を使うことが出来ます。

Max関数の構文

Max関数の構文
  • WorksheetFunction . Max ( 範囲1 [ , 範囲2・・])

「WorksheetFunction . 」は関数の前に必ずつけます。(接頭語のようなものです。)

「範囲」は「 , 」(カンマ)でで区切って複数設定できます。

「範囲」として、セルでの範囲だけでなく、配列の要素群を範囲として指定することもできます。

Min関数の構文

Max関数の構文
  • WorksheetFunction . Min ( 範囲1 [ , 範囲2・・])

「WorksheetFunction . 」は関数の前に必ずつけます。(接頭語のようなものです。)

「範囲」は「 , 」(カンマ)でで区切って複数設定できます。

「範囲」として、セルでの範囲だけでなく、配列の要素群を範囲として指定することもできます。

Average関数の構文

Average関数の構文
  • WorksheetFunction . Average ( 範囲1 [ , 範囲2・・])

「WorksheetFunction . 」は関数の前に必ずつけます。(接頭語のようなものです。)

「範囲」は「 , 」(カンマ)でで区切って複数設定できます。

「範囲」として、セルでの範囲だけでなく、配列の要素群を範囲として指定することもできます。

「Max関数」「Min関数」「Average関数」の使い方

vbamaxminavep007

非常に簡単に使える関数ですが、使い方をサンプルで説明していきます。

「Max関数」「Min関数」「Average関数」の使い方

この3つの関数のサンプル説明として、分かり易いように同じ前提の例題とします。

エクセルシートA列に45個のIDを作り、Rnd関数で3桁までの数値をランダムに割り当てていきます。

  • 「Max関数」を使って、45個の中で最大の値を探して別セルに表示します。
  • 「Min関数」を使って、45個の中で最小の値を探して別セルに表示します。
  • 「Average関数」を使って、45個の平均値を計算して別セルに表示します。

実務上の多くは、実際に「Max関数」「Min関数」で最大値、最小値を取り出しても、

それが「どこのID番号や行番号のものなのか?」を知ることは出来ません。

「さて、それをどのようにして知るか?」

このサンプルでは、その答えの一つを提示しました。

ここでは、Match関数を使って対策しています。

Max関数

設定する変数

  • i ・・・・ ループカウント変数(ID番号を追いかける)
  • r ・・・・ 求める値(最大値)がある相対的行番号(ID番号)
VBA
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」と表示されました。

vbamaxminave001a

参考記事

  • Round関数 ・・・・ 数値の切り捨て、切り上げ、四捨五入を行う
vbaroundeyecatch Round関数の罠。VBAで数値を四捨五入する時の注意点 vbaroundupdowneyecatch RoundUpとRoundDown関数の使い方。数値の切り方に注意
  • Rnd関数 ・・・・ 乱数を発生させる
vbarndeyecatch Rnd関数で乱数を取得。デフォルトでは使えない戻り値の加工
  • Match関数 ・・・・ 指定された値が検索対象範囲に存在するかを調べ、存在すればその位置を表示する
vbamatcheyecatch001 VBAで使うMatch関数 活用度アップでテッパン関数に!

Min関数

設定する変数

  • i ・・・・ ループカウント変数(ID番号を追いかける)
  • r ・・・・ 求める値(最小値)がある相対的行番号(ID番号)
VBA
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」と表示されました。

vbamaxminave002a

Average関数

設定する変数

  • i ・・・・ ループカウント変数(ID番号を追いかける)
VBA
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」と表示されました。

vbamaxminave003a

最大値と最小値を同時に出せる別のコード組み立て

実務的には、Max関数もMin関数を使う場合でも、

他の関数にもお世話にならないと「事が済まない(目的が達成されない)」と感じられたことがあるでしょう。

例えば、「検索系関数が必要なんだけど・・・」

そこで、全く発想の違う考え方で、

最大値と最小値を同時に、しかもID番号まで即判明する方法を紹介します。

と言っても、
For~Next で、「一個ずつ大小比べて行く」ような
思考停止の力業の話ではありません。

いろんな解決法の一つとして参考にしてください。個人のアイデアの出し所です。

Sortメソッド

エクセルのソート機能を利用してデータ群を昇順や降順に並べ替えします。

この方法で、最上段または最下段のデータを拾えば、そのものが最大値や最小値となっています。

設定する変数

  • i ・・・・ ループカウント変数(ID番号を追いかける
VBA
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」と表示されました。

vbamaxminave004a

データ取得後にID番号で再整列させて表を整えます。これだけです。

vbamaxminave005a

参考記事

  • Sortメソッド ・・・・ 数値データなどのデータ群を順番に並び替える
vbasorteyecatch データの並び替え VBA新旧のSortを実データで実証

関数 Max・Min・AverageをVBAで使う まとめ

vbamaxminavep008

エクセルVBAで、最大値、最小値、平均値を調べるコードを組み立てる場合は、

ご覧いただいたように、ワークシート関数を拝借利用するのが、一番簡単です。

エクセルVBAのいろんなコード解説の中には、難解なコードやコード進行がややこしい組み立て方なども多くあります。

「やるならこれぐらいは知っていて・・・」なのかもしれませんが、

自分的には、VBAコード組み立てのポリシーは「平易で簡単なコード設計」を目指していきたいと思っています。

ワークシート関数は、そういった意味でもお助けマンになってくれる存在です。

エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。

vbastudyeyecatch2 エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です

今回の記事はここまでです。   最後までご覧いただき有難うございました。

エクセルVBA最速理解で必要な知識を集めよう!

エクセルVBA業務ツールで日常の業務改善を行いましょう。

VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。

アンケートでポイ活しよう!!

アンケートに答えれば答えるほど ”使える” ポイントがたまります。

NTTコム サーチ

af_banner01

Dstyle web

dstyleweb_logo
dstyle_320x50-min