Excel。11種類の集計方法で小計を算出するのがSUBTOTAL関数
<関数辞典:SUBTOTAL関数>
SUBTOTAL関数
読み方: サブトータル
分類: 数学/三角
SUBTOTAL(集計方法,参照1,…)
11種類の集計方法で小計を算出します
【Excel・Word・PowerPoint・Access】あなたの「困った」を解決!10年以上の経験が詰まった、現場の疑問から生まれた実践テクニック集。作業効率を劇的に上げるOffice活用術をお届けします。
SUBTOTAL関数
読み方: サブトータル
分類: 数学/三角
SUBTOTAL(集計方法,参照1,…)
11種類の集計方法で小計を算出します
四半期集計などが表の途中にある表で、最大値を算出したい場合、SUM関数とMAX関数だと上手く算出することができません。
表を用意しましたので、確認していきます。
C列の場合からみていきましょう。
小計は、SUM関数とつかって、算出しています。
そして、最大値を算出したいわけですから、MAX関数と考えますが、範囲選択が面倒です。
どうしてかというと、小計を含めて範囲選択すれば、当然、小計の値の方が日々のデータよりも大きくなるからです。
そのため、小計を含めて最大値を算出すると、最大値が算出できないので、小計を除いて範囲選択する必要があります。
ただ、イチイチ、小計を除いて範囲選択するのは、面倒です。
実は、SUM関数やMAX関数とつかって、小計を除いた最大値を算出するよりも、別の関数をつかうと、手早く算出することができます。
先程の表を数式で表示してみます。
D列は、小計も最大値もSUBTOTAL関数をつかって算出しています。
なお、SUBTOTAL関数ではなくて、AGGREGATE関数をつかってもOKです。
ただ、AGGREGATE関数は引数が、SUBTOTAL関数よりも、多いので、今回は、SUBTOTAL関数をつかって説明しております。
D10のSUBTOTAL関数をつかった最大値の数式ですが、範囲選択は、D2:D9で設定しています。
SUBTOTAL関数は、範囲選択にあるSUBTOTAL関数の結果は除外するようになっています。
そのため、範囲選択を必要なデータのみにする必要はないというわけです。
それでは、小計のD5に設定したSUBTOTAL関数を確認します。
最初の引数は、集計方法です。109は非表示にも対応した合計値を求めることができる番号です。
最大値は、104と割り振られています。
2つ目の引数は、参照なので、範囲選択ということですから、それぞれのデータを設定します。
今回のように、途中に小計とかの集計行が含まれている場合、SUM関数とMAX関数で算出よりも、SUBTOTAL関数をつかうことで、手早く最大値を算出することができます。
今回は、STEYX関数~SUBTOTAL関数までをご紹介しております。
STEYX関数
読み方: スタンダードエラーワイエックス
STEYX(既知のy,既知のx)
回帰直線の標準誤差を算出する
STOCKHISTORY関数
読み方: ストックヒストリー
STOCKHISTORY(stock,start_date,[end_date],[interval],[headers],[properties1],…)
指定された銘柄と日付範囲の過去の相場データの配列を返す
SUBSTITUTE関数
読み方: サブスティチュート
SUBSTITUTE(文字列,検索文字列,置換文字列,[置換対象])
文字列中の特定の文字を別の文字に置換する
SUBTOTAL関数
読み方: サブトータル
SUBTOTAL(集計方法,参照1,…)
11種類の集計方法で小計を算出します
四半期集計がある表の場合、最大値を算出するとなると、四半期集計を除いて範囲選択しないと算出することができません。
=MAX(B2:B9)
ただ、B5やB9に四半期集計があるので、これら集計行を除かないと、当然集計値の方が大きいため、きちんとした最大値を算出することができません。
当然、範囲選択で集計行を除けばいいわけですが、集計行が増えれば増えるほど、面倒になります。
このような集計表を作る場合、実は、四半期集計などの途中集計や、最大値を算出するにあたり、「SUBTOTAL関数かAGGREGATE関数」をつかうことで、範囲選択が面倒にならず、手早く算出することができます。
まず、B5とB9の四半期集計をSUM関数からSUBTOTAL関数に変更します。
B5の数式は、
=SUBTOTAL(9,B2:B4)
B9の数式は、
=SUBTOTAL(9,B6:B8)
このように、数式を設定します。
なお、SUBTOTAL関数は集計をする関数です。
最初の引数は「集計方法」です。
「9」は合計を算出する番号です。
今回は、行の非表示がないので、「109」の100番台はつかわなくて大丈夫です。
B11の最大値もMAX関数ではなくて、SUBTOTAL関数で数式をつくります。
=SUBTOTAL(4,B2:B9)
計算方法「4」番は、最大値を設定する番号です。
そして、2つ目の引数は、範囲ですが、集計行を除く必要はありません。
それにより四半期集計を除いた最大値を算出することができたというわけです。
ちょっとした関数の違いですが、手早く算出できるかもしれませんので、調べてみるといいかもしれませんね。
帳票と同じようにExcelで表を作ってしまうと、意外と面倒な処理が発生することがあります。
例えば次のような表。
最大値を算出しているB14。
おかしいですよね。
合計値の値を算出しています。
範囲選択をB3:B11までにすると、今度は、1782という小計値を算出してしまいます。
要するに、範囲選択内の最大値を算出してしまうわけです。
となると、範囲選択は、「B3:B5,B7:B8,B10:B11」というように、何度も区切らなければいけません。
これでは、件数が増えた場合、かなり面倒な作業をしないと、数式を作ることができないということになってしまいます。
では、どうしたらいいのでしょうか?
まずは、合計値の場合からみてみましょう。
B6・B9・B12には、SUM関数をつかった数式で小計値を算出しています。
B13もSUM関数をつかっていますが、オートSUMボタンをつかって、合計をつかうと、その範囲選択内にあるデータ内でSUM関数の算出結果のみを合算してくれます。
B13の数式は、自動的に、
=SUM(B12,B9,B6)
と生成してくれます。
では、最大値はどうなのでしょうか?
オートSUMボタンにある、最大値をつかって、B3:B13までを範囲選択してみると、データであろうが、小計値であろうが、合計値だろうが、関係なく範囲選択内の、最大値を算出してしまいます。
SUM関数をつかったところを除外して算出してくれることはありません。
実は、SUM関数やMAX関数だと、このような帳票には不向きな関数なのです。
今回のような場合は、SUBTOTAL関数かAGGREGATE関数をつかうことで、一気に問題を解決することができ、合理的に数式を作ることができます。
SUBTOTAL関数をつかってみた場合をみてみましょう。
まずは、小計の数式を確認してみます。
C6の数式は、
=SUBTOTAL(109,C3:C5)
と設定しています。
引数の109をつかうことで、合計を算出することができます。
残りも同じようにSUBTOTAL関数をつかっています。
C13の数式は、
=SUBTOTAL(109,C3:C12)
と設定しています。
範囲選択も小計のセルのみを選択するわけではなく、全体を選択してもSUM関数どうように、SUBTOTAL関数で算出した値のところだけを合算してくれいます。
問題の最大値を算出しているC14の数式は、
=SUBTOTAL(104,C3:C13)
引数の104は、最大値を算出する番号です。
範囲選択は、C3:C13とデータも小計値も合計値も関係なく範囲選択していますが、最大値がきちんと算出されています。
このように、途中に小計や合計が含まれる帳票のような表の場合には、SUM関数やMAX関数ではなくて、SUBTOTAL関数やAGGREGATE関数をつかうことで、結果的に効率よく数式をつくることができます。
ケースバイケースで、どの関数をつかうのが効率的なのかを考えながら帳票をつくるといいかもしれませんね。
オートフィルターをつかって、データを抽出しても、連番にしたいことがあります。
その場合、SUBTOTAL関数をつかうことで、対応することができるのですが、ある欠陥がありますので、注意が必要になります。
次のようなデータがあります。
今は、A列のNOは単なる数値の連番になっています。
オートフィルターをつかって、C列の売上高が2000以上のデータを抽出してみます。
売上高のオートフィルターにある「数値フィルター」の「指定の値以上」を使います。
オートフィルターオプションダイアログボックスが表示されます。
2000以上のデータが抽出されました。
これを連番で表示したいというわけです。
非表示に対応するには、SUBTOTAL+COUNTA関数というのがお馴染みなのですが、欠陥があるのです。
=SUBTOTAL(103,$B$2:B2)
この数式を説明すると、SUBTOTAL関数の集計方法「103」というのは、COUNTA関数と同じことをするのですが、行が非表示になるとそれを除いて、数えてくれるわけです。
そして、範囲を、B2を起点とするために、開始のほうだけ、絶対参照を設定します。
こうすることで、データの範囲の拡張するにあわせて、参照する範囲を延ばすことができます。
では、通常の行の非表示を行って、動きを確認してみましょう。
別に問題はないように思えますが、先程のオートフィルターをつかって、売上高2000円以上のデータを抽出してみましょう。
非表示にした行は戻しておきます。
最終データの四谷。
2000円以上でないのに表示されています?
おかしな現象は、オートフィルターオプションを表示させる前に見えていました。
ところが表示されていない。
SUBTOTAL関数を使う前は、表示されていました。
どうやら、SUBTOTAL関数は、「小計」を算出する関数なので、最終行を「合計行」という認識になっているようです。
つまりデータ行ではないので、含めないで処理をしてしまうようです。
四谷の下に、合計を算出した行を追加してみると、理解できます。
これで、先程と同じようにオートフィルターでデータを抽出してみましょう。
このように、SUBTOTAL関数をつかった表でオートフィルターを使うときには注意が必要です。
では、非表示に対応した連番はつくることができないのでしょうか?
実は、SUBTOTAL関数の進化版というべきAGGREGATE関数を使うことで対応することができます。
=AGGREGATE(3,5,$B$2:B2)
という数式を設定しています。
引数の3は、集計方法で、COUNTA関数と同じ動きをします。
引数の5は、オプション設定で、非表示に対応することができるようになります。
改めて、売上高2000円以上で抽出してみましょう。
この差はなんなのかというと、
SUBTOTAL関数は、「小計」でAGGREGATE関数は、「集計」をします。
微妙ですが、全く異なっていますので、SUBTOTAL関数で希望通りにならない時には、AGGREGATE関数をつかって確認してみるというのもいいかもしれませんね。