
初めまして。
初投稿のため、ご迷惑おかけしてしまったら申し訳ございません。自分で調べてもヒットしないのでこちらで質問させていただきます。
表示形式をdにして、月またぎを表示しない方法を探しておりました。6月なら31、2月なら29以降など、カレンダーにはないはずの月末、末日のことです。day関数単体や手入力だと31まで表示されますが、下記の式の通り表示しない方法がわかりました。
=IF(DAY(A1+1)=1,"",A1+1)
ですが、理由がわかりません。こちらの式で2022年9月31日を非表示できる理由を分かりやすく教えていただけますか?
前提条件として
①a1に2022/9/1と手入力
②表示形式を全てdに変更
③a2に=IF(DAY(A1+1)=1,"",A1+1)と入力
④③をオートフィルでa31までコピー
結果、a31は9/31とならずに空欄になる(当然①が2022/8/1だと表示される)
=1が関与しているのだと思いますが、なぜそれだけでこうなるのか意味がわからなくて。IFの意味はわかります。理由もわからないまま使うのはその場しのぎなので勉強のためにも質問させていただきました。パソコンやエクセルは初心者ではないものの、プログラミングは未知のレベルです。
ご回答のほどよろしくお願いいたします。
※参考先
検索ワード 28日~31日が必要ない所を空白表示にする方法
リンク先 https://oshiete.goo.ne.jp/qa/8372477.html
No.5ベストアンサー
- 回答日時:
前提条件に書かれているようにやってみましたが、
下図のようになりました。
> こちらの式で2022年9月31日を非表示できる理由
=IF(DAY(A1+1)=1,"",A1+1)
この式がA2に書かれているのだと、
(A1の日付に1を加えた日付)の《日の数値》が1である場合には、
""(空白)を A2に表示します。
(A1の日付に1を加えた日付)の《日の数値》が1でない場合には、
(A1の日付に1を加えた日付)を A2に表示します。
ですが、このとき、表示形式をdにしているので、
画面上には、日付ではなく、
一見すると、《日の数値》が表示されているように見えます。
このA2式のセルを下にオートフィルすると、セルの式の中のセル指定がカウントされていきます。
A31の式は、=IF(DAY(A30+1)=1,"",A30+1) となります。
A30は、一見すると 30 ですから、数値の30のように見えていますが、Excelは、このA30は、2022/9/30 のことであると扱っています。
A31の式で、 (A30+1) ⇒ 2022/10/1 ですが、
DAY(A30+1) ⇒ 1 です。
DAY(A30+1)=1 なので、IFの条件に該当するので、
""を、A31に表示します。
A32の式は、=IF(DAY(A31+1)=1,"",A31+1) です。
A31+1 ⇒ ""+1 なので計算できないので、エラーになります。

画面上には、日付ではなく、一見すると、《日の数値》が表示されているように見えます。
→これが一番の原因だったと思います。dayで出した答えとも勘違いしやすく。
とても分かりやすくて助かりました。
2022/9/30だから2022/9/31は存在しないし、10/1は1だから空白と。
No.4
- 回答日時:
=IF(DAY(A1+1)=1,"",A1+1)
質問にある式のままだと非表示になるとは限りません。
このままだと、2月の場合にエラーが表示されるからです。
A29セルなら問題ないのですが、A30セルとA31セルが#VALUE!の
エラーとなるだけで非表示にはなりません。
質問のリンク先のように
=IF(A1="","",IF(DAY(A1+1)=1,"",A1+1))
とするか、エラーに対応するIFERROR関数を使って
=IFERROR(IF(DAY(A1+1)=1,"",A1+1),"")
のようにする必要があります
上記を前提にして、空白になる理由を説明しますね。
質問文にある前提条件にも理解を妨げるものがあります。
②の表示形式をdに変更をすると、表示形式としての整数部分の
1~31までと、日付としてのシリアル値を勘違いしやすいからです。
https://support.microsoft.com/ja-jp/office/day-% …
A2以降は、式によって、すぐ上のセルのシリアル値に+1をして、
A1+1の部分で次の日付の年月日が求められます。
DAY関数の部分では求めた年月日から日を整数として取り出し、
1~31までを出します。このDAY関数によって求められた整数と、
IF関数の条件部分にある=1を比べて等しい場合には空白とする
ものですから、次月の1日となった場合に空白となります。
2月の場合には、A30セル以降では空白セルを参照して+1をする
ので#VALUE!のエラーとなります。そこで、エラーに対する処理が
必要となるのです。
今回の質問では、すぐ上のセルを参照して+1としてシリアル値と、
DAY関数で求められた整数の値と、私が説明をしたエラー処理の
設定によって非表示とすることができることを理解してください。
ちなみに、
> 30日と31日のセルは空白…すなわち「0」…に「1」が足されるので
> 「1900年1月1日」になり、空白表示されることになります。
は、説明としては間違っていることも理解できるかと思います。
添付画像では、2月の場合においてA列は年月日表示にしてあります。
B列は同じ年月日を質問にある式のみで処理した場合で、C列には私が
説明したエラー処理を施して非表示にしたものです。
途中の行を非表示にしているだけなので、連続したものです。

元の式がなぜこうなのかがわからないまま勝手に消して使いやすくしてしまいました…。その理由がとても分かりやすくて勉強になりました。
ありがとうございました。
No.2
- 回答日時:
まず、Excelにおいて、日付や時間は「シリアル値」という数値で管理されています。
この「シリアル値」は、
「1900年1月1日 0:00:00」が「1」
「1900年1月2日 0:00:00」が「2」
「1900年1月3日 0:00:00」が「3」
のように1日で1ずつ数値が増えます。
そして12時間で「0.5」、6時間で「0.25」のように、24時間で「1」になるように小数点以下の数字が「時間」として付随します。
すなわち
「2022年8月20日 0:00:00」に分数の ”1/24” を足すと
「2022年8月20日 1:00:00」になり、分数の ”2/24” を足すと
「2022年8月20日 2:00:00」になるという事です。
ちなみに
「2022年8月20日 0:00:00」は「44793」、
「2022年8月20日 2:00:00」は「44793.08333」のシリアル値になります。
そんなわけでシリアル値に「1」を足すと翌日の日付になるのです。
これを理解していないと「月末の日付」に「1を足す」と「翌月の1日」になることが分からないでしょう。
・・・
要は、1を足して翌月の1日になったら表示させない(空白を代わりに表示)としているだけです。
では、閏年でない2/28の翌日は3/1、閏年なら2/29になるので、1日は表示されず2/29は表示される。
余っている30日と31日のセルは空白…すなわち「0」…に「1」が足されるので、
「1900年1月1日」になり、空白表示されることになります。
独学で行うと習うよりも大事なことが抜けがちなので、とても勉強になりました。物事の核の部分から教えてくださる説明をする方とても有難いです。ありがとうございました。
No.1
- 回答日時:
dayは日付をとる関数で、ifは条件分岐です。
まずifは
day+1日が1日なら 「DAY(A1+1)=1」
空欄になり、「""」
1日以外なら日付に+1日して表示する「A1+1」
ということになります。
そのまましたに伸ばしていくと、9/31の次は10/1になりますので、
ifに当てはめると9/31+1日は10月1日、つまりdayは1になりますよね?
なので空欄になるわけです。
伝わるでしょうか
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
【初月無料キャンペーン実施中】オンライン健康相談gooドクター
24時間365日いつでも医師に健康相談できる!詳しくはコチラ>>
-
excelの数式の書き方について。 以下のような数式をSheet1に書いています。 Sheet1のB
Excel(エクセル)
-
出勤簿の土、日、休日に色付けできない
Excel(エクセル)
-
エクセルデーターの並び替え
Excel(エクセル)
-
4
Excelで睡眠時間をもとに判定したい
Excel(エクセル)
-
5
エクセル関数について
Excel(エクセル)
-
6
Excel 2019で質問があります。 計測器のデータをExcelで記録したんですが、1秒刻みで記録
Excel(エクセル)
-
7
電卓は正しいのに エクセルで計算させると間違った答えです。なぜ?
Excel(エクセル)
-
8
ExcelのVLOOKUP関数
Excel(エクセル)
-
9
【EXCEL】=セル&セルが上手く表示できない。
Excel(エクセル)
-
10
一つのセルに複数の関数を入力する方法
Excel(エクセル)
-
11
エクセル(カッコを表示させない)
Excel(エクセル)
-
12
エクセル 関数について
Excel(エクセル)
-
13
特定の文字の合計値(空白を無視+可変に対応)を求める関数について
Excel(エクセル)
-
14
VBA SUM関数を入力したい
Excel(エクセル)
-
15
IFERROR、SMALL関数について
Excel(エクセル)
-
16
Formulaプロパティーを使ってセルに数式を組んだのですが簡潔にしたい。
Excel(エクセル)
-
17
Excelで数式をそのままコピーしたい どうすればいいですか?
Excel(エクセル)
-
18
エクセル、日々の集計整理方法。(再送です。)
Excel(エクセル)
-
19
エクセルの使い方について。 A〜F列に10個ずつデータが入力されています。左隣のセルよりも数値が2倍
Excel(エクセル)
-
20
文字列を数式として変換する事はできますか?
Excel(エクセル)
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
このカテゴリの人気Q&Aランキング
-
4
エクセルでマウスカーソルの形...
-
5
(Excel)あるセルに文字を入力...
-
6
あるセルに特定の文字列を打つ...
-
7
EXCELで2つの数値のうち大きい...
-
8
Excel 書式を関数で判断。
-
9
エクセルの2ページ目の作り方
-
10
グラフの横・縦項目が全部表示...
-
11
【Excel関数】UNIQUE関数で"0"...
-
12
エクセル近似曲線(範囲指定)
-
13
EXCELで2列を参照し、重複する...
-
14
エクセルでアルファベットか数...
-
15
Excelのスキル
-
16
エクセルのセル内の余白の設定...
-
17
エクセルのプロパティーでセキ...
-
18
Excel関数で、文字を数字に変換...
-
19
エクセル: セルの枠を超えて表示
-
20
関数を教えてください。
おすすめ情報
公式facebook
公式twitter
回答まとめです。自分で忘れないようにしたくて。
・式は=IF(A1="","",IF(DAY(A1+1)=1,"",A1+1))を使うこと。※2月のa31など、上のセルが空白でエラーになるため。
・前提として、エクセルでは各年月日に一つずつ対応された数字=シリアル値が存在する。シリアル値で全て計算しているので、表示形式の標準となる。
・シリアル値は1900年1月1日 0:00:00を1として1日で1ずつ増える。(厳密には1時間ごとに1/24増えるので12時間なら0.5。だから1で翌日となる。)
・dayとはシリアル値から1~31までの整数で返す関数のこと。
・44774が基準で表示形式を変えれば2022/8/1になるという認識で行う。
今回はa1~a31に今月の日にちだけを表示したいので
①表示形式を全てdに。(日にちだけ表示)
②a1に2022/8/1と入力。(日付の1だけは変えない。)
③a2に=IF(A1="","",IF(DAY(A1+1)=1,"",A1+1))と入力
④a2をオートフィルでa31までコピーする
式の意味は、上のセルが空白または1なら表示しない、1でなければ上のセルに1を足したものを表示する。
詳しくは【=IF(A1="","",】がa1が空白なら表示しない。(相対参照なので上のセル)
【"",IF(DAY(A1+1)=1,"",】は、例えばa1はシリアル値だと44774であり、2022/8/1でもあるので、DAY関数により1だけ抽出されるので答えは2=1となり、1ではないので下記を表示する
【A1+1))】は上記と同じで44774であり、1を足すと44775となり、2022/8/2となる。
まとめ なぜ9/31を非表示にできるのか?
・エクセルでは年月日に必ずシリアル値があるので2022/9/31が実在しないと判断できる。
・DAYはシリアル値から整数を抽出するだけで、それが1であれば空白というIFを使っていること。それにより翌月1日を非表示にできる。2月を除けば30か31しかないので1日となる。
・2月は29か30が空白だから、上のセルが空白ならばのIF条件で対応できるのでこの式を使う。
・表示形式dにより数字に見えるのでDAYの整数と勘違いしたが、正しくはa30+1だから44835と入力されていて2022/10/1のこと。IFにより、日にちが1なので表示されない。
・つまりDAYとシリアル値、表示形式で2022/8/1,44774,1などもわからないままだったので、DAY()とa1+1で混乱してしまったのが原因。
・表示形式を標準とdで比較するととても分かりやすい。