- ベストアンサー
excelでのタスク表の期限設定に関して
お世話になります。質問させていただきます。 現在、エクセルにてタスク表を作成しています。 シート1に(コンマはセル区切りを意味しています) 「タスク表」 A,B,C 期限,タスク,状況 1/12,『包括マクロ経済』読破,未処理 1/12,佐藤さんへお礼状,完了 1/12,免許更新,未処理 1/13,リンスを購入,未処理 1/13,シャンプーを購入,完了 1/13,田中家へ挨拶に行く,未処理 1/14,木村家に電話,未処理 1/14,論文のテーマ決め,未処理 1/15,新年会の店予約,未処理 ・ ・ ・ ・ と記入されているのを、シート2に 期限が"3日以内に迫って"いて"未処理"の項目を"全て"自動表示させたいのですが、どのようにすればよいでしょうか? 例(シート2、本日を1/10とする) 「タスク期限近い項目表」 A,B,C 1/12,『包括マクロ経済』読破,未処理 1/12,免許更新,未処理 1/13,リンスを購入,未処理 1/13,田中家へ挨拶に行く,未処理 稚拙な説明にて恐縮です。 お詳しい方がおられましたら、アドバイスお願い申し上げます。 なお、関数、VBAともに初心者ですが、かろうじてスクリプト(プログラム)を解読することは可能です。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
1/11の場合。 ●Sheet1の右のほうのあいている列 (下の例ではD列)に作業列を作り、 ____A____B____C___D_ _1_期限_タスク__状況_抽出_ _2__1/9_『包括_未処理___1_ _3_1/11_佐藤さ__完了____ _4_1/11_免許更_未処理___2_ _5_1/12_リンス_未処理___3_ _6_1/12_シャン__完了____ _7_1/13_田中家_未処理___4_ _8_1/14_木村家_未処理___5_ _9_1/15_論文の_未処理____ 10_1/16_新年会_未処理____ D2 =IF(AND(A2-TODAY()<=3,C2="未処理"),COUNT(D$1:D1)+1,"") 下方向・↓ ●それをもとにSheet2に抽出 ___A____B_ 1_期限_タスク_ 2__1/9_『包括_ 3_1/11_免許更_ 4_1/12_リンス_ 5_1/13_田中家_ 6_1/14_木村家_ A2 =IF(ROW(1:1)>COUNT(Sheet1!$D:$D),"",INDEX(Sheet1!A:A,MATCH(ROW(1:1),Sheet1!$D:$D,0))) 下方向・↓右方向・→
その他の回答 (2)
- Nouble
- ベストアンサー率18% (330/1783)
配列数式を利用すれば意図も簡単にできますよ 先にお伺いしておきますが 一番左に並んでる日付は 文字列で入力されているのですか? それとも日時のシリアル値ですか? 一応どちらでも出来るのですが シリアル値を扱う方が格段に楽なので シリアル値で説明します まず期限ですが ファイルを見てる瞬間の日時は =today() とすれば求まります エクセルでは日付を日数で管理してますので 三日前は =today()-3 ですね これに達するとリストアップするわけですね 詰まり同じ意味として =today()-4 を越えたものが対象ですね これを先程の日付と比較します エクセルは考え方をプログラム言語のベーシックを元にしているようでして 確かにIF関数もいいのですが ただ単に括弧でくくるだけで結果が得られます この際左端はA列なので $A:$Aですね ではやってみましょう =($A:$A>today()-4) 次に 未処理ですが 同様に =($C:$C="未処理") とすれば求まります しつこいようですが エクセルで条件成立をtrue 不成立をfalseというのですが ベーシック同様内部的には0か1かで管理しているようです なのでこんなことが出来てしまいます =($A:$A>today()-4)*($C:$C="未処理") この際成立は1 不成立は0となります なのでこれらの中で1がどこにあるかを取り出せれば あとは参照する関数を使うだけですので もう9部9リンアルゴリズムは完成です で、見つけ方ですが 色々ありますか1例をあげますと 結局不成立のものは不要なので 「逆に不要なものを探して整理してしまう」 と言うやり方をします まずリストアップすべきものが何件あるか調べます 配列数式で要素内の数値を集計するのには sumproduct関数をよく使います 今回もこれを利用して =sumproduct(($A:$A>today()-4)*($C:$C="未処理")) とすれはいいでしょう つきに方針通り不要なものを整理します どうするかと言うと 結果から言えば 各要素のあった位置の行ナンバー情報を与えるのですが この際に不要なものには一定の上澄みをして その上で昇順に並べかえると 不要な要素と必要な要素は整理され分離されるのです まず不必要なものに一定の上澄みを施します 先の式は必要なものを示してますから、これにnotを施します =not(($A:$A>today()-4)*($C:$C="未処理")) 選択的に不要なものだけに上澄みを施すには 現状不要なもののみが1を示していることを利用して これに一定数を掛けてやればいいでしょう エクセルでは最大の行数が65535行目なので 後で行ナンバーを付与することを踏まえ この65535を掛けることにします =not(($A:$A>today()-4)*($C:$C="未処理"))*65535 次の行ナンバーの情報ですが 行ナンバーの情報はrow関数で取得できます こうです =row($A:$A) これを付与します =not(($A:$A>today()-4)*($C:$C="未処理"))*65535+row($A:$A) 最大行数はどの行でも同数なのでこれでいいでしょう では次は昇順にソートです small関数が使えます =small(not(($A:$A>today()-4)*($C:$C="未処理"))*65535+row($A:$A),1) スモール関数は最後の要素を必要とする順位と認識し値を切り出してきます ですので今回1を指定したので最小のものが求まるはずなのですが ここで困ったことに仕様と言う名のエクセルのバグが そうは問屋が卸さないとばかりに 邪魔をします そこで先の式に手を加えてまじないをかけます =small(index(not(($A:$A>today()-4)*($C:$C="未処理"))*65535+row($A:$A),0),1) 今回は 「こういう事もあるか」 位に受け止めて頂ければいいと思います これで要素の抽出は出来たようなもので 先に求めた件数分1件目から取り出して それを元に参照関数で参照すれば終わりです 今回は参照関数にoffset関数を使います ではいきます A列の1件目を参照で取り出す場合 =offset(A$1,small(index(not(($A:$A>today()-4)*($C:$C="未処理"))*65535+row($A:$A),0),1),0,1,1) しかしこれでは常に同じ内容しか出てこないのでもう一工夫 原因はスモール関数の順位が1に固定になってるからですので これをフィルする毎に楽に増えるように変えます 先ほども述べましたが row関数は参照先の行ナンバー情報を返しますから 参照先を通常よく使う相対参照形式で指定すると フィルする毎に参照先も相対的に行位置が下がるので この関数の返す値も増える と言う仕組みです =offset(A$1,small(index(not(($A:$A>today()-4)*($C:$C="未処理"))*65535+row($A:$A),0),row(A1)),0,1,1) 最大件数の制約も加えておきます =if(sumproduct(($A:$A>today()-4)*($C:$C="未処理"))<row(A1),"",offset(A$1,small(index(not(($A:$A>today()-4)*($C:$C="未処理"))*65535+row($A:$A),0),row(A1)),0,1,1)) あとは他シートから参照する仕様に変えるために 仮にタスク表があるシートをシート1とすると =if(sumproduct((シート1!$A:$A>today()-4)*(シート1!$C:$C="未処理"))<row(A1),"",offset(シート1!A$1,small(index(not((シート1!$A:$A>today()-4)*(シート1!$C:$C="未処理"))*65535+row($A:$A),0),row(A1)),0,1,1)) として 集計に使うシートの適切な場所 例えばA6にでも入力して C6までフィル後 下向きに必要分フィルすれば完了です バソで確認してないのでもしかしたら狂うかもしれませんが その際はここを閉めず その旨お知らせくだされば修正します
お礼
たいへんご丁寧にご解説いただき、誠にありがとうございました。 とてもお詳しく教えていただき、感激しました。 複雑なアルゴリズムを簡単に組めて、さらには解説もできるとは。 すごい憧れてしまいます。 このたびは本当にありがとうございました。 また困ったらよろしくお願いします。
- hige_082
- ベストアンサー率50% (379/747)
条件付書式を使用しては如何 条件付書式の条件1に =AND(TODAY()=$A1,$C1="未処理") 書式を赤色 条件2に =AND(TODAY()+3>=$A1,$C1="未処理") 書式を黄色 とすれば、未処理で当日は赤色 未処理で3日以内になったら黄色 視覚的に分かりやすいと思います 設定もABC列すべてを選択し、設定すれば1回で終わりますよ 参考までに
お礼
質問欄に先述させていただいたとおりなのですが、 条件付き書式でも「シート1のタスク表の期限迫り未処理項目を、シート2に反映する」ことが可能ということなのでしょうか? さっそく試してみようと思います。ありがとうございます。
お礼
ありがとうございます。 こんなにシンプルに設定できるものなのですね。 実際にうまくいく、とても感動しました。 ひじょうに感謝しております。重ね重ねもお礼申し上げます。