• ベストアンサー

日にちの隣の列を書き出すには?

A列に日付(西暦、月、日)、B列には曜日(祝日は祝と反映)が一年分入力されています。(2009年とは限りません) C1セルにある日にちを月と日だけで入力(たとえば1月1日)したときにD1セルに対応する日付の曜日の欄のセル番号(1月1日の場合は B1、2月1日の場合はB32)と表示させる方法を教えて下さい。(なぜB1と表示させたいのかというと、 B1 をindex関数で参照して別の作業をしたいからです) 以下は私がチャレンジしてダメだった内容です。 難しいのは、A列の日付が過去の日付という事です。C1セルにはただ単に1月1日、とだけ入力するようにしたいので、セルの日にちは自動的に「今年の」1月1日になってしまいます。A列が昨年以前の日付だとすると、C1=A列にはならないので、簡単なlookup関数などでは処理できません。 E列に=month(A1)、F列に=day(A1) 、として下までコピーし、month(C1)とday(C1)と同じものを探す、なんていうやり方は頭にあるのですが、それを表現できません。 また、A列でヒットした場合、B列のセル番号を返す、(A123が同じだった場合にB123と返す)というのが私の知識では及びません。(1つ下のセル、なら、row+1ですが、1つ右のセル、だと、column+1ではできない) いろいろなやり方があると思いますが、これを使って1年分の売り上げ分析を一枚のシートでやろうと思っているので、なるべくこの部分で複雑な展開にはしたくありません(ファイルが重たくなる)。 皆さんのお知恵をお願いいたします。 よろしくお願いします。

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

  • ベストアンサー
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.6

こんばんは! 解釈が違っていたらごめんなさい。 単純に、E1・F1セルに月と日を入力するとB列の何行目か? という表示させるだけの回答になります。 ↓の画像で説明させていただくと、 今年だけではなく以前の年度の場合もあるということなので データとは関係ないところに年度と月(1/1からA1セルに表示させたいと言うことなので、とりあえず1)を入力すると A列に日付・B列に曜日・C列にE1~F1に月日のデータを入力すると行番号が表示されるようにしてみました。 A1セルに =IF(COUNTBLANK($H$1:$J$1)>0,"",DATE($H$1,$J$1,ROW(A1))) としてセルの表示形式のユーザー定義から d に B1セルに =IF(A1="","",A1) として、同じくユーザー定義から aaa に C1セルに =IF(A1=DATE($H$1,$E$1,$F$1),ROW(A1),"") という数式を入れ、A1~C1セルを範囲指定し、C1セルのフィルハンドルで 下へオートフィルで366行目(うるう年の関係のため)までコピーします。 そして、D1セルに =IF(COUNTBLANK(E1:F1)>0,"","B"&MIN(C:C)) という数式が入っていますので、 E1・F1セルに月と日を入力すると、H1セルの年度の 何行目かというのが、B○○ と表示されるはずです。 尚、アップした画像の中にも書いていますが、 J列・K列は非表示の方が良いかも知れません。 もし、1月以外からはじめるとエラーになると思います。 以上、参考になれば幸いですが、 的外れなら読み流してくださいね。m(__)m

pi-man
質問者

お礼

なるほど、いろいろな考え方がありますね。 実は私が「こんな感じでできないかな・・」と漠然と考えていたのは、ご回答のようなやり方でした。 いろいろと勉強してみます、どうもありがとうございました。

その他の回答 (5)

  • sige1701
  • ベストアンサー率28% (74/260)
回答No.5

実際にやりたいことを記載した方がよりよい回答を得られると思います >C1セルにある日にちを月と日だけで入力(たとえば1月1日)したときに >D1セルに対応する日付の曜日の欄のセル番号(1月1日の場合は B1、 >2月1日の場合はB32)と表示させる方法を教えて下さい。 (なぜB1と表示させたいのかというと、 B1 をindex関数で参照して 別の作業をしたいからです) A列は同じ年度の連続した日にちが入力されているのでしょうか? 連続でない場合、A列に重複する日付はあるのでしょうか 単にB列の値が分かれば 良いだけのようにも思いますが・・・ 参考までに ="B"&MATCH(TEXT(C1,"mmdd"),INDEX(TEXT(A1:A366,"mmdd"),),0) =INDEX(B:B,MATCH(DATE(YEAR(A1),MONTH(C1),DAY(C1)),A1:A365,0)) =TEXT(DATE(YEAR(A1),MONTH(C1),DAY(C1)),"aaa") エラー処理、閏年を考慮していません

pi-man
質問者

お礼

説明がなっていなくてすみませんでした。 A列の日にちは1月1日から12月31日まで連続しています。 実際のファイルではそれに対応する売り上げデーターがC列以降に並んでいます。 曜日を知ることが目的ではないので3つ目の式は違うと思います。 1と2は、・・・・ MATCH関数をあんまり理解していないので、そこから勉強してみます。 どうもありがとうございました。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.4

質問が読みずらい。実例を一部あげること。 余分な記述がある。 失敗談は注書きにし希望は回答が出てから、採用で吟味すればよいだろう。 私としては、聞く立場で色々注文はつけてほしくない。多様な回答は勉強になると確信している。 ーーーー A列には「ある年」だけの!1年分の日付がある。 A列 2008/1/1 2008/1/2 ・・・ 2008/12/30 2008/12/31 と日付が入力されているとする。 普通の/での入力で、日付シリアル値であるものとする。文字列の入力でないことが肝心。日付の表示形式はどれでもよい。 セルの値は日付シリアル値という整数である これなら、この年はYear($a$2)で判る。 日付シリアル値を扱うときは、年を確定しないと話しにならない。 ーーー C1に探したい任意の月日を入れる。 ただし、月日だけ入れるのはエクセルでは文字列になって面倒。 普通に3/1と入力し、C1の書式はm/dにして2009などを見えなくし、2009は使わないようにするのがよかろう(2009は今年C1に入力での話しだが)。 であるから 検索する日(=整数)はDATE(YEAR($A$2),MONTH($C$1),DAY($C$1) である(セルの値の実態は整数値。日付シリアル値。)。 関数で検索するのは、セルの値で、やるのだと言うことをしっかり認識のこと。 A表のデータにあわせた日付を作ったことになる。 するとA列での行は =MATCH(DATE(YEAR($A$2),MONTH($C$1),DAY($C$1)),$A$2:$A$100,0)+1 でもとまる。+1は2008/1/1を第2行目から始めているから。 これが判れば、隣の曜日列の曜日はINDEX関数で簡単に取れる。 式は =INDEX($A$2:$B$366,MATCH(DATE(YEAR($A$2),MONTH($C$1),DAY($C$1)),$A$2:$A$366,0),2) VLOOKUP関数でも同じように出来る。INDEXの第2引数が第1になり、第1引数がVLOOKUPの第2引数になり、第4が加わって「FALSE]を入れるだけ。

pi-man
質問者

お礼

質問、読みずらいようですみませんでした。 エクセルの前に国語の勉強も必要かもしれませんね・・・ 教えていただいた数式は、じっくり読みこんで研究してみます。 コピペで答えが出ればそれでOKという性格ではないもので、仕組みを理解してから使いたいと思っています。 どうもありがとうございました。

  • chiizu2
  • ベストアンサー率41% (164/400)
回答No.3

すみません 書き忘れですが C1に2月29日を入力するときだけ 2008/2/29と閏年の西暦を含めて入力すれば 問題なく表示します セルの書式設定で 日付→○月○日を選択しておけば m"月"d"日";@ C1は2008/2/29でも2月29日と表示されます

  • chiizu2
  • ベストアンサー率41% (164/400)
回答No.2

No.1の回答者の方の補足をいたします 表が1月1日に始まるのであればNo.1の回答者の方の式で 問題ないと思いますが >1年分の売り上げ分析を一枚のシート ということなので 会計年度 4月1日~3月31日 ということを前提にすると 表は4月1日に始まり1月1日以降は翌年ということになります そこで =ADDRESS(MATCH(DATE(IF(MONTH(C1)<=3,YEAR(A1)+1,YEAR(A1)),MONTH(C1),DAY(C1)),A1:A365,0),2) とすれば1月~3月はA1の年の翌年の1月~3月を表示することができます MONTH(C1)<=3の3は会計年度の終わりの月なので この数字を変えれば任意の月に変えることができます 閏年の問題ですが その年が閏年でない場合C1に2月29日と入力するとエラーとなります 2008/2/29→OK 2009/2/29→エラー

pi-man
質問者

お礼

ご指摘ごもっともでした。 私の場合は1月1日からで計算しています。 が、おっしゃるように4月1日からも考えられますし、1年のうちのある一定期間を対象とする場合、また年をはさんで期間を取りたい場合などには必要になってくると思われます。 どうもありがとうございました。

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.1

A1セルから下方にある年の日付が1月1日から下方に入力されているとします。B列には日付に対応した曜日が表示されているとします。 C1セルに1月1日と入力したときにA列での1月1日を探しそれに対応する曜日のセル番号をD1セルに表示させるには次の式をD1セルに入力すればよいでしょう。 =ADDRESS(MATCH(DATE(YEAR(A$1),MONTH(C1),DAY(C1)),A:A,1),2) この式ではADDRESS関数を使っていますが、そこでは最初の引数として行番号、次の引数は列番号としています。 行番号は月と日にちについてはC1セルの値を使っていますが年についてはA1セルに入力した年を使って日付を求め、その日付がA列で一致する行を求めています。その際にMATCH関数を使っていますがそこではうるう年などを考慮して引数の中で1を使っています。これはうるう年などでその日付が存在しない場合にはその日付の前の日付を検索するようにするためです。 式の中で引数の2は表の2列目を意味しB列をさしています。 上記の式で表示されるセル番地は絶対参照の形で表示されます。 1月1日の場合でしたら$B$1と表示されます。 このセル番地を相対参照にする場合には次のような式になります。 =ADDRESS(MATCH(DATE(YEAR(A$1),MONTH(C1),DAY(C1)),A:A,1),2,4) 引数の4が新たに追加されています。 なお、このセル番地の曜日を他のセルで使用する場合にはINDEX関数ではなくINDIRECT関数で=INDIRECT(D1)のように使うことになるでしょう。

pi-man
質問者

お礼

丁寧なご説明、ありがとうございます。 数式を読んで仕組みを研究してみます。 どうもありがとうございました。 >INDEX関数ではなくINDIRECT関数で=INDIRECT(D1)のように使うことになるでしょう 私の間違えでした、indsexでなくindirectでした。

関連するQ&A