- ベストアンサー
[EXCEL]リストから複数の条件に最も近い値を持つセルを探し、そのセルの同一行の情報を抽出する方法
EXCELに関して表題の件でお知恵を借りたいです。よろしくお願いします。 今、以下のようなサンプルがあるとします。 分類1 分類2 1回目 2回目 3回目 4回目 ------------------------------------------------- A A-1 12 14 34 45 A A-1 65 23 76 23 A A-2 23 89 43 90 B B-4 89 34 12 33 B B-2 78 44 54 22 C C-2 45 55 76 12 ここで、 分類 代表値 A 76 B 33 C 76 というキーをもとに分類2の情報とその代表値が"何回目"のときの値であったのかを知りたいです。 すなわち、 分類 代表値 何回目? 分類2? A 76 3 A-1 B 33 4 B-4 C 76 3 C-2 を最終的に抽出したいです。 これを実現するために書くべき関数式はどのようなものが適切でしょうか?手作業でひとつひとつやるのは少々無理なデータ量です。 よろしくお願いします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
#4 の補足。 A B C D 分類 代表値 何回目? 分類2? A 23 ちょうど、このような例の場合は、数値のダブりがありますから、その場合は、CountIf で取って、複数ある場合は、 =SMALL(ABS((INDIRECT("R"&MATCH(A21,$A$1:$A$7,0)&":R"&MATCH(A21,$A$1:$A$7,1)&"C3:C6",0))-B21)+COLUMN(A1:D1)*10^-3,2) =SMALL(ABS((INDIRECT("R"&MATCH(A21,$A$1:$A$7,0)&":R"&MATCH(A21,$A$1:$A$7,1)&"C3:C6",0))-B21)+COLUMN(A1:D1)*10^-3+ROW(INDIRECT("R"&MATCH(A21,$A$1:$A$7,0)&":R"&MATCH(A21,$A$1:$A$7,1)&"C1",0))*10^-6,2) これらの式の第二引数、つまり、末尾の、,1) の部分の数,2) とすれば、二番目が出てくるわけです。
その他の回答 (5)
A B C D E F G H I J K 1 類1 類2 1回 2回 3回 4回 類1 代表 回目 類2 2 A A-1 12 14 34 45 A 76 3 A-1 3 A A-1 65 23 76 23 B 33 4 B-4 4 A A-2 23 89 43 90 C 76 3 C-2 5 B B-4 89 34 12 33 6 B B-2 78 44 54 22 7 C C-2 45 55 76 12 J2: =MATCH(I2,OFFSET($A$1,SUMPRODUCT((A$1:A$10=H2)*((C$1:C$10=I2)+(D$1:D$10=I2)+(E$1:E$10=I2)+(F$1:F$10=I2)),ROW(A$1:A$10))-1,2,1,4),0) K2: =INDEX(B$1:B$10,SUMPRODUCT((A$1:A$10=H2)*((C$1:C$10=I2)+(D$1:D$10=I2)+(E$1:E$10=I2)+(F$1:F$10=I2)),ROW(A$1:A$10)),1)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 VBAでなくても出来そうな気がします。 今、集中できないことがあって、作った本人が、Match関数とIndex 関数の組み合わせが、ややこしくなって、その説明がうまくできません。理屈は、代表値(検索値)と該当する値の差を取った絶対値の最小値を取り出す、という考え方です。 横に伸びていくということで、 とりあえず、 A20から取り付けることにしました。 A B C D 分類 代表値 何回目? 分類2? 21 A 23 22 B 44 23 C 76 F21 =SMALL(ABS((INDIRECT("R"&MATCH(A21,$A$1:$A$7,0)&":R"&MATCH(A21,$A$1:$A$7,1)&"C3:C6",0))-B21)+COLUMN(A1:D1)*10^-3,1) 配列確定が必要です。F2 -> Ctrl + Shift + Enter G21 =SMALL(ABS((INDIRECT("R"&MATCH(A21,$A$1:$A$7,0)&":R"&MATCH(A21,$A$1:$A$7,1)&"C3:C6",0))-B21)+COLUMN(A1:D1)*10^-3+ROW(INDIRECT("R"&MATCH(A21,$A$1:$A$7,0)&":R"&MATCH(A21,$A$1:$A$7,1)&"C1",0))*10^-6,1) 配列確定が必要です。F2 -> Ctrl + Shift + Enter C21 ~フィルダウン・コピー =MOD(F21,1)*10^3 D21 ~フィルダウン・コピー =INDEX($B$1:$B$7,MOD(G21*10^3,1)*10^3,1) これは、俗に、重み付けテクニックと呼ばれるものです。
- rin01
- ベストアンサー率43% (33/76)
こんにちは~♪ 失礼しま~す。。。 回答ではないのですが~。 >#01さんのおっしゃるように検索する値が一次元(1列 >もしくは1行)で格納されていれば 作業列を使って、1列に抜き出せば 出来そうですが。 その場合でもいくつか、疑問があります。 疑問その1 sakuuuuuさんも書かれていますが Aの場合、23 が、3つあって、同じ行にも2つあります。 この場合、何を条件にして回数や分類2を判断すれば 良いのでしょうか? 疑問その2 >最も近い値を持つセル Aで、代表値が 13 の場合 12 又は 14 どちらになるのでしょう? 検査より上の近似値か、下の近似値どちらでしょう? ★これらの説明があれば、良いのですが。 又、条件が合うデータは(例えば、回数が複数該当する 場合はすべて、表示させる事も出来ると思いますけれど。 。。。。Rinでした~♪♪
- zap35
- ベストアンサー率44% (1383/3079)
質問の例でデータがA2:F7にあり(A1:F1はタイトル)、A10に求める値の「A」、B10に「76」があるとき 完全に一致する数値が1つだけあるという条件が成り立つなら 該当する「n回目」は(質問例では「3回目」) =OFFSET(A1,0,SUMPRODUCT((A2:A7=A10)*(C2:F7=B10)*COLUMN(C2:F7))-1) そのときの分類(A-1)は =INDIRECT("B"&SUMPRODUCT((A2:A7=A10)*(C2:F7=B10)*ROW(C2:F7))) の関数式で求めることができます。 でも実際にはデータの重複もありそうですし、また近似値で検索されたいようですね。となるとEXCELの関数では難しいと思います。LOOKUP関数で配列範囲内の検索は可能ですが複合条件での検索には不向きです。 #01さんのおっしゃるように検索する値が一次元(1列もしくは1行)で格納されていればVLOOKUP関数やMATCH関数で完全一致でない検索も可能です。 ただしその場合であっても「最も近い数値」を検索することはできません。「指定した値以下の最も近い数値」または「指定した値以上の最も近い数値」だけです。
- sakuuuuu
- ベストアンサー率32% (67/209)
いまいち良く分からないのですが・・・。 例えばA-1の2回目、というデータはサンプルデータでは"14""23"があるのですが・・。"23"は6回目と言う位置づけなんですか?? あと表題では「最も近い値を持つセル」と書いてありますが値はぴったりじゃない場合もあるのですか?? ぱっと見、関数では無理かなあ・・という気がします。 たとえできたとしても複雑な関数になるでしょう。 1回目、2回目、3回目と横にデータを持ってますが縦持ちにできないのでしょうか? A A-1 12 1回目 A A-1 14 2回目 A A-1 34 3回目 最初にこのような表にすれば作業は劇的に効率的になります。 いつもこのOKWAVEを見て思うのですがEXCELをあまり使用したことがない人は(すなわちEXCELビギナーは)、表の見易さを優先して横に長い表を作っています。 実務上で見ると横長はお勧めしません。データが多いならなおさらです。 なぜなら例えば"A-2"の,一回目、二回目、"A-3"の一回目、二回目と増えていくとX軸とY軸の両方が増加する表になるからです。集計や検索するときもX方向とY方向の2要素を考慮しなければなりません。実際コレは最高に手間になり関数やVBAも複雑になります。 私がオススメする縦長の表だとY軸しか増加しません。集計も検索もY方向のみ考慮すればいいだけです。特にデータが多くなっても根本的にY方向のみを考慮に入れればよいのです。 表を作り直せるのであれば縦長にすることをオススメします。