アプリ版:「スタンプのみでお礼する」機能のリリースについて

初めまして。
 初投稿のため、ご迷惑おかけしてしまったら申し訳ございません。自分で調べてもヒットしないのでこちらで質問させていただきます。

 表示形式を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

質問者からの補足コメント

  • うれしい

    回答まとめです。自分で忘れないようにしたくて。

    ・式は=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になるという認識で行う。

      補足日時:2022/08/20 18:02
  • うれしい

    今回は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となる。

      補足日時:2022/08/20 18:06
  • うれしい

    まとめ なぜ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で比較するととても分かりやすい。

      補足日時:2022/08/20 18:09

A 回答 (6件)

前提条件に書かれているようにやってみましたが、


下図のようになりました。

> こちらの式で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 なので計算できないので、エラーになります。
「下記エクセルの式がなぜこうなるのか理由が」の回答画像5
    • good
    • 1
この回答へのお礼

助かりました

画面上には、日付ではなく、一見すると、《日の数値》が表示されているように見えます。
→これが一番の原因だったと思います。dayで出した答えとも勘違いしやすく。
とても分かりやすくて助かりました。
2022/9/30だから2022/9/31は存在しないし、10/1は1だから空白と。

お礼日時:2022/08/20 18:18

別回答例



=IF(MONTH($A$1+ROW()-1)<>MONTH($A$1),"",A1+1)

とかでもいいかな。
    • good
    • 1
この回答へのお礼

いろいろありますよね、私にはハードルが高いのですが、勉強になります。今度その関数を調べて身に着けたいと思います。ありがとうございます!

お礼日時:2022/08/20 17:50

=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列には私が
説明したエラー処理を施して非表示にしたものです。
途中の行を非表示にしているだけなので、連続したものです。
「下記エクセルの式がなぜこうなるのか理由が」の回答画像4
    • good
    • 1
この回答へのお礼

元の式がなぜこうなのかがわからないまま勝手に消して使いやすくしてしまいました…。その理由がとても分かりやすくて勉強になりました。
ありがとうございました。

お礼日時:2022/08/20 17:58

以下、お二人の説明でかなり充分かと思いますが、dayが、日にちだけを読んでるわけでなく、



年月も含めた日にちを表示するルールになっているから、ではどうだろうか?

単純に日付をドラックしてもない日付は、表示しなかったはず。やってみて。違ってたらすまぬ。(^^)
    • good
    • 1
この回答へのお礼

年月も含めたルールというのが、感覚的にとても分かりやすかったです。
最後だけ私には、わからなかったのですがお手を煩わせるのも心苦しいので。
ありがとうございました。

お礼日時:2022/08/20 17:49

まず、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日」になり、空白表示されることになります。
    • good
    • 3
この回答へのお礼

独学で行うと習うよりも大事なことが抜けがちなので、とても勉強になりました。物事の核の部分から教えてくださる説明をする方とても有難いです。ありがとうございました。

お礼日時:2022/08/20 17:45

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になりますよね?
なので空欄になるわけです。

伝わるでしょうか
    • good
    • 2
この回答へのお礼

迅速でわかりやすい説明ありがとうございました!
感覚的にすごくわかりやすくて助かりました。

お礼日時:2022/08/20 17:41

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!