こんにちは、Forkusです!
突然ですが、ひと月分日付を入力するとき、みなさんはどうしていますか。
僕はこんなかんじですかね…

日報や家計簿、データ集計…月が変わると日付を入力し直します。
実際に入力しているのは月初の1日だけ。
あとはプルダウンしてコピペ。そんなに面倒じゃないけれど、今月のカレンダーをみて30日迄かどうかを確認して…、あ、今月は31日迄か!

A1セルだけ変えれば、それ以下も全て自動で変わったらなぁ、と思うわけです。
しかも、ちゃんとおしりも毎月変えてくれる。

実はこれ、ARRAYFORMULA関数に少しだけ工夫を加えるだけで簡単に実現できます!!
以下ではまず、ARRAYFORMULA関数を知りましょう。
目次
1. ARRAYFORMULA関数とは
1.1. ARRAYFORMULA関数の意味
みなさん “ARRAY”の意味はご存知でしょうか。
array /əˈreɪ/
verb transitive1. to place in order; marshal (troops for battle, etc.)読み:アレイ
他動詞:(兵隊などを戦闘の為に)配置する。整列させる。
Collins Dictionary
つまり、(あなたが指揮官となって)関数(Formula)を、ここからここまで配置するから、後はやっといてね〜、ということですね。
この「ここからここまで」が実はくせ者です。
そこの司令さえキッチリ出来れば、あとは関数という兵隊たちが、あなたの代わりに、しかも今後ずーっと働いてくれます。なんて従順な子達なんだ…
1.2. 実際につかってみよう
まずは簡単な例を使って、イメージをつかんでみましょう。
「ここからここまで」を命令すればいいのですから、とりあえず2月さんとか、31日で終わらないアブノーマル月間は無視して、1日から31日まで配置して!
A2のセルに下記のARRAYFORMULA関数を入力します。
A1からA30 (= A1: A30) としっかり範囲を指定してあげましょう。(→ A1には自分で日付(1日目)を打ち込むので、 A1+ A30=31日になります)
ROW(=行)関数は、その名の通り行数(上から下に、左横の行番号を1,2,3,4…と)をかえします。
今回はA1に”2019/01/01″が予め入っていますから、それを一行目と解釈しています。
二行目(A2)にはA1+A1が出力されるので、
“2019/01/01” + “2019/01/01” = “2019/01/02”がA2へかえされます。(以下略)
(※ A1が “1”もしくは空欄の場合には、1,2,3….のように単純にそのセルがある行の番号を1に足していきます。)

しかし、困ったことになりました。
関数さんも人間と同様の悩みを抱えているようです。
1月は大丈夫なんですが、2月が…..
3月3日まである…..
2. ARRAYFORMULA関数は諸刃の刃
2.1. デメリットもあるんです
そう。ARRAYFORMULAは強力な関数です。一つのセルに式を挿入すれば、後続のセルは全て自動で入力されます。
しかし、その代償として自動で埋められたセルたちを消すことが出来ません。
(正確に言えば、消してもすぐにauto-fillされます。)
つまり、先ほどの例で言えば、3/1~3/3は消すことが出来ないのです。
そして式が挿入されるセル範囲たちを、必ず空白セルとして待機させ、配置をお膳立てしてあげなければいけません。
うーむ。ARRAYFORMULAの心の声が….
全部自動でやらせたいなら、
しっかり何をどうするのか命令してくださいね。
逆に考えてみましょう….
つまり、全部しっかり伝えてあげればいいんです。
今回のヒントを洗い出します。
邪魔なのは31日が最終日ではない、2、4、6、9、11月。
残りは31日なんです。
と、するとさっきのROW関数は再利用できそうです。
そうでない場合、つまり31日より早く終わっておしりがはみ出した月たちの
そのはみ出した分だけ消してあげればいいんです。
となると、おしりが知りたい。

3. EOMONTH関数を使って月の末日を認識する
3.1. EOMONTH関数のおさらい
例のごとく、EndOfMONTH(エンド・オブ・マンス)関数さんは名前の通り、
月末の日付を求める関数です。あるんです!
使い方もいたってシンプル。
まず日付を例えば2019/01/01(なんでもOK)のように内包し、次に-2~2までの数字を続けます。
- 0 → 今月末
- 1 → 来月末
- 2 → 再来月末
- -1 → 先月末
- -2 → 先先月末
のように入れる数字によってその日付の当月の末日なのか、そうでないのか選ぶことができます。今回は、例えば当月である1月の末日、つまり31日が知りたいので0を選びます。
以下を参考にしてみましょう。

だいぶ近づいてきましたね。ここまでくればあと一歩です。
ARRAYFORMULAへ分からせたいのは、例えば1月なら31日までですから、A1+ROW(A1:A30)によって31日まで持って来られても問題ないけれど、2月のように31日分持って来られると3日分オーバーしてしまってまずい、これですね。
ここをダメ(=FALSE)と認識させてあげましょう。
4. IF関数→TRUE(31日)ならそのまま、FALSE(月末オーバー)なら繰り越し分を空欄表示へ
4.1. TRUE?FALSE?どうやって認識させるの
以下の質問によって、正誤を認識させましょう。
はい(TRUE)→そこはそのまま。
いいえ(FALSE)→空欄処理

4.2. 完成。お疲れ様でした。
TRUEなら、〜。FALSEなら、〇〇。はIF関数でしたよね。
① = A1+ROW(A1:A30)<=EOMONTH(A1,0)
①がTRUEの部分までA1+ROW(A1:A30)をセルに反映されます。
①がFALSEの部分以降では空白表示させます。(= ” ” )
すると、以下の関数が完成します。A2セルに入力しましょう。
=ARRAYFORMULA(if(A1+ROW(A1:A30)<=EOMONTH(A1, 0),A1+ROW(A1:A30),""))

無事、完成しましたね!
以上になります。ここまで閲覧してくださったみなさま、お疲れ様でした。
もしも日数が正しく表示されない(45672など)場合は表示形式を変更しましょう。(以下参考リンク)