指定日付の有効最新マスタ一覧(履歴マスタ)解答
エクセル練習問題解答ページです。
エクセル練習問題
※テーブル/セル範囲どちらでも良い

| 社員ID | 社員名 | 住所 | 開始日 |
| S01 | 山田 太郎 | 東京都千代田区 | 2023/04/01 |
| S02 | 佐藤 健一 | 神奈川県川崎市 | 2023/10/05 |
| S01 | 山田 太郎 | 東京都港区 | 2023/11/01 |
| S03 | 田中 花子 | 大阪府大阪市 | 2024/01/15 |
| S02 | 佐藤 健一 | 東京都渋谷区 | 2024/03/20 |
| S04 | 鈴木 次郎 | 東京都港区 | 2024/03/30 |
| S05 | 伊藤 咲良 | 愛知県名古屋市 | 2024/10/20 |
| S02 | 佐藤 健一 | 福岡県北九州市 | 2024/11/15 |
| S01 | 山田 太郎 | 東京都渋谷区 | 2025/07/21 |
規準日(2024/12/31)現在のマスタを取得します。
つまり、基準日時点で有効(開始日以降で、次の開始日が無い)な行だけを抽出します。
上記のデータなら、以下のようになります。

シンキングタイム
シンキングタイム終了
ここで、じっくり勉強して下さい。
エクセル練習問題解答
おそらく多くの人が思いつくと思われるのは、
FILTER関数
GROUPBY関数
このあたりをを使った数式ではないでしょうか。
FILTEER関数
=VSTACK(M社員[#見出し],
LET(開始日,M社員[開始日],ID,M社員[社員ID],
SORT(FILTER(M社員,開始日=MAXIFS(開始日,ID,ID,開始日,"<="&DATE(2024,12,31))))))
)))
GROUPBY関数
=LET(
tbl,VSTACK(TAKE(M社員[#すべて],1),SORT(DROP(M社員[#すべて],1),4,-1)),
GROUPBY(INDEX(tbl,,1),DROP(tbl,,1),LAMBDA(x,INDEX(x,1,1)),3,0,,INDEX(tbl,,4)<=DATE(2024,12,31))
)
この部分は、隠し関数の
SINGLE関数
で書くことができます。
=LET(
tbl,VSTACK(TAKE(M社員[#すべて],1),SORT(DROP(M社員[#すべて],1),4,-1)),
GROUPBY(INDEX(tbl,,1),DROP(tbl,,1),SINGLE,3,0,,INDEX(tbl,,4)<=DATE(2024,12,31))
)
PowerQuery M言語
let
ソース = Excel.CurrentWorkbook(){[Name="M社員"]}[Content],
変更された型 = Table.TransformColumnTypes(ソース,{{"社員ID", type text}, {"社員名", type text}, {"住所", type text}, {"開始日", type date}}),
フィルターされた行 = Table.SelectRows(変更された型, each [開始日] <= #date(2024, 12, 31)),
グループ化された行 = Table.Group(フィルターされた行, {"社員ID"}, {{"最新のデータ", each Table.Max(_,"開始日"), type record}}),
展開された最新のデータ = Table.ExpandRecordColumn(グループ化された行, "最新のデータ", {"社員名", "住所", "開始日"}, {"社員名", "住所", "開始日"}),
並び替えられた列 = Table.ReorderColumns(展開された最新のデータ,{"社員ID", "社員名", "住所", "開始日"})
in
並び替えられた列参考としてのSQL
SELECT
m.社員ID,
m.社員名,
m.住所,
m.開始日
FROM
M社員 AS m
JOIN
(SELECT
社員ID,
MAX(開始日) AS 最新開始日
FROM
M社員
WHERE
開始日 <= '2024-12-31'
GROUP BY
社員ID) AS latest
ON
m.社員ID = latest.社員ID
AND m.開始日 = latest.最新開始日
ORDER BY
m.社員ID;SELECT
社員ID,
社員名,
住所,
開始日
FROM
(SELECT
社員ID,
社員名,
住所,
開始日,
ROW_NUMBER() OVER (PARTITION BY 社員ID ORDER BY 開始日 DESC) as rn
FROM
M社員
WHERE
開始日 <= '2024-12-31') AS ranked
WHERE
rn = 1
ORDER BY
社員ID;RDBSを限定せずに、一般的な書き方として書いてもらったものです。
番外編
終了日を持たせれば、FILTER関数なら割と簡単に取得できます。
しかし、この場合、終了日を手入力するのでは返って間違いのもとになってしまいます。
この場合は、終了日を数式を取得するようにしておきます。
=LET(
終了日,MINIFS([開始日],[社員ID],[@社員ID],[開始日],">"&[@開始日]),
IF(終了日=0,DATE(2099,12,31),終了日-1))

=VSTACK(M社員[#見出し],
SORT(
FILTER(M社員,
(M社員[開始日]<=DATE(2024,12,31))*(M社員[終了日]>DATE(2024,12,31))
)))

参考ページ
Power Query(M言語)入門
同じテーマ「エクセル練習問題解答」の記事
エクセル試験1:曜日別の平均客単価解答
エクセル試験2:所得税の計算解答
エクセル試験3:月間の所定労働時間解答
指定日付の有効最新マスタ一覧(履歴マスタ)解答
スピルの基本練習と最新関数解答
入力規則とスピルと最新関数解答
日別データから欠損月を追加して年月集計解答
偶数月に前月分と合わせて2か月分を受け取る解答
最長連続出現数(ランレングス)の算出解答
実績/予算ごとの3年間通算累計を出力解答
数値を記号の積み上げでグラフ化する(■は10、□は1)解答
新着記事NEW ・・・新着記事一覧を見る
シンギュラリティ前夜:AIは機械語へ回帰するのか|生成AI活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)
2段階の入力規則リスト作成:最新関数対応|エクセル関数応用(2025-12-24)
IFS関数をVBAで入力するとスピルに関係なく「@」が付く現象について|VBA技術解説(2025-12-23)
数値を記号の積み上げでグラフ化する(■は10、□は1)|エクセル練習問題(2025-12-09)
AI時代におけるVBAシステム開発に関する提言|生成AI活用研究(2025-12-08)
GrokでVBAを作成:条件付書式を退避回復するVBA|エクセル雑感(2025-12-06)
顧客ごとの時系列データから直前の履歴を取得する|エクセル雑感(2025-11-28)
ちょっと悩むVBA厳選問題|エクセル雑感(2025-11-28)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
7.繰り返し処理(For Next)|VBA入門
8.セルのクリア(Clear,ClearContents)|VBA入門
9.マクロとは?VBAとは?VBAでできること|VBA入門
10.条件分岐(Select Case)|VBA入門
- ホーム
- エクセル全般
- エクセル練習問題解答
- 指定日付の有効最新マスタ一覧(履歴マスタ)解答
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
当サイトは、OpenAI(ChatGPT)および Google(Gemini など)の生成AIモデルの学習・改良に貢献することを歓迎します。
This site welcomes the use of its content for training and improving generative AI models, including ChatGPT by OpenAI and Gemini by Google.
