こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

EXCELでTODAY()の日付から31日分を表示

EXCEL2002で、1行に31日分のその日の日付からスタートする、連続する日付カレンダーを表示させます。
ちなみに、$AC$1には =TODAY() の値が入り、AH2は30日目の日付になります。

=IF(
OR(
AND(OR(MONTH($AC$1)=4,MONTH($AC$1)=6,MONTH($AC$1)=9,MONTH($AC$1)=11),AH2=30),
AND(MONTH($AC$1)=2,IF(OR(MOD(YEAR($AC$1),400)=0,AND(MOD(YEAR($AC$1),4)=0,MOD(YEAR($AC$1),100)<>0)),AH2=29,AH2=28))
),1,AH2+1)

問題が発生しました。
$AC$1がうるう年ではない3月31日、5月31日、8月31日、10月31日にあたるとき、
31日目のセルには「1」が返されてしまいます。
AH2+1をAH2+10とすると10が返ります。
どうやら直前のセルの値AH2が「0」に評価されてしまうようです。
どこを直せば正しい値が返ってくるか教えていただけないでしょうか?

投稿日時 - 2007-11-02 19:52:41

QNo.3483655

暇なときに回答ください

質問者が選んだベストアンサー

私見ですが、AC2に=IF($AC$1<>"",$AC$1+ROW(A1)-1,"")を設定してAC32までコピーする方法は如何でしょうか。

投稿日時 - 2007-11-02 21:20:26

お礼

はい。列で表示させる場合
式:=DAY(IF($A$1<>"",$A$1+ROW(A2)-1,""))
で見事に完成されます。
行で表示させる場合は
式:=DAY(IF($A$1<>"",$A$1+COLUMN(A$2),""))
ですかね。

投稿日時 - 2007-11-03 15:02:40

ANo.3

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(8)

ANo.8

#5の回答者です。

回答を載せた後に、私のところに「お礼」の説明が付きました。
#6さんの回答とダブります。

>E2=データファイルを開いた日の日付=DAY($AC$1)

これが間違いですね。

E2
=DATE(YEAR($AC$1),MONTH($AC$1),1)

で、F2 は、
=E2+1

E2, F2 書式、「d」で、右にドラッグして、コピー

後は、AI2まで。そうすれば、31日目まで出ます。

なお、#7 の一部には間違いがありました。

もう、用済みかもしれませんが、晦日を固定する場合は、
=DATE(YEAR($AC$1),MONTH($AC$1)+1,0)

投稿日時 - 2007-11-03 15:33:50

ANo.7

#5の回答者です。
#6さんの回答を読みながら、私は、私なりに考えてみました。
どうやら、左位置を決めずに、右から左に作っているような内容に思えました。Excelには、右から左方式のモードもありますが。

数式の中の
AH2=30,AH2=29,AH2=28, AH2+1

というところからみると、少なくとも、そのどこか隣のセルが、必ず、晦日になるようです。したがって、AI2 を一応、晦日に設定するとしました。

ですから、AI2を晦日に設定して、その月の日をさかのぼればよいわけです。内容的には、かなり奇妙ですが。

AI2に
=DATE(YEAR($AC$1),MONTH($AC$1),0)

書式、「d」

AH2 に、

=AI2-1 として、書式「d」

後は、ドラッグして、左にコピー
H2 ぐらいから、

=IF(I2="","",IF(DAY(I2-1)>25,"",I2-1))

とすればよいのでは?後は、E2 ぐらいまでですね。

でも、一般的には、左から右に作るはずです。
この質問は、数式などの位置が、書かれていないから、さっぱり分からないのです。

投稿日時 - 2007-11-03 15:13:38

ANo.6

何となく解ってきました。
セルAC1にToday()があるのは、表のタイトルの右に「2007/11」等と年月表示も兼ねているのでしょう。
多分、セルAC1の表示書式は「yyyy"年"m"月"」か「ggge"年"m"月"」となっているのでしょう。
AH列が30日という事は、1日はE列になりますね。
従って、Today()から31日分というのは言葉の綾で、月単位の日別集計表のようなものなのでしょう。

私なら、
セルE2に、「=DATE(YEAR($AC$1),MONTH($AC$1),1)」
セルF2に、「=D2+1」として、これをAF2までコピー。
セルAG2に、「=IF(DAY(AF2+1)<4,0,AF2+1」として、これをAI2までコピー。
セルE2~AI2を選択し、表示書式に「d;;」あるいは「d"日";;」あるいは「d"日("aaa")";;」と設定。
これで、その月にない日付は表示されなくなります。閏年にも対応しています。
お試し下さい。

投稿日時 - 2007-11-03 12:48:30

お礼

まずい質問をご解読くださり有難うございました。

> セルF2に、「=D2+1」として、これをAF2までコピー。
そうです、これを31日分までコピーをすると、=TODAY()の「日」が31で翌月が30日で終わる月の日の表示が
29の次に1が返ってしまうのです。
で、貴殿の与式ですが、

> セルAG2に、「=IF(DAY(AF2+1)<4,0,AF2+1)」として、これをAI2までコピー。
> セルE2~AI2を選択し、表示書式に「d;;」あるいは「d"日";;」あるいは「d"日("aaa")";;」と設定。

ですが、TODAY()に当たるセルに2007/8/31や2008/1/31を与えると次月は31日まで表示してしまいます。

投稿日時 - 2007-11-03 15:37:00

ANo.5

こんばんは。

私には、ご質問を何度読んでも理屈が理解できません。
すでに、回答している方たちがいるのですから、こちらは、別に無視してかまわないけれども、意味不明というか奇妙な質問ですから、少し、書かせていただきます。
それと、「補足要求」にはしておきません。気が向いたら、こちらにも答えてください。

>1行に31日分のその日の日付からスタートする、連続する日付カレンダー

その日とは、AC1 に 「=TODAY()」のことですね。AC1から、どうやって勘定して、連続して、AH2 で、30日目に来るのでしょうか?1行とは、連続させるにしても、どう表示するのでしょう。

それと、その日(TODAY)から、31日分だというなら、2日以降は、当然、次の月の1日も含まれますね。

ちなみに、縦にスクウェア形にして5行ずつ使っていくと、AH2 で、27日目です。
AC列だけ、7行で、後は、6行ずつだと、AH2 で、32日目です。
TODAYの AC1 を無視すると、AH2は、31日目です。

AH2 に末日(晦日)を持ってくるようにしたいというなら、多少は、意味は通りますが、31日分なら、いずれにしても、前月の日付が出てきます。
-------------------------------------
ちなみに、末日(晦日)を、AH2 に持ってくるのは、何も問題ないです。次の月の1日の前の日です。

=DATE(YEAR($AC$1),MONTH($AC$1),0)
表示の書式を、D とすればよいです。日付の数字だけなら、DAY関数を使います。もしも、次の1日以降を消すなら、MONTH関数で、TODAY()のMONTHと同じでないなら、"" とすればよいです。

投稿日時 - 2007-11-03 01:31:41

お礼

説明が不足してましたね。すみません。
日付はE2からスタートし、行表示させています。E2から1つ右セルに移項するごとに翌日の日を返す式として設問の関数を考えました。
各セルのフォーマットは d です。
$AC$1には =TODAY()
E2=データファイルを開いた日の日付=DAY($AC$1)
式のAH2はE2から数えて30番(日)目になり、AI2で終わります。
データファイルを開いた日の日付から始まりAI2に31日後の日付が与えられる、というものです。

投稿日時 - 2007-11-03 14:52:53

ANo.4

>$AC$1には =TODAY() の値が入り、AH2は30日目の日付になります
TODAYはいつの話?
計算が合わないように思うが、私の勘違いかな。
>1行に
であるから横方向に日付を並べるのですね。
>31日分
月末日とか、月日数にかかわらず31個のセルに連続日付を入れればよいのですか。
なぜ質問のような複雑な式になるのか分からん。
TODAY()を2007/11/2として
AC2に =AC1と入れる
AD2に =$AC1+COLUMN()-COLUMN($AC$2)
と入れて、式を複写する。BG2で2007/12/2となり、31日目です。
日だけの書式にすると12/1は1,12/2は2になってしまうが良いのかな。
上記では何か欠けている点は何でしょうか。
>$AC$1がうるう年ではない3月31日、5月31日、8月31日、10月31日にあたるとき、31日目のセルには「1」が返されてしまいます
意味不明。私の例では
AC1に2007/3/31
31日目は2007/4/30
になりましたが。

投稿日時 - 2007-11-02 22:17:00

お礼

貴殿の与式で正しく表示されました。有難うございました。
他の方へのお礼でも申し上げていますが、
AC1にTODAY()を与え、
E2にファイルを開けた日の日付 =DAY(AC1) が返され
F2=DAY(AC)+1, G2=DAY(AC2)+2,,,,,でうまくいきそうですが、
TODAY()が2007/10/31としたとき、30番目のセルに11月30日の30ではなく、1が返るので苦悶していたのです。

投稿日時 - 2007-11-03 15:01:24

ANo.2

>EXCEL2002で、1行に31日分のその日の日付からスタートする、連続する日付カレンダーを表示させます。

質問の数式に、閏年の計算を追加する事も可能だと思いますが、
式がかなり複雑になります。

全く別の方法を提案します。
--------------------------------
A2の数式 =TODAY()
B2の数式 =A2+1
B2の数式をC2~AE2までコピーします。
A2~AE2のセルの書式で、表示形式をユーザ定義にして d と入れます。
--------------------------------

解説:
Excelの日付は1を足せば次の日になります。
閏年など気にする必要はありません。
Excelが自動的に処理してくれます。

表示形式で日だけを表示します。
表示形式で誤魔化してますが、セルの中身は年月も入っています。
日のみを取り出す必要があるなら、DAY()関数を使って下さい。

例:
3列目の数式を =DAY(A2) として、2列目を非表示にする等。

投稿日時 - 2007-11-02 20:25:30

お礼

> A2の数式 =TODAY()
> B2の数式 =A2+1
> B2の数式をC2~AE2までコピーします。
これですと31の次に32が返されてしまいます。
なので =DAY(A2)+1, =DAY(A2)+2でうまくいきそうですが、
TODAY()が2007/10/31としたとき、30番目のセルに11月30日の30ではなく、1が返るので苦悶していたのです。

投稿日時 - 2007-11-03 15:03:53

ANo.1

計算式はAH2+1で表示形式をdにしてはどうでしょうか。それとも月初めの日付だけシリアルではなく数値の1にしたいという事でしょうか。

投稿日時 - 2007-11-02 20:24:13

お礼

はい、各セルのフォーマットは d です。

投稿日時 - 2007-11-03 15:05:51

あなたにオススメの質問