• ベストアンサー

エクセル2003 予定表

いつも回答して頂きとても感謝しております。 ・20行目に項目 ・21行目に警告発生日 が入力してあります。 で、この20~21行目の情報を元に、20行目の項目に対応する警告発生日が、4行目の日付に存在したら、警告発生日を含めてそれ以降の4行目の日付の列の9~18行目に項目を表示させたいのです。どのような方法があるのでしょうか?宜しくお願い致します。

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

  • ベストアンサー
  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.3

>で、勉強の為に聞きたいのですが、式がつながり過ぎて、どの式がどの式につながっているのかさっぱり分かりません。 >よろしければ、少し教えて頂けないでしょうか?  まず考え方を説明致します。  当たり前の話ですが、項目名が現れる順番は警告発生日の日付が古い順となります。  そして、 >1つ目は、aa/bb/ccの順ではなく、9行目にeeと一度表示させたらeeの表示行を9行目に固定させたい。2つ目は、周期到達日以降も表示させたい。 という条件により、 「1度表示された項目名は、それ以降の日付が入力されている列においても常に同じ列に表示され続け、途中で消える事は無い」 という事になりますから、警告発生日の古い項目名から先に表示され、先に表示されたものが上の行に表示され、後から表示されたものが下の行に表示されるのですから、 「9行目~18行目に表示される項目名の順番も又、警告発生日が古いものが上、若いものが下になる様に表示しなければならない」 という事になります。(各行に表示する項目名は、警告発生日によって最初から決まっている)  そして、9行目~18行目の各行において決まっている項目名を、項目名毎に決まっている警告発生日に達した処で、表示する様にすれば良い訳です。  次に関数の中身に関して説明致します。 =IF(OR(ROWS($9:9)>COUNTIF($21:$21,"<="&C$4),ISERROR(1/(YEAR(C$4)>1904))),"",INDEX($20:$20,MATCH(SMALL($21:$21,ROWS($9:9)),$21:$21,0))) という関数の先頭で使われているIF関数において、 OR(ROWS($9:9)>COUNTIF($21:$21,"<="&C$4),ISERROR(1/(YEAR(C$4)>1904))) という部分が判定式の部分であり、 "" という部分が「判定が真の場合に行う処理」の部分であり、 INDEX($20:$20,MATCH(SMALL($21:$21,ROWS($9:9)),$21:$21,0)) という部分が「判定が偽の場合に行う処理」の部分です。  判定式の所ではOR関数でまとめられた2つの判定が行われていて、2つの判定の内の後半に記述されている方の ISERROR(1/(YEAR(C$4)>1904)) という判定式は、「その関数が入力されている列において、4行目に入力されている値が、日付のデータでない場合においてTRUEとなる関数」です。 YEAR(C$4) という具合にC4セルの値をYEAR関数をで処理する場合、C4セルに入力されている値が、万が一、文字列や負の数といった日付には変換出来ない値であった場合には、年数を求める事が出来ずにエラーとなりますから、エラーとなった事をISERROR関数を使って検知する事で、IF関数の「真の場合」の所に記述されている "" という表示、即ち何も表示しない状態とし、入力ミス等で日付ではない変な値が入力されていた場合であっても、エラーが表示される様な事態となる事を回避している訳です。  尚、4行目の日付欄に何も入力されていない場合、空欄は数値の0として扱われ、Excelが日付データを扱う際には数値の0は1900年1月0日1904年1月1日と見做されますから、C4セルが空欄となっている場合には、 YEAR(C$4) の値が1904となる恐れがあります。  そこで、4行目のセルが空欄である場合には表示を空欄とするために、ISERROR関数の中身を 1/(YEAR(C$4)>1904) とする事で、YEAR関数の結果が1904年以下となった場合には、次の様に 1/(YEAR(C$4)>1904)   ↓ 1/(YEAR("")>1904)   ↓ 1/(YEAR(0)>1904)   ↓ 1/(1904>1904)   ↓ 1/(FALSE)   ↓ 1/(0)   ↓ 1/0   ↓ #DIV/0! ISERROR関数の中身がエラーとなる様にしている訳です。  次に、判定式の前半である ROWS($9:9)>COUNTIF($21:$21,"<="&C$4) という部分の中の、左辺のROWS関数 ROWS($9:9) によって、9行目~18行目の範囲内において上から数えて何行目になるのかを計算しています。  一方、右辺の COUNTIF($21:$21,"<="&C$4) という部分は、21行目に入力されている複数の警告発生日の中に、4行目に入力されている日付以下の日付(より古い日付)が何日あるのかという事をカウント、即ち、4行目の日付の日には警告発生日に達している項目の数をカウントしています。  ですから、 ROWS($9:9)>COUNTIF($21:$21,"<="&C$4) という部分は、その関数が入力されている行が、行番号9行の行を第1行とした場合の何行目に当たるのかという行数を数えて、その行数が、警告発生日に達している項目の数よりも多い場合には、TRUEを返す事により、セルの表示をIF関数の「真の場合」の所に入力されている値である空欄としている訳です。  そして、4行目に入力されている値が日付データであり、尚且つ、関数が入力されている行の(9行目から数えた)行数が、警告発生日に達している項目の数以下である場合には、IF関数の「偽の場合」の処理へと進む事になります。  「判定が偽の場合に行う処理」の部分である INDEX($20:$20,MATCH(SMALL($21:$21,ROWS($9:9)),$21:$21,0)) というINDEX関数の中の SMALL($21:$21,ROWS($9:9)) という部分は、(9行目から数えた)行数が1行目の場合には、21行目に入力されている数値の中で、1番小さな値、即ち1番古い警告発生日を返します。  同様に、2行目においては2番目に古い警告発生日を返し、3行目においては3番目に古い警告発生日を返し、・・・・・10行目においては10番目に古い警告発生日を返します。  次に、 MATCH(SMALL($21:$21,ROWS($9:9)),$21:$21,0) という部分において、SMALL関数で求めた警告発生日をMATCH関数の検索値とする事で、21行目の中の何列目に、該当する警告発生日が入力されているのかを求めます。  次に、そうして求めた警告発生日が入力されている列番号を表す値を、 INDEX($20:$20,MATCH(SMALL($21:$21,ROWS($9:9)),$21:$21,0)) の様に、INDEX関数における列番号を指定する値として用いる事により、「9行目から数えた行数」番目に古い日付が入力されている列の、20行目の値、即ち、項目名を求めている訳です。

kero1192kero
質問者

お礼

返事が遅れてしまい申し訳ありませんでした。 事細かく教えて下さりありがとうございます。今後の式を書く時の参考に出来る様に自分のスキルが上がればと思っています。本当にありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.2

>周期到達日以降も表示させたい。  これは先走りが過ぎてしまい、大変失礼致しました。  それでしたら、C9セルに次の関数を入力してから、C9セルをコピーして、C9~AG18の範囲に貼り付けて下さい。 =IF(OR(ROWS($9:9)>COUNTIF($21:$21,"<="&C$4),ISERROR(1/(YEAR(C$4)>1904))),"",INDEX($20:$20,MATCH(SMALL($21:$21,ROWS($9:9)),$21:$21,0)))

kero1192kero
質問者

お礼

自分が思っていた通りに表示されているのでびっくりです。 で、勉強の為に聞きたいのですが、式がつながり過ぎて、どの式がどの式につながっているのかさっぱり分かりません。 よろしければ、少し教えて頂けないでしょうか? 宜しくお願い致します。

全文を見る
すると、全ての回答が全文表示されます。
  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.1

 前回の御質問 【参考URL】  エクセル2003 予定表 【OKWave】   http://okwave.jp/qa/q8351573.html でも思っておりましたが、説明が滅茶苦茶だと思います。  前回の御質問に対して回答した際には、私は御質問文に記されている内容からパターンを読み取る事で、質問者様がどの様な事をおやりになりたいと思っておられるのかを推測して回答したため、前回の御質問におけるshintaro-2様の御回答に対する補足を読んでいなかったのですが、その補足内容を改めて読み直してみました処、そちらも又、説明が無茶苦茶で、 >(項目aaが1/2に達していないので) と書かれている後に、 >(項目aaが1/2に達してたので) 等と書かれておるなど、内容が矛盾しております。  今回の御質問内容も、おそらくは >20行目の項目に対応する警告発生日が、4行目の日付に存在したら、警告発生日を含めてそれ以降の4行目の日付の列の9~18行目に項目を表示させたいのです。 という事ではなく、 「C21~T21のセル範囲に入力されている警告発生日の中に、各列の4行目に入力されている日付以前の日付が入力されているものがあれば、その該当する警告発生日が入力されている列(複数の場合もあります)の中の、20行目の所に入力されている項目名を全て取り出して、4行目に入力されている日付の下の行番号9~18行の所に、漏らさずに表示させたい」 という事ではないでしょうか?  但しこれは、この質問No.8355264で質問者さまが仰っておられる条件を、日本語の文章として意味が通じる様に意訳しただけの内容であり、質問者様が仰っておられると思われる、その条件のままでは、4行目に警告発生日以降の日付が入力されている全ての列において項目名は表示される事になりますから、周期到達日以降の日付となっている列においても、項目名は消える事なく表示されるという事になりますが、それで宜しいのでしょうか?  前回の御質問内容から考えて、おそらくはそういう事ではなく、 「各列の4行目に入力されている日付と比較して『C21~T21のセル範囲に入力されている警告発生日の中で先述の4行目の日付以降(4行目の日付も含む)の日付となっていて、尚且つ、その警告発生日の下の行番号22行の所に入力されている周期到達日が先述の4行目の日付よりも前の日付(4行目の日付を含まない)となっている』という条件を満たしている列があれば、その列(複数の場合もあります)の20行目の所に入力されている項目名を全て取り出して、先述の4行目に入力されている日付の下の行番号9~18行の範囲内に、漏らさずに表示させたい」 という事なのではないかと思います。  仮に、上記の私の推測が間違ってはいないものとした場合には、次の様な方法となります。  まず、C9セルに次の様な関数を入力して下さい。 =IF(OR(ROWS($9:9)>C$6,ISERROR(1/C$6)),"",INDEX($C$20:$T$20,SUMPRODUCT((COUNTIF(OFFSET($B$21,,1,1,COLUMN($C$21:$T$21)-COLUMN($B$21)),"<="&C$4)-COUNTIF(OFFSET($B$22,,1,1,COLUMN($C$22:$T$22)-COLUMN($B$22)),"<="&C$4)<ROWS($9:9))*1)+1))  次に、C9セルをコピーして、C9~AG18の範囲に貼り付けて下さい。  以上です。

kero1192kero
質問者

お礼

前回に引き続き回答して頂きありがとうございます。 説明が滅茶苦茶で申し訳ありません。入力している時、何度も読み直して入力しているつもりなんですが、ここに投稿していると、同じような御指摘を何度も受けてしまいます。日本語って難しいですね。 で、今回の提示していただいた式を貼り付けてみました。 少し自分が思っている事と違うので、違う部分の説明をさせて頂きます。 1つ目は、aa/bb/ccの順ではなく、9行目にeeと一度表示させたらeeの表示行を9行目に固定させたい。2つ目は、周期到達日以降も表示させたい。の2点です。自分で修正を試みようと思いましたが、式が長くてどうすれば自分の思ったようになるのか分かりません。kagakusukiさんに頼りっぱなしで申し訳ないのですが、宜しくお願い致します。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • エクセル2003 予定表作成・・・

    いつも回答して頂き、とても感謝しています。 例えば (1)20行目に項目が表示。 (2)21行目に警告発生日が表示。 (3)22行目に周期到達日が表示。 項目がaaの箇所の警告発生日が2012/12/19、周期到達日が2013/1/2 項目がbbの箇所の警告発生日が2012/12/26、周期到達日が2013/1/9 となっている場合、 1/1の列の6行目が2で7行目が0.。 1/2の列の6行目が1で7行目が1.。 1/3の列の6行目が1で7行目が1.。 1/4の列の6行目が1で7行目が1.。 1/5の列の6行目が1で7行目が1.。 1/6の列の6行目が1で7行目が1.。 1/7の列の6行目が1で7行目が1.。 1/8の列の6行目が1で7行目が1.。 1/9の列の6行目が0で7行目が2.。 と表示させようと思っていますが、どのような関数で表示可能でしょうか? 宜しくお願い致します。

  • excelで作ったカレンダーの指定の期間のセルに色を付けたい

    1行目に1日から30日までの日付が入っていて、二行目以降のAの列に項目が入っているカレンダーを作りました。2行目以降には日付を入れないで、その項目によって期間が分かるようにセルに色を付けたいと思います。入力欄は別に設けて、例えば、2004/6/20~2004/6/23と入力するとセルの色が変わるようにしたいです。 どうしたらいいでしょうか?

  • エクセルで予定表作成 祭日に色帯を

    エクセル2010を使用しています。 エクセルで予定表を作成しています。B列に日付・C列にコメント記入欄を作成 B列 311行に11月3日 文化の日がありますが、色帯になります。しかしB列331に11月23日 勤労感謝の日、B列362に12月24日 振替休日には 色帯が付きません。予定表のB列370行目以降には1年の祭日を設定しています。 どこを確認すれば、良いのでしょうか

  • エクセルで予定表を管理。

    たとえば、下のような(1)の表を元に、別のシートの(2)のカレンダーの日付と、 1)の日付と担当者が、一致したセルへ、”開始”という文字をを自動で入れる事はできるのでしょうか? また表示後にも、”開始”が目立つようにセルに色が入ると見やすいのですが・・・。 こういった場合は、どうしたらいいのでしょうか?良い知恵をお願い致します。 よろしくお願いいたします。m(_ _)m (1)      A 列    B 列     E列  1    日付   担当者     開始 2   2007/6/7  あ 3   2007/6/1  い 4   2007/6/10  う (2)カレンダー    A列  B  C  D... G  H  I  J  K 1行 担当者 6/1 6/2 6/3,,,6/6 6/7 6/8 6/9 6/10........ 2行  あ             開始 3行  い  開始 4行  う                      開始

  • エクセル表

    エクセルの表で、個人カルテの様な物を作成してます。 ○12345   6789 △12345  6789 ×12345  6789 と○△×に各1~9迄のセルに一ずつ項目に情報を入力しています。 ○△×の列にフィルタをかけると、12345と6789の行がおかしくなってしまいます。どなたか、○△×1列2行を一つのグループとして設定する方法を教えて頂けないでしょうか??ちなみにエクセル初心者です。宜しくお願いします。

  • 1.excelで年間予定表と別シートの月間予定表が連動した予定表を作成

    1.excelで年間予定表と別シートの月間予定表が連動した予定表を作成したい。 2.別シートの月間予定表(1年分を横に並べている)では、月毎に (1)当月分の左端に年間予定表の当月分、 (2)その右に、年間予定表の予定項目ごとに[列を与えて]整理して予定を書いている。 3.月間予定表の(1)を年間予定表と連動させたい。 即ち、年間予定表の予定項目を追加、書き換え、削除したとき、月間予定表の(1)が自動的に訂正されるようにしたい。 4.年間予定表は6月分をA4横1ページに、月間予定表は一月分をA4縦1ページにプリントアウトしている。画面で見るだけではなく、プリントも利用している。  年間予定が時々変更になり、それに合わせて月間予定を書き変えねばならないので、連動すれば大変助かります。よろしくお願いします。 以下は多くの人にとって読む必要はないと思います。 ご助言の参考になればと思い、今使っている年間予定表・月間予定表の実態を示したものです。 ☆ 年間予定表は1行目に月(1月から12月) 2行目以下は月ごとに、最左端(1月の場合A列)に日付、その次の列(1月の場合B列)に曜日 その次の列(1月の場合C列)に年間予定項目(例:箱根ドライブ、九州ドライブ、自治会総会…)を記入する。 ☆ 別シートの月間予定表: ア:各月ごと(例えば1月)の最初の3列は年間予定表(例えば1月)の月名、日付、曜日、年間予定項目をカット&コピーで張り付ける。  又は、=関数を使う。即ち月間予定表のa列1行目に=を使って、年間予定表のa列1行目をもってくる。月間予定表のa列1行目を31日までドラッグして年間予定表に同期させる。同様のことを、残りの2列についても実行する。(この方法は1月分に3回、1年分で36回繰り返さなければならない。もっと楽な方法、ありません?) イ:各月ごとの4列目から概ね10列目に年間予定項目ごとの詳細計画を記入する。 例えば、 4列目の1行目(タイトル行)箱根ドライブ 4列目の2行目以下の該当する日ごとに、(例えば4日)箱根の情報収集、(6日)旅館決定、(15日)ドライブ実施  5列目の1行目(タイトル行)九州ドライブ 5列目の2行目以下の該当する日ごとに、(例えば8日)九州の情報収集、(10日)旅館決定、(11日)友人に連絡 (25日)ドライブ実施 以上です。

  • エクセル2003 条件付き書式について

    こんにちは。いつもお世話になっております。 早速ですが、下記のような作業を条件付き書式で対応したいのですが教えて頂けますでしょうか。 ◆エクセルのバージョン → エクセル2003 ◆データ項目(列) A1(日付)/A2・・・以降A30位まで(作業項目) 各日の作業入力を列ごとにおこなっているので A2以降のセルに文字入力があればA1セルを自動的に塗りつぶし(水色) という作業を行いたいのですが条件付書式で対応可能でしょうか?

  • エクセル表→セル内データ更新→同じ行の最終更新日欄の日付を自動更新 し

    エクセル表→セル内データ更新→同じ行の最終更新日欄の日付を自動更新 したい。 エクセルで作成した表で、表の中のデータを更新した場合に、その行の最後の列の「最終更新日」の日付を自動的に更新する方法を探しています。 具体的には、エクセルで1行目のA列に「データのキーワード」、B列に「データのハイパーリンク」、C列に「データ記入者」、D列に「最終更新日」の項目を作成し、2行目以降に作成した各データをA~Cの項目に従って記入してデータ一覧表を作成しています。 その際に、A,C列の項目を更新した時と、B列項目のリンクを開いた時に、同じ行D列の最終更新日の日付を自動で入力及び更新する方法はないでしょうか? 恐らくマクロを組む必要があると思うのですが、全くの素人ですので是非教えて頂けないでしょうか? すみませんが、宜しくお願い致します。

  • excel

    エクセル 項目1から項目5の5行×5列の表 1行目:タイトル 項目1、――、項目5 2行目から4行目がデータ 項目1と項目2の組合せを重複なくG列以降に存在するだけ G列   H列 ------------------ 項目1  項目1---------------- 項目2  項目2---------------- という形で出力する。(但し項目1は昇順で) という問題どう解決すればよいでしょうか。但し実際は100行×5列のデータですが。 簡単にやる方法教えてください。

  • エクセルVBA 行追加時に自動で罫線を引きたい

    こんにちは。いつもお世話になっています。 エクセル2007を使用し、データーベースの表を作っています。 A列からE列まで情報の項目があり、(日付・名前等) 3行目からずっとデータを入力しています。 新しい行に、A列からE列の間に何か入力した時、 もしくは入力してある最終行にカーソルがある時、改行を押した場合 次の新規の行AからEまで、自動に罫線を引くにはどうしたらよいのでしょうか?

専門家に質問してみよう