[[20040324220142]] 『○日経過のリストをリアル生成』(ゼニハコベ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『○日経過のリストをリアル生成』(ゼニハコベ)

現在が2004/1/9の時

    A          B       C    
1 2004/1/1  A君  AA@AA
2 2004/1/2 B君  BB@BB
3 2004/1/2 C君  CC@CC
4 2004/1/4 D君  DD@DD
5 2004/1/6 E君  EE@EE
6 2004/1/8 F君  FF@FF

の、リストがあり

シート名「3日前」に

  A    B

1 EE@EE E君

シート名「7日前」に

  A    B

1 BB@BB B君

2 CC@CC C君

のように、3日前と、7日前のリストを毎日更新出来るようにするには
どうすれば良いのでしょうか?


 VBA(マクロ)に頼ることになりそうですけど・・
 構わないでしょうか?

  (INA)

[[20040324105150]]
『データの抽出について』(超初心者)
 にレスした応用として書き込みます。
元データ(Sheet1とします)のD列に作業列を設け、C列には、重複が無いものとして考えています。
元データのD1セルに
=TODAY()-A1
例の検証で考えると
="2004/1/9"-A1
とし、D6までコピー。
表示するシート(7日前、3日前)のA1に
=INDEX(Sheet1!$C$1:$C$6,SMALL(IF(Sheet1!$D$1:$D$6-LEFT(RIGHT(CELL("filename",A1),LEN(CELL("filename",A1))-FIND("]",CELL("filename",A1),1)),FIND("日前",RIGHT(CELL("filename",A1),LEN(CELL("filename",A1))-FIND("]",CELL("filename",A1),1)),1)-1)<>0,"",ROW(Sheet1!$D$1:$D$6)),ROW()))
とし、Ctrl+Shift+Enter で配列数式として確定します。( { } で括られた式になります)
また、該当値が無い場合は、 #NUM! が表示されます。
B1に
=IF(ISERROR(A1),"",INDEX(Sheet1!$B$1:$B$6,MATCH(A1,Sheet1!$C$1:$C$6,FALSE),))
A1・B1セルを下方コピー
いかがでしょうか?
(sin)  明日より多忙につき、本日、書き溜め!&打ち止め


凄い凄い凄い凄い、これは凄い
昨日徹夜で、他は見えなくする方法で作ってましたが
素晴らしいですね、

BやCに重複があり、最新のみを出力するには、どうすれば・・・・

(ゼニハコベ)

追加
現在元データは、E列で、何回目カウントをしており

 B   E

A君   1

B君   1

C君   1

D君   1

E君   1

B君   2

F君   1

G君   1

C君   2

H君   1

B君   3

A君   2

このような状態です

3日目は、古い方、Eが1の時だけ抽出
7日目は、最新を抽出・・・・のように出来ますか


 一般機能でお望みのようですので、退散します。

 それでは〜 ~~~ヾ(^_^)

  (INA)


なるほど、説明不足でした
その3日前のデータは、過去初めてか?という事です

3日前の一覧は、初めての人だけを表示したいので
重複カウントEが1を表示しているものだけを表示したいのです

7日前は、そのままで良かったみたいです

(ゼニハコベ)


ありがとう御座います

昨日も徹夜で頑張ってみたのですが

数十のデータなら上手く機能しているみたいなのですが

3000以上のデータでは、なかなか表示してくれないようです・・・

(ゼニハコベ)


もう一度整理して書きます

現在が2004/1/9の時

    A          B       C    D    E   
1 2004/1/1  A君  AA@AA       1
2 2004/1/2 B君  BB@BB       1
3 2004/1/2 A君  AA@AA       2
4 2004/1/2 D君  DD@DD       1
5 2004/1/5 E君  EE@EE       1
6 2004/1/6 B君  BB@BB       2
7 2004/1/6 F君  FF@FF       1
8 2004/1/6 A君  AA@AA       3
9 2004/1/7 E君  EE@EE       2
10 2004/1/8 F君  FF@FF       1

(Eは、同君の入力回数)

シート名「3日目」に

  A    B

1 FF@FF F君

説明、入力され7日目経過したデータ

6 2004/1/6 B君  BB@BB       2

7 2004/1/6 F君  FF@FF       1

8 2004/1/6 A君  AA@AA       3

この中では、F君は、初めてなので、出力

シート名「7日目」に

  A    B

1 DD@DD D君

説明、入力され7日目経過したデータ

  A    B    C    D    E

2 2004/1/2 B君  BB@BB       1

3 2004/1/2 A君  AA@AA       2

4 2004/1/2 D君  DD@DD       1

この中の、A君B君は、更新されてるが

D君の更新は無いので、出力

率直に言うと、

3日目に、初めて使ってみてどうでしたか?

7日目に、そろそろ交換時期ですね・・・・

としたいのです。

シートを隔てると、かなり重いみたいなので

一旦 同シートに

  O    P    Q    R

1 FF@FF F君 DD@DD D君

のように出力して

3日目シート

A1

 =入力!O1
B1
 =入力!P1

7日目シート

A1

 =入力!Q1
B1
 =入力!R1

で、表示させたいと思います

(ゼニハコベ)


jun53さん、本当にありがとうございます。

3日目の方はバッチリです!
諦められたらどうしょうかと、ドキドキしてました・・・

7日目は、7日間入力が無いデータの一覧、と言った方が解りやすいでしょうか・・・
最後の入力から、7日経過した一覧、なのですが、出来ますでしょうか?


 手が空きました。jun53さん代わりの回答ありがとうございました。
意味が分からず、しばし傍観していましたが、
チョット考えてみたので、書き込みます。
その前に、ゼニハコベさん、ちょっと疑問があるのですが、
>3日目に、初めて使ってみてどうでしたか?
2日目、1日目にも名前が出て来る事は無いのでしょうか?
>7日目に、そろそろ交換時期ですね・・・・
以前に何回出てこようが、7日目以降に名前が出なければ、該当するという事ですね?
以下、『3日目、7日目以降に名前が出てこないものが対象』を前提として考えてみました。
今回は、式が長くなるので、Sheet名からの読み込みにはしておりません。
  元データ(Sheet1)の作業列
D1: =$G$1-A1   G1セルに日付を入力(2004/1/9)
E1: =COUNTIF($B$1:$B1,$B1)  該当行以前での回数※A列は、日付順に並び替え(入力)が前提
F1: =COUNTIF($B$1:$B$10,$B1) データ全体での回数
D1:F1を10行目までコピー
  3日目シート
A1: =INDEX(Sheet1!$C$1:$C$10,SMALL(SUMPRODUCT((Sheet1!$D$1:$D$10=3)*(Sheet1!$E$1:$E$10=1)*(Sheet1!$F$1:$F$10=1)*(ROW(Sheet1!$D$1:$D$10))),ROW()))
B1: =IF(ISERROR(A1),"",INDEX(Sheet1!$B$1:$B$10,MATCH(A1,Sheet1!$C$1:$C$10,FALSE),))
    7日目シート
A1: =INDEX(Sheet1!$C$1:$C$10,SMALL(SUMPRODUCT((Sheet1!$D$1:$D$10=7)*(Sheet1!$E$1:$E$10=Sheet1!$F$1:$F$10)*ROW(Sheet1!$D$1:$D$10)),ROW()))
B1: =IF(ISERROR(A1),"",INDEX(Sheet1!$B$1:$B$10,MATCH(A1,Sheet1!$C$1:$C$10,FALSE),))
今回は、そのままEnterで確定して下さい。
3日目=3日目の回数が、日付順でも、全体でも『1』が対象と考えました。
7日目=7日目の回数が、日付順でも、全体でも『同じ=最終数』と考えました。
データの重さは、考慮しておりません、あしからず (sin)

 ゼニハコベさん、私の書込み現実的ではありませんでした。
試しに、データ、数式を5000行分コピーしてみましたが、再計算に時間が掛かりすぎます。
代案1
オートフィルターを使う。(←再計算の状況を眺めていられる程度の速さです)
Sheet1 G1セルに =IF(E1=F1,1,"") を付け加え、
3日目の場合は、D列で3、E列で1、F列で1を選択
7日目の場合は、D列で7、G列で1を選択
B:C列をコピーし、目的のシートに値で貼り付け、C列選択、切取り、B列選択、切取った列の挿入
が、現実的かも。
代案2
詳しく無いので(扱えないので)、確証はありませんが、マクロで処理すれば計算が速いかも?
代案2をご希望の場合は、退散されたINAさんに再度ご登場していただくか、他の方の書込みを
お待ち下さい。 (sin)


jun53さん、本当にありがとうございます
>最後の入力から、7日経過丁度のものだけ
意味は、これで良いのですが、7日目として表示されてる中から選んで
新たに入力すると、その7日目の中の一番下へ表示される場所がかわるだけのようです。

=COUNTIF(B$1:B1,B1)
の上下逆の表示出来れば、良いのではないでしょうか?
最終入力が1、過去の重複が2以上になりますので

sinさんも、ありがとうございます。
3日目の場合、3日間に新たに入力があってもそのままでOKです
7日目は、その通りです


 頭パンクです。
何がなんだか、何のことやら、・・・
ぼんやりとした疑問は、
同日付で同名の入力が、現実的に起こりえるのか???
こんな意見しか言えません。 (sin)

 やっと、意味が分かってきました。&自分の間違いに気付きました。
>7日目として表示されてる中から選んで
>新たに入力すると、その7日目の中の一番下へ表示される場所がかわるだけのようです。
元あった行以降に同じものを入力すると、例え同じ7日目であったとしても、
行o=入力日付順として検索させているため、
新たに入力したものが、最新の情報として計算されています。そのため、
行全体で、7日目該当値の中の該当行位置(行番号の小さい物順)に表示されます。

 訂正式は、下記の通りです。チョット勘違いをしていました。お手間を取らせゴメンナサイ!
7日目A1セル
=INDEX(Sheet1!$C$1:$C$100,SMALL(IF(Sheet1!$D$1:$D$100*(Sheet1!$E$1:$E$100=Sheet1!$F$1:$F$100)<>7,"",ROW(Sheet1!$D$1:$D$100)),ROW()))
Ctrl+Shift+Enterで配列数式として確定。
3日目A1セル
=INDEX(Sheet1!$C$1:$C$100,SMALL(IF(Sheet1!$D$1:$D$100*(Sheet1!$E$1:$E$100=1)<>3,"",ROW(Sheet1!$D$1:$D$100)),ROW()))
Ctrl+Shift+Enterで配列数式として確定。
※※※ ○君や○○@○○が、同じものが二人存在するならば、上記式を応用し、B1セルに入れてください。
100行では、問題なく再計算されますね! (sin)


sinさんありがとうございます
7日目の方で、やはり以後重複があると順番が入れ替わるだけのようです

考えてみたのですが
3日目の、初めまして出力は
E列の重複チェック
=COUNTIF(B$1:B$5000,B1)
これだと、出力すべき物でも、新たに入力があると、1では無くなるので
=COUNTIF(B$1:B1,B1)
こちらの方が正解だと思います

7日目の、最終入力から7日経過しました出力は
E列の重複チェックを
=COUNTIF(B1:B$5000,B1)
こうすれば、正しく出力できてるようです
現在チェック中です

(ゼニハコベ)


 『何が正解か?』に関しては、『どういう条件下でどうしたいのか?』に依りますので、
一番分かっているゼニハコベさんが、決めて(提示して)ください!
jun53さんにしても私にしても、その他の助言・回答を準備してくれている方々も、それ無しでは、推測でしかコメント出来ません。
以下、私の推測による5000行データ対応策_訂正版です。
Sheet1データA〜E列5000行、3日目・7日目シート関数数式入力A〜B列1500行でテストしました。
データ容量2.6MB、カップ○ー○○にお湯を入れて、ファイルを開き再計算が終了した時点で
カップ○ー○○を食べると『早かったか?』ぐらいの待ち時間です。 例えになってないかな?
Sheet1A列には、日時順に入力し最終行が最新の入力情報となる と推測しました。
B列△△君に関しては、重複(同姓同名)も有り得るが、
C列××@××に関しては、一人一人固有のもの と推測しています。
Sheet1のD,F列およびG1,H1セルを作業用に使用します。
G1セルでA列の最終行を出します。
=MAX(IF(A1:A10000<>"",ROW(A1:A10000)))  Ctrl+Shift+Enterで確定
F1セルにA列最終行の日付を表示します。※任意の日付を指定する場合は、入力して下さい。
=INDIRECT("A"&G1)
D1セルでH1セルとの差を出します。jun53さんが、書き込まれたのを参考にし、
=IF(A1="","",$H$1-A1)
E1セルでは、D1セルが3の場合と、7の場合とで処理を分けました。ゼニハコベさんの書き込まれた案を参考にし、
D列が3の場合は、1行目から該当行間の数、7の場合は、該当行から最終行間の数を計算します。
=IF(A1="","",IF(D1=3,COUNTIF($C$1:C1,C1),IF(D1=7,COUNTIF(INDIRECT("C"&ROW()&":C"&$G$1),C1),0)))
3日目シートA1セル
=INDEX(INDIRECT("Sheet1!C1:C"&Sheet1!$G$1),SMALL(IF(INDIRECT("Sheet1!D1:D"&Sheet1!$G$1)*INDIRECT("Sheet1!E1:E"&Sheet1!$G$1)<>3,"",ROW(INDIRECT("Sheet1!A1:A"&Sheet1!$G$1))),ROW()))
Ctrl+Shift+Enterで確定
3日目シートB1セル
=INDEX(INDIRECT("Sheet1!B1:B"&Sheet1!$G$1),SMALL(IF(INDIRECT("Sheet1!D1:D"&Sheet1!$G$1)*INDIRECT("Sheet1!E1:E"&Sheet1!$G$1)<>3,"",ROW(INDIRECT("Sheet1!A1:A"&Sheet1!$G$1))),ROW()))
Ctrl+Shift+Enterで確定
7日目シートには3日目の各式の『<>3』を『<>7』にするだけです。

 Sheet1のE列は、D列が3又は7の場合のみカウントさせ、それ以外の場合には0にします。
3日目、7日目に表示するのは、Sheet1のD列が3、7でE列が1の場合ですので、D列×E列が3、7になる場合のみです。
これで、いかがでしょうか? \/ 近頃手もつないでいないな (sin)

 パチパチパチパチ!
 指紋が無くなる程の拍手。
 「あ〜痛っ!」
 sinさん、後二日で開幕でっせ。
万障繰り合わせて応援を!
    名も無き(阪神ファン)
 先日の伊良部良かったでッ。


できました!!
sinさん
jun53さん
本当にありがとうございます。
今、同じファイルに何通りものリストが混在していますので
分離して、早く処理出来る方法を選択したいと思います
今日は早く眠れそうです、

ここまで複雑になると教えて頂いた方法を自分のシートに合うように
書き換えるのも大変ですね
一発で置き換える方法ってあるのでしょうか・・・・・
(ゼニハコベ)


 お役に立てたようでホッとしています。
 >一発で置き換える方法ってあるのでしょうか・・・・・
血と汗と涙を流した分、何かを運んでくれるのでしょうから、がんばって下さい。
きっと、見返りがあるでしょう。
銭は増えずに、仕事だけが増えたりして…、でも信頼も増えているから良しとしましょう
※私は、3日目A1の式を基本とし、それをコピーし、セル指定部分の書き換えで済ましました。

 名も無き(阪神ファン)の弥太郎さん(んっ?)
今年のポイントは、赤星の振り逃げ、二盗、三盗、本盗  結果はどうであれ、見てみたい。
見てみたいといえば、日本シリーズ 近鉄vs阪神 ←毎年同じ予想(願望)
実現したら…、考えただけ満面の笑みです。
おしゃべりがすぎました。 退散します (sin)


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.