• ベストアンサー

EXCELでの抽出なのですが…

各工場における製品精度が順不同で±0.00%という形で列に入力されています。 この時、 (1)各工場ごとの最小精度(0%に最も近い精度) (2)各工場ごとの最大精度(0%から最も遠い精度) の抽出方法をお教え下さい。 悩んでいるところは、 「絶対値で比較→実際の%を抽出」です。 どなたかご存じの方、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • suekun
  • ベストアンサー率25% (369/1454)
回答No.5

細切れで補足して申し訳ありません。 IF(範囲=工場名、範囲)です。 これをMINで囲う事で、MINの検索の対象がIF(範囲=工場「工場名の列」、範囲「%の列」 仮に工場名がA列で%がB列なら、と言う想定で数式を作りました。 A列の中で該当する工場名の%を対象に最小値を求めてます。 以上、わかり難い説明ですいません。

harusan731
質問者

お礼

ありがとうございました! よく分かりました。大感謝です。 この方式は、例えば今回は絶対値列を作っておく等すれば簡略化でき、いろいろと応用も利きそうですね。

その他の回答 (6)

  • suekun
  • ベストアンサー率25% (369/1454)
回答No.7

ご理解頂けた様で^^; 配列は使い方を覚えれば用途は色々とあると思います。 配列についての詳しい説明は、ぽーさん(別のサイトで仲良くして頂いております) のサイトがわかりやすいのですが 日経のページの方の配列の解説を参考にアドレス載せておきます。 芳坂和行さんの配列講座(ぽーさん)

参考URL:
http://pc.nikkeibp.co.jp/pc21/special/hr/index.shtml
  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.6

具体的なシートのイメージを補足した方が、期待する回答が得られやすいと思いますよ。     A列   B列 1行目 工場1  0.01% 2行目 工場2  -0.02% 3行目 工場1  0.02% D1セルに「工場1」が入力されているとき、最小精度はE1セルに =SMALL(INDEX(($A$1:$A$1000=$D1)*ABS($B$1:$B$1000),),COUNTIF($A$1:$A$1000,"<>"&$D1)+1) 最大精度はF1セルに =MAX(INDEX(($A$1:$A$7=$D1)*ABS($B$1:$B$7),)) 入力することでそれぞれ求めることができます。(この式ではデータ行が1000行まで。工場毎にデータを並べ替える必要はありません) D2セルに「工場2」を入力したら、E2、F2はE1、F1をそれぞれコピーして下さい

  • suekun
  • ベストアンサー率25% (369/1454)
回答No.4

ごめんなさい。 昇順で並んでいると勝手に解釈してました。 数式を変更します。工場名をIFで判断しましょう。 =OFFSET(B1,MATCH(MIN(IF(A1:A7="工場名",ABS(B1:B7))),IF(A1:A7="工場名",ABS(B1:B7)),0)-1,0) とするか、工場名があるセル位置が仮にD1としたら =OFFSET(B1,MATCH(MIN(IF(A1:A7=D1,ABS(B1:B7))),IF(A1:A7=D1,ABS(B1:B7)),0)-1,0) で機能すると思います。 PS:同じ様に{}で確定です。

  • suekun
  • ベストアンサー率25% (369/1454)
回答No.3

ごめんなさい。ちょっと不親切でしたね。 数式の説明を入れますから、対象範囲が異なる場合は、 実際にあわせて数式を変更して下さい。(想定範囲A1:A7) まず最初に絶対値に範囲を変換して最小値MINを求めます。 MIN(ABS(A1:A7)) この時点で数式は「配列」と言う機能を使いますので、 仮に単体で動かす場合は、 {=MIN(ABS(A1:A7))} と言う形にする必要があります。 次に絶対値の最小値が見つかれば、同じく絶対値で見た時の 範囲の中の何処に拾った物があるか検索します。 MATCH(MIN(ABS(A1:A7)),ABS(A1:A7),0) MATCHの検索値には先ほどの数式がそのまま入ります。 そして対象範囲は、ABS(A1:A7)ですね。完全一致で0を指定。 最後にOFFSETでその位置にある元のデーターを拾います。 この時、OFFSETの引数の行数の位置に上記の数式が入ります。 OFFSET(基準セル、行数、列数)ですから基準は範囲の中の先頭 「A1」セルを指定します。 MATCHの検索で出た範囲の中の○番目は、基準セルから数えると 一つ余分になりますから「-1」を付けます。 全部繋げると、 =OFFSET(A1,MATCH(MIN(ABS(A1:A7)),ABS(A1:A7),0)-1,0) となり、配列機能を使いますので {=OFFSET(A1,MATCH(MIN(ABS(A1:A7)),ABS(A1:A7),0)-1,0)} と設定してオッケーです。 変更箇所は、基準セル「A1」と範囲「A1:A7」くらいだと思います。

harusan731
質問者

お礼

なるほど~…! 大変よく分かりました!ありがとうございました! ところで、私の質問が悪かったのですが「各工場」の範囲は入力するごとに変わるのですよ。(ご回答いただけた部分のA1:A7ですね。) データは(1)~(7)の各工場ごとにソートされてはいるのですが、各工場のデータが入るたびにソートされるので範囲が一定ではありません。 何とか自動で判別したいのですが…

  • suekun
  • ベストアンサー率25% (369/1454)
回答No.2

最小だけ例として ※範囲はA1からA7と仮定します。 次の式をセルに記入します。 =OFFSET(A1,MATCH(MIN(ABS(A1:A7)),ABS(A1:A7),0)-1,0) 記入したら、何処でも良いので数式のどこかをクリックして そのままShiftとCtrlを押しながらEnterで確定です。 {=OFFSET(A1,MATCH(MIN(ABS(A1:A7)),ABS(A1:A7),0)-1,0)} と{}付きの数式に変れば答えが出ると思います。 最大の場合はMINをMAXに変えて下さい。

harusan731
質問者

お礼

ありがとうございました! なるほど…よく分かりました。 ところで、2つほど疑問点が… (1)「各工場ごと」の抽出条件は、どこに入れれば良いのでしょうか?  (別の構文になるのでしょうか?) (2)Shift+Ctrl+Enterは、どのようなときに使用するのでしょうか? 申し訳ありませんが、よろしくお願いします。

  • FEX2053
  • ベストアンサー率37% (7991/21371)
回答No.1

計算用の列を1列確保して、そこに =ABS(A1) という形で絶対値を作ります。 後は、その「絶対値の列」を使ってソートするなり、 「データ」「フィルタ」のトップテン機能を使うなりすれば 行単位でデータが取得できますので、元のデータも一緒に出てきます。

harusan731
質問者

お礼

ありがとうございました。 絶対値の列を作成していたのですが、どうもよく分からなかったのですよ。 あと、フィルタだと抽出できるデータは1つだけですよね…

関連するQ&A