[[20150829175403]] 『差の出し方』(T1508) ページの最後に飛ぶ

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

 

『差の出し方』(T1508)

お世話になります。

A列:グループ名
C,H,M...列:数値
E,J,O...列:C,H,M...列の順位(グループ別の)
G,L,Q...列:E,J,O...列の1位には2位との差を、2位には3位との差を..
      と以下順に表示する

G,L,Q...列に関数式を入力したいのですが、同順位があったり「飛び」順位が
あるため、うまくいきません。
考え方をご教示願えないでしょうか?
尚、順位は最大で18位まで、全体の行数は10000行程度までです。

< 使用 Excel:Excel2010、使用 OS:Windows7 >


頭を捻らずに理解ができるよう、
そして問題が正確に伝わるよう、
具体的なサンプルを提示してもらえますか?

(γ) 2015/08/29(土) 19:36


うまく説明できずにすみません。

 A	B	C	D	E	F	G	H	I	J	K	L
 店1	-	43.9	-	4	-	-	20	-	8	-	-
 店1	-	54.5	-	3	-	10.6	135	-	1 	-	85
 店1	-	23	-	12	-	-	50	-	3	-	-
 店1	-	72.3	-	2	-	17.8	135	-	1	-	85
 ("-" は省略です)

例えばですが、1位が2個あれば2位はないので、1位のところは1位と3位の差を表示したいです。

作業列を設ければ何とかなりそうに思うのですが、列数も結構あり今から
手を加えるのも面倒そうなので...
(T1508) 2015/08/29(土) 23:22


 首を突っ込んだ手前、何もしないのもどうかと思いコメントしておきます。

    A列         B           C           D
  1  グループ   得点        ランク      得点差
  2 g1          50          7           #N/A
  3 g1          55          6           5
  4 g1          60          4           5
  5 g1          60          4           5
  6 g1          80          2           20
  7 g1          80          2           20
  8 g1          100         1           20
  9 g2          50          7           #N/A
 10 g2          58          6           8
 11 g2          70          4           12
 12 g2          70          4           12
 13 g2          80          3           10
 14 g2          90          2           10
 15 g2          100         1           10

 --------------
 ランクをどういう式で作成しているのか教えて欲しいですが、
 (少なくとも500グループはある計算になるが、手作業なんだろうか。)

 以下は、マクロと計算式の折衷案です。
 ワークシート関数の達人からの回答を楽しみにしています。

 (1)もとの順番をどこかの列に持って置いて(復元のため)、
    順序を一時的に変更することを前提にします。
 (2)グループ別、得点の昇順(ランクの降順)にソートします。
 (3)マクロでグループの最初の行、最後の行を繰り返しで求め、
    以下の計算式をD列に書き込みます。   
    D2:  =B2-INDEX($B$2:$B$8,MATCH(C2+1,$C$2:$C$8,-1))
    D3:  =B3-INDEX($B$2:$B$8,MATCH(C3+1,$C$2:$C$8,-1))
    以下略
 (4)エラー値のみジャンプで検出して、クリアー
 (5)式を値に変換します。(値のみ貼り付け)
 (6)元の順序に戻します。 

 実際のコードはどうぞ、そちらで工夫して下さい。
 面倒?の丸投げに協力している暇も余りないので。

(γ) 2015/08/30(日) 10:09


γさんありがとうございます。

ランクは「COUNTIFS」で計算させてます。
ただ、提供されるデータに不都合があり、それらは対象外の意味で
IF文で「99」にしています。

ご提示の方法は理解できたつもりです。
書かれている手順をマクロ化できればいいわけですが
しかしこれはさすがにハードル高く、今の私にはムリ(涙)
(いずれは挑戦したいと思ってますが..)
差を求めたい項目が7項目ほどあるのですが、一つマクロできたら
それを7個つなげるイメージですかね、マクロは..

INDEX,MATCHでいろいろやってたんですが、関数ではムリっぽいですかね。
もう少しあがいてみることにします...

(T1508) 2015/08/30(日) 11:59


ああ、簡単な数式でできましたね。
(1)(2)のソートするところまでは同じ。
(3)のところは、
   D2:  =IF(A2<>A1,"",IF(B2<>B1,B2-B1,D1))
   として下にコピーペイストするだけでした。
あとは、値にして、ソートを元に戻します。   

(γ) 2015/08/30(日) 13:37


ありがとうございます。

ソートを前提にしたいろいろな方法を学べました。
他の事例で応用できそうです。

今回はA,B列を共通にC,H,M列...と7項目のデータがあり、
順位はそれぞれ昇順あり降順ありとなっています。
ソート前提だと作業時間が大変そうです。(関数式だけでは)
※説明不足ご容赦ください、ご回答をヒントに何とかなると
 勝手に思っていました

どうも関数式では“一筋縄”ではいきそうにないような..(涙)

マクロを齧り始めましたが、どうなることやら...

(T1508) 2015/08/30(日) 22:29


7項目だけとも言えますね。大したことないです。
同一作業を繰り返し行う可能性があるなら、
マクロ記録をとって、それをマクロにしておけばよいでしょう。
必要なら勉強されることだと思います。頑張ってください。
(γ) 2015/08/30(日) 22:49

 G1 =IF(OR(E1="",E1>=LARGE(E:E,COUNTIF(E:E,99)+1)),"",C1-INDEX(C:C,MATCH(COUNTIF(E:E,"<="&E1)+1,E:E,0)))

 下にコピー。 G列をコピーして計算する列へコピー。

 ってこと?
 
(GobGob) 2015/08/31(月) 15:52

 あっ。 グループか。。。

 G1 =IF(E1=99,"",IFERROR(C1-SUMIFS(C:C,$A:$A,$A1,E:E,COUNTIFS($A:$A,$A1,E:E,"<="&E1)+1)/COUNTIFS($A:$A,$A1,E:E,COUNTIFS($A:$A,$A1,E:E,"<="&E1)+1),""))
(GobGob) 2015/08/31(月) 16:03

GobGobさん、ありがとうございます。

いやぁ〜、こんなにアッサリとできるもんなんですねぇ..

私はSUMPRODUCTをひねくってましたが、どうにも...
COUNTIFSでこのように“割って引く”ことに思いが到りませんでした。
スッキリして素晴らしい式だとただただ感服しています。

今日は単一グループ内でのマクロ(ソートなし)はできたんですが、
これを全グループ範囲に適用する方法がわからず..疲労困憊です(涙)

実務はご提案の式を使わせていただいて、マクロはまだまだこれからの
課題とします。

これからもよろしくお願いします。
(T1508) 2015/08/31(月) 17:30


 「99」の存在がねぇ。。。
 COUNTIFSの結果が「99」のとき、なんか
 不具合ありそうなので、 ランクの列は「99」やめて「-」とかにしたほうが
 いいかもね。(検証してまへん)

 あと、参考に 配列数式なら

 G1 =IFERROR(C1-LOOKUP(1,0/(($A$1:$A$99=$A1)*(E$1:E$99=SUMPRODUCT(($A$1:$A$99=$A1)*(E$1:E$99<=E1))+1)),C$1:C$99),"")
 G1 =IFERROR(C1-LOOKUP(1,0/(($A$1:$A$99=$A1)*(E$1:E$99=COUNTIFS($A$1:$A$99,$A1,E$1:E$99,"<="&E1)+1)),C$1:C$99),"")

 とか。

 ※これも「99」検証してまへん。
 
(GobGob) 2015/08/31(月) 18:33

 よく見たら最大18位なんすね。
 なら99気にしなくてエエねw
(GobGob) 2015/08/31(月) 18:47

 よくよく考えたらランキングされてるんやから

 G1 =IF(E1=99,"",IFERROR(C1-SUMIFS(C:C,$A:$A,$A1,E:E,E1+COUNTIFS($A:$A,$A1,E:E,E1))/COUNTIFS($A:$A,$A1,E:E,E1+COUNTIFS($A:$A,$A1,E:E,E1)),""))

 で、エエかも。
(GobGob) 2015/08/31(月) 23:24

 なるほど、言われてみればという感じですね。
 参考にさせていただきました。

 ところで、
 私が提示したのは、ソートさえすれば、
 全グループに対してまったく同一の計算式で、
 しかも、前の1行との関係だけ見れば算出できるというものでした。
 しかるに、
 > 今日は単一グループ内でのマクロ(ソートなし)はできたんですが、 
 > これを全グループ範囲に適用する方法がわからず..疲労困憊です
 と全く別の方向に進まれたのは意外でしたし、
 疲労困憊と言われましてもという感じです。
(γ) 2015/09/01(火) 06:38

GobGobさん、βさん、再度ありがとうございます。

ご提示の式、さらにスッキリしていいですね..勉強になります。

 >...と全く別の方向に進まれたのは意外でした...
これは失礼しました。 
マクロのオートフィルタで手こずりいつのまにか脱線していました。
(当たり前ですが自分以外のせいにしているわけではありません)
時間かかろうと必ずやり遂げるつもりでいますが、“白旗”を挙げた時は
手を差伸べていただきたく...(苦笑)

これからもよろしくお願いします。
(T1508) 2015/09/01(火) 15:16


コメント返信:

[ 一覧(最新更新順) ]


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