- 締切済み
エクセルのデータ処理について…
下記(下段テーブル)の様に商品ごとの増減率が表示されているデータがあるとします。 この増減率はリアルタイムで更新される為、その都度数値が変化します。 これを下記(上段テーブル)の様に、それぞれのグループ内で、ある一定数値以上(下記では黄枠の2.00%以上)の増減率差分ペア(増減率高の商品と増減率低の商品の差分ペア)を見つけ出し、それを上位順に6位まで表示させたいと考えています。 増減率ペアは『AとB』や『CとD』などグループ内でのみ構成される為、『AとC』や『CとG』などはグループが違うので例え増減率差分が2.00%以上でもペアで表示される事がないようにしたいのと、増減率自体がリアルタイムで更新される為、下記(上段テーブル)は上位6選がその都度変化するように作成したいのですが… 実際にはグループは30程度あり商品は100程度ありますが、各グループ毎の商品構成は変化しません。また増減率はリアルタイムで変化するので、下記(上段テーブル)では1位には高い方が『H』低い方が『G』となっていますが、状況によれば逆に高い方が『G』低い方が『H』になる場合もあります。 このようなデータ処理をエクセルにて行うには、具体的にどのような関数もしくはマクロを作成すれば良いでしょうか? お知恵を拝借できれば幸いです。宜しくお願い致します。
- みんなの回答 (11)
- 専門家の回答
みんなの回答
- SI299792
- ベストアンサー率47% (774/1618)
- SI299792
- ベストアンサー率47% (774/1618)
- masnoske
- ベストアンサー率35% (67/190)
[No1.] です. 増減率が計算式だと,増減率のセル値が変化したことをマクロで捕まえられません.セルに入力されている計算式は変化しませんから. ですが,計算式の参照元のセル値は,別アプリで取り込んだ時に変化します. なので,そのセル値が変化したことをマクロで捕まえればリアルタイム処理可能です. もう1点,グループの列が結合されていますが,外すことは可能でしょうか. マクロで結合セルを扱うのは面倒で,そのために余計なコードが必要になります.結合を外すというのは,B14にもB15にも1を入力するということです. マクロ以外でも結合セルはフィルタが効かないので,不便ですよね.
- SI299792
- ベストアンサー率47% (774/1618)
>処理が速い データ件数によるので何とも言えません。 データは何件ありますか。 書き忘れていましたが、数式が入っている場合、どんな数式なのか。計算の元になる、値の入るセルの位置が解らないと、VBA でのリアルタイムは不可能です。 関数による回答を上げます。 10件分なのでF~列をワークエリアに使います。目障りなら非表示にして下さい。 C列の最後(図ではC28 )にダミーで1を入れて下さい。目障りならフォントの色を白にして下さい。 F14: =IF(B14="",F13,ROW()-14) G14: =IF(MATCH(1,$C15:$C24,0)+$C14>COLUMN(A1),$E14-OFFSET($E14,COLUMN(A14)-$C14,0)+0.0001/ROW()) P14 までコピペ。下へコピペ。 B4~B9は数字の1~6にして、セルの書式設定で「位」を付けて下さい。 C4: =IFERROR(INDEX(D:D,SUMPRODUCT((LARGE(G$14:K$27,B4)=G14:K27)*ROW(G14:K27))),C4) D4: =IFERROR(INDEX(D:D,SUMPRODUCT((LARGE(G$14:K$27,B4)=G14:K27)*COLUMN(G14:K27))+INDEX(F:F,SUMPRODUCT((LARGE(G$14:K$27,B4)=G14:K27)*ROW(G14:K27)))+7),D4) E4: =IF(LARGE(G$14:K$27,B4)>=D$2,LARGE(G$14:K$27,B4),"") 下へコピペ。 ※E列の数字には誤差があります。計算に使う時は ROUNDDOWN(E4,4) の様に切り捨てて下さい。
補足
お返事ありがとうございます。 教えて頂いた関数で、ほぼ思い通りの形になりました。 ただ、増減率の数字を変えみたところ、順位付けの商品名が左(増減率高)と右(増減率低)で左右同じものが表示される場合があったりするのはなぜでしょうか? また、順位付けで7位以降作成するにはそのまま下方向にコピーで宜しいでしょうか? あと、一番最初におっしゃっていた『この式は、1グループ最大10件を想定しています。もっとあるなら、C24 の数を増やして下さい。』ですが、今回の関数ではそこを変えるケースなどはありますか?因みにC28ではなくC24で合っていますでしょうか? 何度も何度もすみません。
- bunjii
- ベストアンサー率43% (3589/8249)
追加の回答が遅れました。 E4に次の数式を設定します。 =LARGE($H$14:$U$27,ROWS(E$4:E4)) C4に次の数式を設定します。 =INDEX($D$1:$U$27,SUMPRODUCT(($H$14:$U$27=E4)*ROW($H$14:$U$27)),1) D4に次の数式を設定します。 =INDEX($A$1:$U$27,ROW($H$12),SUMPRODUCT(($H$14:$U$27=E4)*COLUMN($H12:$U12))) C4:E4を選択して下へ必要数コピーすれば添付画像のような結果になります。 添付画像の差分マトリクスで値が0のセルは条件付き書式でフォントの色を白にしてあります。(ブランクではありません) また、差分が2%以上のセルを条件付き書式で黄色に塗りつぶしました。 尚、回答No.6への補足で「処理が速い(重くならない)」については差分マトリクスが大きくなると自動再計算では処理が遅くなります。
- SI299792
- ベストアンサー率47% (774/1618)
すみません。各グループの最大値だけ抽出すればいいと思っていました。 質問ですが、 (1)ワークエリアを使う方がいいかVBA がいいか。 (2)1グループ最大いくつか 必要ワークエリアは、1グループ最大数+1 今回の例の場合、1グループ最大5件なのでF~K、6列必要です。 VBA ならワークエリアは必要ありません。 (3)E14 以下はどのように数字が入りますか。 (直接値が入るのか、数式が入っているのか)
補足
お返事ありがとうございます。 こちらこそいろいろご無理を言ってすみません。 まず(1)ですが、処理が速い(重くならない)のとリアルタイムに計算されるのであればどちらでも良いです。 (2)については、多くても10件程度です。 (3)については、数式が入っています。 以上、ご面倒をお掛けしますが宜しくお願い致します。
- bunjii
- ベストアンサー率43% (3589/8249)
- bunjii
- ベストアンサー率43% (3589/8249)
回答No.2の追加です。 質問に添付の画像でB列のグループ1~4は夫々複数セルを結合していますので結合セルの性質をご理解頂けないと作業用テーブルの必要性が分からないと思います。 B14、B16、B20、B23に1~4までの数値が入力されており、B15、B17、B18、B19、B21、B22、B24、B25、B26、B27には値が存在しません。 「増減率ペアは『AとB』や『CとD』などグループ内でのみ構成される」と言う条件を満たすためには「グループ」と「番号」の組み合わせ要件をチェックする必要があり、B列のブランクセルを補完する必要があります。 回答No.2では作業テーブルでB列をG列で補完し、差分対象を10行、11行、12行に配置して差分マトリクスを使う方法になっています。 尚、回答No.2の添付画像では差分を小数で表示されていましたので%表示に変更した数表を添付します。 H14セルの数式 =($E14-H$13)*($G14=H$11) H14セルを右と下へコピーすれば差分の一覧表ができます。 順位表(B3:E9)は差分一覧表からLARGE関数でE列へ抽出し、商品名はINDEX関数とSUMPRODUCT関数でマトリックス表の位置から商品名を抽出します。
- SI299792
- ベストアンサー率47% (774/1618)
F~Hをワークエリアに使っていいですか。 C列の最後(図ではC28 )にダミーで1を入れて下さい。目障りならフォントの色を白にして下さい。 F14: =IF(C14=1,MAX(OFFSET(E14,0,0,MATCH(1,C15:C24,0)))-MIN(OFFSET(E14,0,0,MATCH(1,C15:C24,0))),"") G14: =OFFSET(D13,MATCH(MAX(OFFSET(E14,0,0,MATCH(1,C15:C24,0))),OFFSET(E14,0,0,MATCH(1,C15:C24,0)),0),0) H14: =OFFSET(D13,MATCH(MIN(OFFSET(E14,0,0,MATCH(1,C15:C24,0))),OFFSET(E14,0,0,MATCH(1,C15:C24,0)),0),0) 下へコピペ。目障りなら非表示にして下さい。 この式は、1グループ最大10件を想定しています。もっとあるなら、C24 の数を増やして下さい。 B4~B9は数字の1~6にして、セルの書式設定で「位」を付けて下さい。 C4: =IFERROR(VLOOKUP(E4,F:H,2,0),"") D4: =IFERROR(VLOOKUP(E4,F:H,3,0),"") E4: =IF(LARGE(F:F,B4)>=D$2,LARGE(F:F,B4),"") 下へコピペ。
補足
ご回答ありがとうございます。 増減率差分の数値によっては、1グループ内で2以上のペアが発生する場合(質問の画像でいうと、グループ4に2%以上の増減率差分ペアが3つ(2位のLとM、4位のJとM、6位のLとK(画像は手入力したので1つ記載漏れしており、2つになっています))もあるのですが、その場合はどのようにすれば良いのでしょうか? 教えて頂いたもので作成すると、1つのグループから最大値の1ペアのみしか表示されないようなのですが… ご面倒をお掛けしますが、また御手隙の時にでも教えてやって下さい。
- bunjii
- ベストアンサー率43% (3589/8249)
- 1
- 2
お礼
もう一つ、教えて頂いた関数はグループ内で複数のペアを抽出出来るようになっていますが、これをグループ内で最大の差分ペアを一つだけ抽出させたい場合(グループ1から最大差分ペアを1つ、グループ2からも最大差分ペアを1つ、グループ3からも最大差分ペアを1つ…のように)は大幅に関数を変えないといけませんか? 何度もすみません。
補足
お返事ありがとうございます。 最後にもう一つ、教えて頂いた関数で黄枠(D2)を1%にし、B9からE9までを下にコピーして9位までを作成したところ、9位の所のC12とD12がどちらもMになってしまうのですが、7位以降を作成する場合は、ただ単に下方向にコピーではダメなのでしょうか?