Excelで福利厚生グループ×勤続年数の付与(アクルーアル)を自動計算する方法|INDEX+MATCHで交点参照

福利厚生の付与(アクルーアル)はグループと勤続年数で変わるため、手計算や目視はミスの元です。Excelでクロス表(行=グループ、列=勤続年数)から交点の値を自動で返す数式を、現場で壊れにくいコツと一緒に解説します。

目次

やりたいこと:入力した「グループ名」と「勤続年数」から付与(アクルーアル)を一発で返す

人事・総務の現場では、福利厚生(Benefit)グループごとに、勤続年数(Years of Service)に応じた付与(Accrual)値が変わるケースがよくあります。たとえば「休暇付与日数」「ポイント付与」「拠出額」など、数値が段階的に増える設計です。

このとき、よくある管理表は行にグループ、列に勤続年数を並べたクロス表(マトリクス表)です。入力した条件に一致する交点(該当セル)を数式で返せれば、給与計算や人員異動のたびに目視で拾う作業が不要になり、転記ミスも激減します。

まず確認:クロス表が「数式で参照しやすい形」になっているか

交点参照の数式はシンプルですが、表の作りが原因で一致判定が外れることがあります。最初に次の点をチェックしてください。

  • 行見出し(グループ名)が1列にまとまっている(結合セルは避ける)
  • 列見出し(勤続年数)が数値として並んでいる(「1年」「3年」などの文字列は要注意)
  • 値エリアが連続した長方形の範囲になっている(途中に空行・空列を作らない)
  • 同じグループ名が重複していない(重複があると「どの行を返すか」が曖昧になる)

サンプル:福利厚生グループ×勤続年数のクロス表

例として、次のような表を想定します(列見出しは「0, 1, 3, 5, 10」のように数値)。

Benefitグループ013510
Standard05101520
Premium07121722
Part-time036912

この表をExcel上で配置するときは、たとえば次のようなイメージです。

  • 列見出し(年数):C2:L2(例では C2=0, D2=1, E2=3…)
  • 行見出し(グループ):B3:B12
  • 値エリア(付与値):C3:L12

入力セルは、P1=グループ名、P2=勤続年数(年数区分)、結果を出すセルをP3とします。セル番地は一例なので、実際のシートに合わせて読み替えてください。

採用率が高い定番:INDEX + MATCH で「交点の値」を返す

クロス表の交点を返す最も定番の方法がINDEX関数 + MATCH関数です。MATCHで「何行目」「何列目」かを求めて、INDEXでその交点を取りにいきます。

古いExcelでも使える(XMATCH不要):INDEX + MATCH

=INDEX($C$3:$L$12, MATCH($P$1, $B$3:$B$12, 0), MATCH($P$2, $C$2:$L$2, 0))

この式の意味を分解すると、次の通りです。

  • MATCH($P$1, $B$3:$B$12, 0):P1のグループ名が、B3:B12の何行目にあるか(完全一致)
  • MATCH($P$2, $C$2:$L$2, 0):P2の勤続年数が、C2:L2の何列目にあるか(完全一致)
  • INDEX($C$3:$L$12, 行番号, 列番号):値エリアの交点を返す

ポイントは、表の範囲を$で固定(絶対参照)していることです。P1やP2は入力セルなので状況に応じて固定・相対を決めますが、参照範囲(B3:B12やC3:L12など)は基本的に固定しておくと、式をコピーしても崩れません。

実データでの動きをイメージする

たとえば P1 に「Premium」、P2 に「5」を入れると、行見出し「Premium」と列見出し「5」の交点なので、サンプル表では17が返ります。目視で拾っていた作業を、数式が自動で代替します。

新しめのExcelなら:INDEX + XMATCH(検索オプションが強い)

Microsoft 365 や比較的新しいExcelではXMATCHが使えます。基本の考え方はMATCHと同じですが、検索方向や近似の挙動などを引数で細かく指定でき、将来的に表が伸びる運用でも柔軟です。

=INDEX($C$3:$L$12, XMATCH($P$1, $B$3:$B$12), XMATCH($P$2, $C$2:$L$2))

XMATCHは既定で完全一致なので、まずはこの形でOKです。勤続年数の列が「0,1,3,5,10…」のように増えていく表なら、近似一致や検索方向の指定も検討できます(後述)。

別解:VLOOKUP + MATCH(古い資料でも見かける)

「行はVLOOKUPで探して、列番号はMATCHで決める」という組み合わせもあります。現場の既存ファイルでよく見かける形なので、読み方として知っておくと便利です。

=VLOOKUP($P$1, $B$3:$L$12, MATCH($P$2, $B$2:$L$2, 0), 0)

この式で重要なのは、MATCHの範囲を$B$2:$L$2のように「B列の見出し(文字列)」も含めている点です。VLOOKUPの列番号は、検索範囲の左端(ここではB列)を「1」として数えるため、年数の見出しだけ(C2:L2)でMATCHすると列番号が1つずれてしまいます。

ただしVLOOKUPは、構造上「検索列が一番左」にある必要があり、列の追加や並べ替えに弱い面があります。長期運用で壊れにくいのは、やはりINDEX + (X)MATCHです。

勤続年数が「区分」ではなく「実年数」のときにハマりやすいポイント

質問の前提では P2 に「年数区分」(例:1,3,5…)を入れていますが、実務では「2.4年」「7年」「12年」のように実年数が入ってくることもあります。この場合、列見出しと完全一致しないため、上の式はそのままだと一致せずエラーになります。

パターンA:列見出しが境界(◯年以上)なら近似一致で拾う

列見出しが「0,1,3,5,10…」で、意味が「0年以上」「1年以上」「3年以上」…のような境界なら、直近の下側境界を選べばよいので近似一致が使えます。列見出しが昇順に並んでいることが条件です。

=INDEX($C$3:$L$12, MATCH($P$1, $B$3:$B$12, 0), MATCH($P$2, $C$2:$L$2, 1))

MATCHの第3引数を「1」にすると、P2以下で最大の値(つまり最も近い下側境界)を返します。たとえば P2=7 なら「5」の列を選び、P2=12 なら「10」の列を選ぶイメージです。

注意:近似一致は並び順が崩れると誤答になります。年数列に途中で「8」を追加したのに並び替えしていない、見出しが文字列扱いで「10」が「1」の次に来る、などは典型的な事故パターンです。

パターンB:年数区分を別セルで作ってから完全一致で参照する

近似一致を数式に直接入れるのが怖い場合は、年数区分を先に求めるのが堅実です。たとえば Q2 に「実年数」、R2 に「区分年数」を作り、R2を参照して完全一致でINDEX+MATCHする設計です。

区分の作り方はいくつかあります。古いExcelでも動き、シンプルで壊れにくいのが LOOKUP を使う方法です(境界が昇順であることが前提)。

=LOOKUP($Q$2, {0,1,3,5,10}, {0,1,3,5,10})

R2にこの式を入れると、Q2=7なら5、Q2=12なら10を返します。あとは先ほどのINDEX+MATCHのP2部分をR2に置き換えれば、表の見出しと完全一致できるため、交点参照が安定します。

境界が頻繁に変わる運用なら、配列を直書きせず、境界一覧を別表にして参照する方がメンテしやすいです。

一致しない原因の大半は「見出しが数値ではなく文字列」問題

勤続年数の列見出しが「1年」「3年」「5年」のような文字列だと、P2に数値の1や3を入れても一致しません(逆も同様です)。また、見た目は「1」でも実態が文字列のこともあり、MATCHが#N/Aになる原因になります。

見出しが「1年」になっている場合の整形例

列見出しが「1年」のように単位つきなら、ヘッダー行を数値だけにするのが最も安全です。どうしても「年」を残したいなら、表示形式で見た目だけ「1年」にする方法が使えます。

  • 見出しセルを数値の「1,3,5…」にする
  • セルの表示形式をユーザー定義で0″年”にする(値は数値のまま)

この方法なら、MATCHは数値として正しく一致しつつ、表の見た目も「◯年」にできます。

入力側が文字列になっている場合の応急処置

入力セルP2が文字列の「5」になってしまう場合は、VALUE関数で数値化できます。

=VALUE($P$2)

ただし、根本対策としては入力規則(プルダウン)や、入力セルの表示形式・データ型を揃える方が長期的に安定します。

実務で壊れにくくする:入力ミスを防ぐ仕組みとエラー処理

入力規則(プルダウン)で「存在しないグループ名」を防ぐ

P1のグループ名は、手入力だとスペル違い・全角半角・余計なスペースで一致しないことがあります。おすすめは、B3:B12(グループ一覧)を参照したデータの入力規則でプルダウン化することです。

  • P1を選択 → 「データ」タブ → 「データの入力規則」
  • 「リスト」を選び、元の値に =$B$3:$B$12 を指定

これだけで、MATCHの#N/Aの大半を潰せます。

IFERRORで見た目を整える(エラーを出さない)

入力が空欄のときや、まだマスタ表が埋まっていないときに#N/Aが出るのが気になる場合は、IFERRORで包みます。

=IFERROR(INDEX($C$3:$L$12, MATCH($P$1, $B$3:$B$12, 0), MATCH($P$2, $C$2:$L$2, 0)), "")

空文字(””)の代わりに「該当なし」などのメッセージにしてもOKです。運用ルールに合わせて決めましょう。

見出し・範囲が増える表は「テーブル化」で参照崩れを防ぐ

福利厚生制度は改定で列や行が増えがちです。範囲が増えるたびに $C$3:$L$12 を手で直すのは事故の元なので、可能ならデータ範囲をExcelテーブル(Ctrl+T)にして、拡張に強い設計にします。

テーブル名を tblAccrual とし、左端列が [Group]、年数列が複数ある形なら、参照はやや工夫が必要ですが、少なくとも「グループ一覧」「年数見出し」「値エリア」を名前定義しておくと保守が楽になります。

Microsoft 365ならLETで「読める数式」にする

数式が長くなると、どこを直せばいいか分からなくなります。Microsoft 365なら LET を使って変数化すると、同じINDEX+MATCHでも読みやすさが段違いです。

=LET(
  group, $P$1,
  yos, $P$2,
  groups, $B$3:$B$12,
  years, $C$2:$L$2,
  values, $C$3:$L$12,
  IFERROR(INDEX(values, MATCH(group, groups, 0), MATCH(yos, years, 0)), "")
)

式の意図が見えるので、引き継ぎや監査対応でも説明しやすくなります(LETが使えない環境なら、基本形のINDEX+MATCHをそのまま使えばOKです)。

現場でよくあるトラブルと対処法

症状よくある原因対処法
#N/A が返るグループ名や年数が見出しと一致していない(スペース、全角半角、数値/文字列の違い)入力規則で選択式にする/TRIMで空白除去/見出しを数値に統一する
値は出るが違う列を拾う近似一致(MATCHの第3引数=1)なのに列見出しが昇順になっていない列見出しを昇順に並べ替える/完全一致に戻す/年数区分を別セルで作る
列を追加したら結果がズレたVLOOKUPの列番号が固定値、または見出し範囲がずれているVLOOKUP+MATCHにする/INDEX+MATCHへ移行する
同じグループ名が複数あって不安マスタが正規化されていない、部署別などで重複しているグループキーを一意にする(コード列を追加)/表を縦持ちにして管理する
制度改定で年数区分が増える範囲固定のため、数式の参照範囲を手修正する必要が出るテーブル化・名前定義で範囲を自動拡張にする/LETで参照を一箇所にまとめる

(発展)クロス表が限界なら「縦持ち(正規化)」も検討する

クロス表は見やすい反面、制度改定で列が増えるほど参照範囲が広がり、別システムへの連携や集計がやりづらくなります。長期運用でデータ活用まで視野に入れるなら、次のような縦持ちに変換して管理するのも手です。

GroupYearsAccrual
Standard15
Standard310
Premium517

縦持ちなら、XLOOKUPやFILTER、ピボットテーブル、Power Query(アンピボット)との相性が良く、データ基盤として扱いやすくなります。ただし、現場の運用がクロス表に慣れている場合は、まずは本記事のINDEX+MATCHで「交点参照」を安定させるのが現実的です。

まとめ:交点参照をテンプレ化するとマスタ運用が一気に楽になる

福利厚生グループ×勤続年数の付与(アクルーアル)を自動で返すなら、INDEX + (X)MATCHが最短かつ堅牢です。表の見出しを数値で揃え、入力をプルダウン化し、必要に応じて近似一致や区分作成を組み合わせれば、制度改定にも耐える「壊れにくいExcel」が作れます。

まずは、クロス表の範囲を決め、P1(グループ)とP2(勤続年数)から交点を返す式を入れてみてください。そこから入力規則やIFERRORを足していくと、実務で安心して回せる仕組みに仕上がります。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次