「この部門は全体の何パーセント?」と聞かれて、電卓で割り算してからセルに打ち直していませんか。データが増えるたびに数式を作り直すのは地味にストレスですよね。Microsoft 365で使えるPERCENTOF関数なら、全体に対する割合を引数2つで自動計算できます。GROUPBYやPIVOTBYと組み合わせれば、部門別構成比やクロス集計の割合表も一発で出せるのが特徴です。この記事では基本の構文から実務での組み合わせワザ、エラーの対処法まで、コピペで試せる例つきで丸ごと紹介します。
この記事は次のような人におすすめ
- 売上データの構成比を手計算で出していて手間を減らしたい
- GROUPBY関数やPIVOTBY関数と組み合わせて部門別・商品別の割合を一発で求めたい
- PERCENTOF関数とSUMIF・SUMPRODUCTの使い分けが知りたい
- #DIV/0!や#SPILL!エラーが出る原因と直し方を押さえたい
PERCENTOF関数とは?
PERCENTOF(パーセントオブ)関数は、ある数値の合計が全体の合計に対して何パーセントかを返す関数です。英語の「percent of」はそのまま「〜に対する割合」という意味で、名前のとおりの仕事をしてくれます。
たとえば「営業部の売上が全社売上の何%か」を求めたいとき、手動なら営業部の合計を全社合計で割りますよね。PERCENTOF関数はこの割り算を自動でやってくれます。戻り値は0〜1の小数値です。セルにパーセンテージ書式を適用すると「45%」のように表示されます。
この関数の真価は単独使用ではなく、GROUPBYやPIVOTBYとの組み合わせにあります。集計関数として渡すだけで、グループごとの構成比を一括計算できるのが強みです。SUMIFS関数を使って部門ごとに数式を作り、最後にSUM全体で割って構成比を出す……という従来の手間を、関数1つにまとめられます。
PERCENTOF関数はMicrosoft 365専用の関数です。Excel 2021・Excel 2019などの永続ライセンス版では使用できないので、配布先の環境には注意してください。
NOTE
PERCENTOFはGROUPBY・PIVOTBY関数と同じく「Excelで集計をもっとモダンにする」シリーズの一員として追加されました。集計の発想がピボットテーブルから「関数で動的に組み立てる」スタイルへ移っていくイメージです。
PERCENTOF関数の書き方(構文と引数)
基本構文
=PERCENTOF(データの一部, データの全体)
引数の説明
| 引数 | 必須/省略可 | 説明 |
|---|---|---|
| データの一部(data_subset) | 必須 | 全体のうち、割合を求めたい部分の範囲 |
| データの全体(data_all) | 必須 | 比較の基準となる完全なデータセット |
引数は2つだけです。「一部 ÷ 全体」の構造なので、数式の読み方もシンプルですね。
数学的にはSUM(データの一部)/SUM(データの全体)と同じ計算です。ただしPERCENTOF関数の本領は、GROUPBYやPIVOTBYの集計関数として使うところにあります。単独で使う場面はかなり限定的だと思っておくと、後のセクションがスッと頭に入ります。
NOTE
戻り値は小数値(例: 0.45)です。「45%」と表示するにはセルの書式をパーセンテージに変更してください。Ctrl+Shift+5 のショートカットで一発切り替えできます。
引数の動き方をもう少し具体的に
データの一部とデータの全体は、どちらも範囲・配列・1つの数値を渡せます。両方とも数値以外の値はSUMと同じく無視されるので、ヘッダー行を巻き込んでもエラーにはなりません(ただし全体に数値がないとゼロ除算になります)。
| 引数の例 | 計算される値 |
|---|---|
=PERCENTOF(100, 400) | 100 ÷ 400 = 0.25(25%) |
=PERCENTOF(B2:B3, B2:B6) | SUM(B2:B3) ÷ SUM(B2:B6) |
=PERCENTOF(B2:B6, B2:B6) | 必ず1(100%) |
「一部」と「全体」が同じ範囲なら必ず100%になるので、検算用にも使えますよ。
PERCENTOF関数の基本的な使い方
次のような売上データがA1:B6にあるとします(1行目がヘッダー)。
| 部門 | 金額 |
|---|---|
| 営業部 | 195000 |
| 開発部 | 90000 |
| 総務部 | 53000 |
| 人事部 | 42000 |
| 広報部 | 20000 |
営業部の金額が全体に対して何%かを求めるには、次のように書きます。
=PERCENTOF(B2,B2:B6)
第1引数にB2(営業部の金額)、第2引数にB2:B6(全部門の金額)を指定しました。結果は0.4875と返ります。パーセンテージ書式を適用すると「48.8%」と表示されます。
これはSUM(B2)/SUM(B2:B6)と同じ結果です。単独で使うなら手動の割り算でも十分ですよね。
全部門の構成比を一気に求めたい場合
「営業部だけでなく、全部門の構成比をC2:C6に一括で並べたい」というケースは、配列を意識した書き方が便利です。スピル機能と合わせて次のように書いてみましょう。
=PERCENTOF(B2:B6,B2:B6)
C2に入力するとC2:C6にそれぞれの構成比がスピル展開されます……と言いたいところですが、PERCENTOFは第1引数を「一部の合計」として扱うため、すべてのセルで1(100%)が返ってしまいます。1行ずつの構成比を出したいなら、ここはBASIC的に=B2/SUM($B$2:$B$6)の方が素直です。
=B2/SUM($B$2:$B$6)
C2に入れて下方向にコピーすれば、全部門の構成比がきれいに並びます。PERCENTOF関数のうまみは次のセクションで紹介するGROUPBYやPIVOTBYと一緒に使ったときに発揮されるので、単独使用にこだわる必要はありません。
実践的な使い方・応用例
GROUPBYで部門別売上構成比を求める
PERCENTOF関数の最も実用的な使い方が、GROUPBY関数の集計関数として渡すパターンです。
次のような売上データがA1:C101にあるとします(1行目がヘッダー、100行分のデータ)。A列が「部門」、B列が「商品」、C列が「金額」です。
部門ごとの売上構成比を求めるには、次のように書きます。
=GROUPBY(A2:A101,C2:C101,PERCENTOF)
結果はスピルで展開され、以下のような表が自動生成されます。
| 部門 | 構成比 |
|---|---|
| 営業部 | 0.46 |
| 開発部 | 0.28 |
| 総務部 | 0.15 |
| 人事部 | 0.11 |
集計関数の部分にSUMやAVERAGEの代わりにPERCENTOFを書くだけです。各部門の金額合計を全体の金額合計で割った構成比が一括で求まります。SUMIFS関数で部門ごとに数式を作って合計で割る、という手間が不要になりますよ。
TIP
結果のセル範囲を選択してパーセンテージ書式(Ctrl+Shift+5)を適用すると「46%」「28%」のように見やすくなります。スピル範囲全体に書式を当てる場合は、左上のセルを選んでからCtrl+Shift+Endで範囲を広げると楽です。
PIVOTBYで2軸クロス集計に割合を表示する
PIVOTBY関数と組み合わせれば、クロス集計表の値を割合で表示できます。
同じ売上データ(A列: 部門、B列: 商品、C列: 金額)を使って、部門 × 商品のクロス表を構成比で表示してみましょう。
=PIVOTBY(A2:A101,B2:B101,C2:C101,PERCENTOF)
| 商品A | 商品B | 商品C | |
|---|---|---|---|
| 営業部 | 0.18 | 0.15 | 0.13 |
| 開発部 | 0.10 | 0.12 | 0.06 |
| 総務部 | 0.08 | 0.05 | 0.02 |
| 人事部 | 0.04 | 0.03 | 0.04 |
既定ではすべてのセルが「全体の総計に対する割合」を表示します。PIVOTBYのpercent_of引数(後ろから数えて使う割合の基準)を指定すると、割合の基準を切り替えられます。
=PIVOTBY(A2:A101,B2:B101,C2:C101,PERCENTOF,,,,,,, 0)
| 基準の値 | 意味 | 例 |
|---|---|---|
| 0 | 各列の合計に対する割合 | 商品Aの列内での構成比 |
| 1 | 各行の合計に対する割合 | 営業部の行内での構成比 |
| 2 | 総計に対する割合(既定) | 全体に対する構成比 |
たとえば「部門ごとに、その部門の売上を商品別に分解したい」場合は基準に1(行合計)を指定します。営業部の行がすべて合計100%になるイメージです。「商品ごとに、どの部門で売れているか」を見たい場合は基準に0(列合計)を指定すると、商品Aの列だけで100%になります。
TIP
どの基準を指定するか迷ったら「分母にしたい数字は何か?」を先に決めるとブレません。部門ごとの内訳が見たい → 行合計。商品ごとの内訳が見たい → 列合計。全社の中での位置が見たい → 総計、というように使い分けます。
HSTACKで合計と割合を同時に表示する
GROUPBYの集計関数にHSTACK関数で複数の関数をまとめると、件数・合計・構成比を1つの表で並べて表示できます。
=GROUPBY(A2:A101,C2:C101,HSTACK(COUNT,SUM,PERCENTOF),1)
| 部門 | 件数 | 合計 | 構成比 |
|---|---|---|---|
| 営業部 | 35 | 1840000 | 0.46 |
| 開発部 | 28 | 1120000 | 0.28 |
| 総務部 | 22 | 600000 | 0.15 |
| 人事部 | 15 | 440000 | 0.11 |
第4引数に1を指定してヘッダーを非表示にしています。HSTACK(COUNT,SUM,PERCENTOF)と書くだけで3種類の集計が横に並びます。件数と合計額を確認しながら構成比も見られるので、報告資料にそのまま使えますよ。
累積構成比(ABC分析)を作る
報告資料でよく聞かれる「上位の商品で売上の何%を占めているか」というABC分析にもPERCENTOFが役立ちます。商品ごとの売上合計を構成比でランキングしたあと、SCAN関数を組み合わせて累積構成比を計算します。
=LET(
result, GROUPBY(B2:B101,C2:C101,PERCENTOF,3,,-2),
vals, INDEX(result,,2),
累積, SCAN(0,vals,LAMBDA(a,v,a+v)),
HSTACK(result, 累積)
)
GROUPBYで商品別の構成比を降順ソートし、SCANで上から順番に足し上げると、Aランク(累積80%まで)・Bランク(90%まで)・Cランク(残り)の判定がそのまま使えます。「定番商品を切り捨てない」「販促を集中させる」といった意思決定の根拠データに使えますね。
条件付きの構成比(特定カテゴリだけの割合)
「東日本エリアだけに絞った構成比を出したい」というように、フィルター後の構成比を求めたい場合はFILTER関数とのネストが便利です。
=GROUPBY(
FILTER(A2:A101,D2:D101="東日本"),
FILTER(C2:C101,D2:D101="東日本"),
PERCENTOF
)
D列にエリア区分が入っているとして、FILTERで東日本のレコードだけ抜き出してからGROUPBYに渡しています。これでエリアごとの構成比を「分母も含めて東日本だけ」で計算できます。
目標値に対する達成率を求める
PERCENTOFの第2引数は「全体の合計」を指す引数ですが、ここに目標値を渡せば達成率の計算にも転用できます。たとえば部門別売上が今期の目標2,000,000円に対して何%達成しているかを見たい場合、次のように書きます。
=PERCENTOF(B2,2000000)
GROUPBY結果と並べて表示するなら、第2引数に絶対参照の目標値セル(例: $E$1)を渡すパターンが扱いやすいです。「全体の中の割合」だけでなく「ベンチマーク値に対する比率」も同じ関数で表現できると覚えておくと、報告資料の幅が広がります。
月次推移レポートで「前年同月比の構成比」を求める
「今年の構成比は去年と比べてどう変わったか」を月次でモニタリングしたいときは、PERCENTOFの結果を年度ごとに並べる方法が便利です。A列に年度、B列に部門、C列に金額が入ったデータがあるとき、年度別の構成比表は次のように書けます。
=PIVOTBY(B2:B201,A2:A201,C2:C201,PERCENTOF,,,,,,, 0)
第10引数(割合の基準)に0を渡すと「各列(年度)の合計に対する割合」になります。同じ部門の構成比が年度ごとにどう変化したかを横並びで見られるので、「広報部の構成比が今年は2ポイント減」というような変化点をすぐ拾えます。マーケティング会議の定例レポートにそのまま貼り付けられますよ。
TEXT関数で構成比を見やすく整形する
GROUPBYやPIVOTBYの結果セルに直接パーセンテージ書式を当てる方法とは別に、TEXT関数で文字列として整形するパターンもあります。報告メール本文に貼り付けたい場合や、CONCAT関数で文章を組み立てたい場合に使えます。
=TEXT(PERCENTOF(B2,B2:B6),"0.0%")
結果は「48.8%」のような文字列として返ります。「営業部は全体の” & TEXT(PERCENTOF(B2,B2:B6),”0.0%”) & “を占めています」のように、説明文の中に組み込みやすいですよ。SUMIFやSUM関数で集計したあとに比率を出す場面でも同じテクニックが使えます。
よくあるエラーと対処法
PERCENTOF関数で発生しやすいエラーは#DIV/0!と#SPILL!の2種類です。原因と対処を整理しておきましょう。
#DIV/0! エラー
data_allが空またはゼロの場合: 全体の合計がゼロになるため、ゼロ除算で#DIV/0!が発生します。データ範囲が正しく指定されているか確認してください。フィルター後の空配列を渡しているケースも要注意です。
data_allにテキスト値しか含まれない場合: PERCENTOF関数はSUMと同様に数値のみを合計します。数値が1つもないとSUMの結果がゼロになり、#DIV/0!エラーになります。対象範囲に数値列を指定しているか確認しましょう。
IFERRORで0%に置き換える: エラーをそのまま表示したくない場合は、=IFERROR(PERCENTOF(B2,B2:B6),0)のようにIFERRORで包むのが定番です。
NOTE
テキスト列しかないデータで「各グループの件数割合」を出したい場合は、回避策として
data^0を使います。=GROUPBY(A2:A101,B2:B101^0,PERCENTOF)のように書くと、B列の全要素が1に変換されてカウントベースの割合計算になります。
#SPILL! エラー
GROUPBYやPIVOTBYとの組み合わせで、スピル先のセルにすでにデータが入っていると#SPILL!エラーになります。結果が展開される範囲を空けてから入力し直してください。スピル範囲の予測は、結果セルにマウスを乗せたときに表示される青枠で確認できます。
#NAME? エラー
数式に#NAME?が表示される場合は、ExcelのバージョンがMicrosoft 365でない可能性が高いです。Excel 2021以前ではPERCENTOFが未実装なので、関数名として認識されません。古い環境にファイルを渡す予定があるなら、最初から手動の割り算かSUMIFで設計したほうが安全です。
#N/A エラー(配列の長さ違い)
data_subsetとdata_allが「同じ次元のデータ」であることが前提です。GROUPBY経由ではなく自分で配列計算する場合、行数が違う配列を渡すと#N/Aや#VALUE!になることがあります。FILTERで絞り込んだ範囲を渡すときは、両方の引数に同じFILTERを適用するなど、対称な書き方を心がけましょう。
似た関数・他の方法との使い分け
PERCENTOF関数の計算自体は、手動の割り算と同じです。実務で迷わないように、関数の役割を整理しておきましょう。
| 方法 | 書き方の例 | 特徴 |
|---|---|---|
| 手動の割り算 | =B2/SUM(B2:B6) | どのバージョンでも使える。行ごとに数式を書く必要がある |
| PERCENTOF単独 | =PERCENTOF(B2,B2:B6) | 手動割り算と同等。単独使用のメリットは少ない |
| SUMIF + SUM | =SUMIF(A:A,”営業部”,C:C)/SUM(C:C) | Excel 2019以前でも動く。部門ごとに数式を書く必要あり |
| GROUPBY + PERCENTOF | =GROUPBY(A:A,B:B,PERCENTOF) | グループごとの構成比を一括計算。数式1つで完結 |
| PIVOTBY + PERCENTOF | =PIVOTBY(A:A,B:B,C:C,PERCENTOF) | 2軸クロス表で構成比を表示。基準も切り替え可能 |
| ピボットテーブル | 「総計に対する比率」 | GUI操作。データ更新には手動の「更新」が必要 |
PERCENTOF関数を単独で使うなら=B2/SUM(B2:B6)で十分です。わざわざ関数を使う必要はありません。PERCENTOF関数の真価は、GROUPBYやPIVOTBYの集計関数として渡すところにあります。「集計 + 割合計算」を1つの数式にまとめられるのが最大のメリットです。
互換性が必要な場面(Excel 2019以前を含む配布物)では、SUMIF関数とSUMの組み合わせが現実解になります。ファイルを誰に渡すかで使い分けるのがおすすめです。
よくある質問(FAQ)
faq q=”PERCENTOF関数はExcel 2021でも使えますか?” a=”使えません。Microsoft 365専用の関数で、Excel 2021・Excel 2019・Excel 2016などの永続ライセンス版では#NAME?エラーになります。互換性が必要なファイルでは[SUMIF関数・SUMIFSとSUMの組み合わせを使うか、ピボットテーブルの「総計に対する比率」機能で代用してください。”]
[faq q=”結果が「0.46」のように小数で表示されます。「46%」と表示したいです。” a=”セルの表示形式を「パーセンテージ」に切り替えてください。対象セルを選んでCtrl+Shift+5 を押すと一発で適用できます。小数点以下の桁数を増やしたい場合は、書式設定ダイアログから「46.5%」のように調整可能です。表示だけが変わり、内部の値(0.46)はそのままなので、後段の計算にも問題ありません。”]
[faq q=”ピボットテーブルとPERCENTOFはどちらを使うべきですか?” a=”データソースが頻繁に変わる・データ範囲がテーブル機能で動的に伸びる用途なら関数ベース(GROUPBY + PERCENTOFやPIVOTBY + PERCENTOF)がおすすめです。元データを更新するだけで結果が再計算されます。一方、配布資料として一度だけ作成する・複雑なフィールド配置や階層が必要なケースではピボットテーブルが向いています。レポートを毎月使い回すなら関数派、その場限りの集計ならピボット派、と考えると整理しやすいです。”]
[faq q=”割合の合計が100%にならないことがあります。なぜですか?” a=”表示桁数を丸めた結果、合計が99.9%や100.1%になることがあります。PERCENTOFの内部値は正確なので、書式の小数点以下を1〜2桁増やすと改善することが多いです。どうしても合計を100%ぴったりにしたい場合は、最後の行だけ「=1-SUM(直前まで)」で差分を当てる、いわゆる「最大要素にしわ寄せ法」がよく使われます。”]
[faq q=”GROUPBYでPERCENTOFを使うと結果が降順に並びません。” a=”GROUPBY関数の第6引数(並び順)に-2を指定すると、集計値の降順で並びます。例: =GROUPBY(A2:A101,C2:C101,PERCENTOF,3,,-2)。-1はキー列の降順、2は集計値の昇順です。報告資料では「構成比が大きい順」に並ぶほうが読み手にやさしいので、-2を覚えておくと便利ですよ。”]
[faq q=”PERCENTOFを使うとセル参照が固定されません。コピペするときの注意点はありますか?” a=”PERCENTOFを単独でセルにコピペする場合は、=PERCENTOF(B2,$B$2:$B$6)のように第2引数を絶対参照にしておくのが定石です。GROUPBY・PIVOTBYと一緒に使う場合はスピル展開されるので、参照固定を気にする必要はほぼありません。”]
[faq q=”テーブル機能(構造化参照)と一緒に使えますか?” a=”はい、相性は良いです。元データをCtrl+T でテーブル化しておけば、=GROUPBY(売上[部門],売上[金額],PERCENTOF)のように構造化参照で書けます。行が追加されてもテーブル範囲が自動拡張されるので、参照範囲を直す手間がなくなり、月次レポートの運用がとても楽になりますよ。”]
faq q=”PERCENTOFと[COUNTIF関数を組み合わせて構成比を出せますか?” a=”はい、可能です。たとえば部門別の件数構成比を出すなら、=COUNTIF(A:A,A2)/COUNTA(A:A)のような割り算を従来は使っていました。これをGROUPBYとPERCENTOFで書き直すなら、=GROUPBY(A2:A101,A2:A101^0,PERCENTOF)のように「キー列のべき乗で全要素を1に変換」してから集計する方法が便利です。テキスト列でも件数ベースの構成比をPERCENTOFで扱えます。”]
まとめ
PERCENTOF関数は「全体に対する割合」を求める関数です。構文は=PERCENTOF(データの一部, データの全体)で、引数は2つだけとシンプルです。
単独使用では手動の割り算と変わりませんが、GROUPBYやPIVOTBYの集計関数として渡すことで真価を発揮します。GROUPBY + PERCENTOFで部門別構成比を一括計算でき、PIVOTBY + PERCENTOFで2軸クロス集計表に割合を表示できます。HSTACKと組み合わせれば件数・合計・構成比を横並びで表示することも可能で、SCANと組み合わせればABC分析の累積構成比も自動化できます。
Microsoft 365専用という制約はあるものの、構成比を求める作業が多い方にはぜひ習慣化してほしい関数です。ピボットテーブルでは少し手間な「データ更新と再表示」が、関数なら入力データを直すだけで自動更新されるのが大きなアドバンテージですね。
GROUPBY関数やPIVOTBY関数の詳しい使い方は、それぞれの解説記事もあわせて確認してみてください。集計系関数を一覧で見比べたい方は Excel関数一覧【機能別】 もぜひ参考にしてみてくださいね。
