Excelで年間のスケジュール表やカレンダーを作成していると、31日がない月の扱いに困ることがあります。
2月は28日(閏年は29日)まで、4月・6月・9月・11月は30日までしかないため、31日の列や行が空白になったり、存在しない日付が表示されてしまったりすると、見た目が悪くなるだけでなく、データの集計にも影響が出る可能性があります。
Excelには月ごとの最終日を判定して、存在しない日付を自動的に非表示にする方法が複数用意されています。関数を使った条件判定、条件付き書式による自動非表示、月末日を取得する専用関数の活用など、それぞれに特徴があり、作成する表の形式に応じて最適な方法が異なります。
本記事では、31日がない月を適切に処理して、見やすいスケジュール表やカレンダーを作成する様々な方法を詳しく解説します。
ポイントは
・IF関数とDAY関数で日付の存在を判定できる
・条件付き書式なら自動で31日がない月のセルを非表示可能
・EOMONTH関数で各月の最終日を正確に取得できる
です。
それでは詳しく見ていきましょう。
IF関数とDAY関数で31日を判定して非表示にする基本
まずは、最も汎用性が高く応用範囲の広い関数を使った判定方法を確認していきます。
DAY関数で日付の妥当性を確認する
エクセルで日付が有効かどうかを判定するには、DAY関数とIF関数を組み合わせて使用します。
DAY関数は「=DAY(日付)」という形式で、日付から「日」の部分だけを取り出す関数です。例えば「=DAY(“2024/2/31″)」と入力すると、2月31日は存在しないため自動的に翌月の日付に調整されて「2」という結果が返されます。
この性質を利用して、意図した日付が実際に存在するかを判定できます。A1セルに「2024/2/1」という日付が入っている場合、B1セルに「=IF(DAY(DATE(YEAR(A1),MONTH(A1),31))=31,31,””)」という数式を入力すれば、その月に31日が存在する場合は「31」、存在しない場合は空白が表示されます。
DATE関数は年月日から日付を作成する関数で、「=DATE(年,月,日)」という構文です。存在しない日付を指定すると自動的に翌月に繰り越されるため、2月31日を指定すると3月2日または3月3日になります。この時DAY関数で日を取り出すと31ではなくなるため、31日が存在しないと判定できます。
| A列(基準日) | B列(数式) | 結果 | 説明 |
|---|---|---|---|
| 2024/1/1 | =IF(DAY(DATE(YEAR(A1),MONTH(A1),31))=31,31,””) | 31 | 1月は31日まである |
| 2024/2/1 | =IF(DAY(DATE(YEAR(A1),MONTH(A1),31))=31,31,””) | (空白) | 2月は31日がない |
| 2024/4/1 | =IF(DAY(DATE(YEAR(A1),MONTH(A1),31))=31,31,””) | (空白) | 4月は30日まで |
| 2024/8/1 | =IF(DAY(DATE(YEAR(A1),MONTH(A1),31))=31,31,””) | 31 | 8月は31日まである |
スケジュール表で日付を条件付きで表示する
実際のスケジュール表では、各月の1日から31日までの列を用意し、存在しない日付のセルだけを空白にするという方法が効果的です。
例えば、1行目に月の情報(2024/1/1、2024/2/1など)があり、1列目に日付(1、2、3…31)がある場合、交差するセルに日付を表示させる数式を作ります。
B2セルに「=IF(DAY(DATE(YEAR($B$1),MONTH($B$1),$A2))=$A2,DATE(YEAR($B$1),MONTH($B$1),$A2),””)」という数式を入力します。
この数式の仕組み:
・$B$1: 月の基準日(例:2024/2/1)を固定参照
・$A2: 日付の番号(1〜31)を行方向に可変参照
・DATE関数で日付を作成し、DAY関数で日を取り出す
・取り出した日が元の日($A2)と一致すれば有効な日付として表示
・一致しなければ空白を表示
この数式をオートフィル機能で右方向(月の列)と下方向(日の行)にコピーすれば、各月の有効な日付だけが自動的に表示されます。2月の31日のセルは自動的に空白になり、4月・6月・9月・11月の31日も同様に空白になります。
| 月\日 | 1月 | 2月 | 4月 |
|---|---|---|---|
| 29 | 2024/1/29 | 2024/2/29 | 2024/4/29 |
| 30 | 2024/1/30 | (空白) | 2024/4/30 |
| 31 | 2024/1/31 | (空白) | (空白) |
30日の判定も含めた完全な日付チェック
31日だけでなく、30日や29日も含めて完全に日付の存在を確認したい場合は、より汎用的な判定式を使用します。
「=IF(AND(DAY(DATE(YEAR($B$1),MONTH($B$1),$A2))=$A2,$A2<=31),DATE(YEAR($B$1),MONTH($B$1),$A2),””)」という数式で、日付が1日から31日の範囲内にあり、かつその月に実際に存在する日付である場合のみ表示できます。
AND関数は複数の条件をすべて満たす場合にTRUEを返すため、日付の範囲チェックと存在チェックを同時に行えます。
| 判定内容 | 使用関数 | 数式例 | 結果 |
|---|---|---|---|
| 31日の存在確認 | IF, DAY, DATE | =IF(DAY(DATE(2024,2,31))=31,”有”,”無”) | 無 |
| 30日の存在確認 | IF, DAY, DATE | =IF(DAY(DATE(2024,2,30))=30,”有”,”無”) | 無 |
| 29日の存在確認(2024年) | IF, DAY, DATE | =IF(DAY(DATE(2024,2,29))=29,”有”,”無”) | 有 |
| 29日の存在確認(2023年) | IF, DAY, DATE | =IF(DAY(DATE(2023,2,29))=29,”有”,”無”) | 無 |
関数を使った日付判定は、元のデータを柔軟に扱えます。年や月を変更すれば自動的に再計算されるため、複数年にわたるスケジュール表でも活用できます。
条件付き書式で31日がない月を自動で非表示にする
続いては条件付き書式を使って、見た目を自動的に調整する方法を確認していきます。
条件付き書式の基本設定
条件付き書式を使うと、セルの値や数式の結果に応じて、自動的に書式(色、フォント、表示/非表示など)を変更できます。
31日がない月のセルを非表示にするには、まず対象となる範囲を選択します。例えば、B2からM32までの範囲(12ヶ月×31日)を選択し、「ホーム」タブの「条件付き書式」→「新しいルール」を選択します。
「数式を使用して、書式設定するセルを決定」を選び、数式の欄に「=DAY(DATE(YEAR($B$1),MONTH(B$1),$A2))<>$A2」と入力します。この数式は、作成した日付の「日」部分が元の日付と一致しない場合にTRUEを返します。
書式の設定では、「書式」ボタンをクリックして「フォント」タブで文字色を白にするか、「塗りつぶし」タブで背景色を白にすることで、実質的に非表示にできます。または、「表示形式」タブで「ユーザー定義」を選択し、「;;;」(セミコロン3つ)と入力すれば、どんな値でも表示されなくなります。
| 非表示方法 | 設定内容 | メリット | デメリット |
|---|---|---|---|
| 文字色を白 | フォント色:白 | 印刷時も非表示 | 背景が白でないと見える |
| 背景色を白 | 塗りつぶし:白 | 罫線は残る | 文字は見える |
| 表示形式で非表示 | ユーザー定義: ;;; | 完全に非表示 | セルを選択すると数式バーに値が見える |
| 文字色と背景色両方 | 両方を白に設定 | 最も確実 | 設定が複雑 |
複数の条件を組み合わせた高度な設定
条件付き書式では、複数の条件を組み合わせて、より細かい制御が可能です。
例えば、31日だけでなく30日や29日(平年の2月)も含めて非表示にしたい場合、「=OR(AND(MONTH(B$1)=2,$A2>29),AND(OR(MONTH(B$1)=4,MONTH(B$1)=6,MONTH(B$1)=9,MONTH(B$1)=11),$A2>30),AND(OR(MONTH(B$1)=1,MONTH(B$1)=3,MONTH(B$1)=5,MONTH(B$1)=7,MONTH(B$1)=8,MONTH(B$1)=10,MONTH(B$1)=12),$A2>31))」という複雑な数式も作成できます。
ただし、このような複雑な数式は保守性が低くなるため、前述のDAY関数を使った判定の方が推奨されます。「=DAY(DATE(YEAR(B$1),MONTH(B$1),$A2))<>$A2」というシンプルな数式の方が、閏年にも自動対応でき、メンテナンスも容易です。
行全体を非表示にする設定
セルの内容を見えなくするだけでなく、行自体を非表示にしたい場合もあります。
この場合は条件付き書式ではなく、フィルター機能やVBAマクロを使用する方が適切です。フィルター機能を使う場合は、補助列に「=IF(DAY(DATE(YEAR($B$1),MONTH($B$1),$A2))=$A2,”表示”,”非表示”)」という数式を作成し、「表示」だけをフィルターで表示させます。
VBAマクロを使う方法では、各行をループで確認して、存在しない日付の行を自動的に非表示にするコードを作成できます。ただし、マクロを使用する場合はセキュリティ設定やブックの保存形式に注意が必要です。
条件付き書式は一度設定すれば、データが変更されても自動的に再評価されます。月や年を変更した場合も、条件に応じて表示が更新されるため、動的なスケジュール表に最適です。
EOMONTH関数で月末日を取得して対処する
続いては専用の関数を使って、各月の最終日を正確に取得する方法を確認していきます。
EOMONTH関数の基本的な使い方
EOMONTH関数は、指定した日付から数ヶ月後(または前)の月末日を返す関数です。
「=EOMONTH(開始日,月数)」という構文で、開始日から指定した月数だけ進んだ(または戻った)月の最終日を取得できます。月数に0を指定すれば、開始日と同じ月の最終日が得られます。
例えば、A1セルに「2024/2/15」という日付が入っている場合、B1セルに「=EOMONTH(A1,0)」と入力すれば「2024/2/29」という結果が返されます(2024年は閏年のため)。同じ数式を2023年の2月に対して使用すれば「2023/2/28」が返されます。
翌月の末日を取得したい場合は「=EOMONTH(A1,1)」、前月の末日を取得したい場合は「=EOMONTH(A1,-1)」と指定します。
| A列(基準日) | B列(数式) | 結果 | 説明 |
|---|---|---|---|
| 2024/1/15 | =EOMONTH(A1,0) | 2024/1/31 | 当月末 |
| 2024/2/15 | =EOMONTH(A1,0) | 2024/2/29 | 当月末(閏年) |
| 2024/4/15 | =EOMONTH(A1,0) | 2024/4/30 | 当月末 |
| 2024/1/15 | =EOMONTH(A1,1) | 2024/2/29 | 翌月末 |
EOMONTH関数とDAY関数の組み合わせ
EOMONTH関数とDAY関数を組み合わせると、各月の最終日が何日かを簡単に取得できます。
「=DAY(EOMONTH(A1,0))」という数式で、A1セルの日付が含まれる月の最終日の日数を取得できます。1月なら31、2月なら28または29、4月なら30という値が返されます。
この値を使って、スケジュール表の日付列を動的に制御できます。例えば、31日の列を表示するかどうかを「=IF($A2<=DAY(EOMONTH(B$1,0)),DATE(YEAR(B$1),MONTH(B$1),$A2),””)」という数式で判定できます。
この数式は、行番号($A2)がその月の最終日以下であれば日付を表示し、それ以外は空白にします。シンプルで分かりやすく、保守性も高い方法です。
| 月 | 数式 | 最終日の日数 | 31日は表示? |
|---|---|---|---|
| 2024/1/1 | =DAY(EOMONTH(A1,0)) | 31 | 表示 |
| 2024/2/1 | =DAY(EOMONTH(A1,0)) | 29 | 非表示 |
| 2024/4/1 | =DAY(EOMONTH(A1,0)) | 30 | 非表示 |
| 2023/2/1 | =DAY(EOMONTH(A1,0)) | 28 | 非表示 |
カレンダー形式での応用
カレンダー形式のスケジュール表では、EOMONTH関数を使って週単位の表示も制御できます。
月の1日が何曜日から始まるかを計算し、EOMONTH関数で月末日を取得することで、カレンダーの必要な行数を動的に決定できます。
「=WEEKDAY(DATE(YEAR(A1),MONTH(A1),1))」で月初の曜日を取得し(1=日曜日、7=土曜日)、「=DAY(EOMONTH(A1,0))」で月の日数を取得して、必要な週数を計算します。「=ROUNDUP((WEEKDAY(DATE(YEAR(A1),MONTH(A1),1))+DAY(EOMONTH(A1,0))-1)/7,0)」という数式で、その月に必要な週数が分かります。
この計算により、2月は4週または5週、31日ある月でも開始曜日によって4週から6週まで変動することが分かり、カレンダーの行を動的に表示/非表示できます。
EOMONTH関数のメリット:
・閏年を自動判定するため、2月の日数を意識する必要がない
・月ごとの日数(28/29/30/31)を個別に覚える必要がない
・将来の日付に対しても正確に動作する
・数式がシンプルで理解しやすい
EOMONTH関数はExcel 2007以降で使用できます。古いバージョンのExcelを使用している場合は、DATE関数とIF関数を組み合わせた方法を使用してください。
まとめ エクセルで31日がない月を非表示にする(関数・日付のグラフ・スケジュール・表示されない月・対策)方法
エクセルで31日がない月を非表示にする方法をまとめると
・IF関数とDAY関数の組み合わせ:「=IF(DAY(DATE(YEAR($B$1),MONTH($B$1),$A2))=$A2,DATE(…),””)」で存在しない日付を自動判定、作成した日付が元の日付と一致するかチェックして空白表示
・条件付き書式での非表示:「=DAY(DATE(YEAR(B$1),MONTH(B$1),$A2))<>$A2」を条件に設定、書式で「;;;」や文字色を白にして非表示化、データは残したまま見た目だけ変更
・EOMONTH関数の活用:「=DAY(EOMONTH(日付,0))」で月末日の日数を取得、「=IF($A2<=DAY(EOMONTH(B$1,0)),DATE(…),””)」で最終日以降を非表示、閏年も自動対応
・複合的なアプローチ:関数で日付を制御し、条件付き書式で見た目を調整、フィルター機能で行の表示/非表示を切り替え
これらの方法は作成する表の形式や運用方法に応じた使い分けが重要です。
動的に年月を変更する可能性がある場合はEOMONTH関数、固定的なスケジュール表ではIF関数とDAY関数、見た目の調整だけなら条件付き書式というように、目的に合わせて選択することで、効率的なスケジュール管理が実現できます。
Excelの日付処理機能を適切に活用して、見やすく正確なカレンダーやスケジュール表を作成していきましょう!