いきなり答える備忘録

Google Workspace・Microsoft 365・LibreOfficeなどに関するメモ

(Excel)1か月分の日付と曜日を自動入力する

 Excelで関数を使い、指定された月のすべての日付を1列に表示させ、月を変更した場合も結果を自動的に変更させる方法です。
 各セルに式を配置する方法と、SEQUENCE関数を使って1つの式で出力する方法を紹介します。前者の場合は翌月の日付を出さない工夫が必要ですが、その方法も含めて紹介します。

表示形式の設定

 まず大事なのがセルの表示形式の設定です。
 本記事では指定された年と月の値に対応する1か月分の日付を、関数を使って表示するやり方を紹介します。
 しかしやり方によって「2023/9/1」といったように西暦を含む形で表示されたり、「45170」といったシリアル値(日付を表す数値)が表示されたりします。


 


 しかしいずれも本記事の内容に向かない表示形式なので、基本的に「9月1日」といった形式に統一します。
 そこで、日付を表示させるセル範囲をすべて選択した状態で右クリックし、メニューから「セルの書式設定」を選択します。
 (画像ではすでに日付が入った状態ですが、セルが空の状態でやっても構いません)

 

 設定用のダイアログが現れます。
 ここで左側の「分類」欄から「日付」を選択し、さらに右側の「種類」欄から「3月14日」を選択します。

 

 OKボタンを押すと表示形式が変更されました。

曜日を併記する表示形式

 日付だけでなく曜日を併記して確認したい場合があります。
 この場合、上記の例と同様に設定ダイアログを開いたうえで、「分類」欄から「ユーザー定義」を選択します。
 さらに「種類」欄には次のように入力します。

m"月"d"日"(aaa)

 「m」「d」「aaa」はそれぞれ月の値(数字)、日の値(数字)、曜日(日本語1文字)を表します。
 これらの値に「月」「日」の文字やカッコを混ぜて表示するという表示形式です。
 ちなみに「"」はすべて省略してもOKです。


 OKボタンをクリックすると表示形式が適用されました。
 セルに記録されているのはあくまで日付であり、それを曜日を含む便利な文字列のように見せられるというのがポイントです。

 なお、「種類」欄で単に「aaa」と指定すれば曜日だけを表示させられます。
 日付を表示する列と曜日を表示する列を分けたいという場合は同じ日付を2列並べて、一方に「aaa」を適用すればOKです。

各セルに式を入力する方法

 ここからは1か月分の日付を表示させる手順です。
 具体的にはB3セルとC3セルに入力されている年月(ここでは2023年9月)の日付を表示させるものとします。
 まずは最初の日付欄であるB6セルに「=DATE(B3,C3,1)」と入力します。

 B6セル

=DATE(B3,C3,1)

 DATE関数は指定した年,月,日の3つの数値に対応する日付を返す関数です。
 3つの引数としてB3,C3,1を指定することで、ここでは2023年9月1日の日付が得られます。



 続いて1つ下のB7セルに「B6+1」と入力します。
 これでB6セルの日付の1日後の日付、つまり2023年9月2日の日付が得られます。

 


 そしてB7セルだけを選択し、セルの右下の小さな緑の四角形をつかんで下方にドラッグします。

 


 これで1か月分の日付をすべて表示させることができます。B3,C3セルの値を変えると日付の値も変化します。
 ただし31日目の日付欄(B36セル)までドラッグすると、月によっては翌月の日付まで表示されます。
 かといってドラッグを30日目(B35セル)までに留めればC3セルの値を変えたときに最終日まで表示されなくなりますし、月ごとに日付欄の数を変えるのでは自動化の意味が薄れます。そこで以降で対策を紹介します。

翌月の日付を表示しない方法

 上記の例で分かるように、31日分の日付欄を用意して関数を入力すると月によっては翌月の日付まで表示されてしまいます。
 そこで対策を2つ紹介します。

条件付き書式を使う方法

 翌月の日付が表示される場合は、そのセルのフォントの色を変えて視覚的に見えなくしてしまおうという方法です。
 翌月の日付が表示される可能性があるのは29日目のセル以降ですので、まずはその3つのセル(B34~B36セル)を選択し、ホームタブから「条件付き書式」→「新しいルール」と選択します。



 ダイアログの上半分の欄から「数式を使用して、書式設定するセルを決定」を選択します。
 そして数式欄に「=MONTH(B34)<>$C$3」と入力します。B34は選択している3つのセルのうち最も上のセルであり、$C3$3は月の値が入力されているセルです。
 さらに「書式」をクリックします。

 フォントタブの「色」から、白を選択します。つまりセルの日付がC3セルに記された月と異なる場合は、文字の色をセルの背景色と同じにしてしまおうという設定です。
 あとはOKを続けて設定を終えます。

 


 すると10月の日付が白色になり、見えなくなりました。
 ただし値としては存在してますので注意してください。

 


 B3,C3セルをそれぞれ2024,2と変更した様子です。
 2024年はうるう年なので2月29日までありますが、期待される結果になっているのがわかります。

関数を工夫する方法

 関数の方を工夫して、翌月の日付を出力させないという方法です。
 まずはB6セルに「=DATE(B3,C3,1)」と入力します。これは上記の例と同じです。
 そしてB7セルに「=IFS(B6="","",DAY(B6+1)=1,"",TRUE,B6+1)」と入力し、B7セルだけを選択して右下の小さい四角を下方にドラッグします。

 B7セルの式は次のように機能し、翌月の日付が出力されないようにしています。

  1. 1つ上のセルが空文字列であれば空文字列を出力する
  2. 「1つ上の日付の1日後」が「1日」なら空文字列を出力する
  3. 上記のいずれにも該当しなければ「1つ上の日付の1日後の日付」を出力する
 空文字列が出力される可能性があるのは29日目のセル(B34)以降なのでそこから適用してもいいのですが、関数式が3種類に増えるのも手間が増えるだけなのでB7セル以降に適用しています。



 31日目のセル(B36)までドラッグしましたが、翌月の日付は表示されません(空文字列が出力されています)。

 


 B3,C3セルの値をそれぞれ2024,2に変更した様子です。
 期待される結果になっていることがわかります。

1つの式ですべての日付を求める方法

 上記のDATE関数を用いる方法では翌月の日付を出さないための工夫が必要でしたが、SEQUENCE関数を使えばその必要はなく、1つの式でちょうど1か月分の日付が求められます。

 B6セル

=SEQUENCE(DAY(EOMONTH(DATE(B3,C3,1),0)),,DATE(B3,C3,1))

 SEQUENCE関数は連番を生成する関数です。
 その第1引数(生成する行数)を「DAY(EOMONTH(DATE(B3,C3,1),0))」としています。これは指定月の末日が何日なのかを求める式で、つまりは指定月の日数を意味します。
 第3引数(初期値)は「DATE(B3,C3,1)」で、これは指定月の1日の日付を意味します。
 以上により指定月の1日から末日までの日付が一括して得られます。

 画像からもわかるように出力されるセル数が動的に変化し、余分なセルが出力されないのがポイントです。

「今月1か月分の日付」を求める場合

 上記のDATE関数を使う場合において、1日目の日付を「=DATE(B3,C3,1)」という式で求めましたが、これを次のように変えれば「今月1か月」の日付が求められます。2日目(B7セル)以降の式はDATE関数の例そのままでOKです。

=EOMONTH(TODAY(),-1)+1

 EOMONTH関数は月末の日付を求める関数で、「EOMONTH(TODAY(),-1)」とすることで前月末日(この例では9月30日)が求められます。これに1を足すことで「今月1日」の日付を求めています。
 なお「TODAY()」を「NOW()」に代えても同じ結果になります。



 SEQUENCE関数を使う場合は次のような式になります。

 B6セル

=SEQUENCE(DAY(EOMONTH(TODAY(),0)),,EOMONTH(TODAY(),-1)+1)

 SEQUENCE関数の第1引数(行数)の「DAY(EOMONTH(TODAY(),0))」は今月の日数です。
 第3引数(初期値)の「EOMONTH(TODAY(),-1)+1」は今月1日の日付です。
 これで今月1か月の日付が求められます。「TODAY()」を「NOW()」に代えても同じ結果になります。