* 組合せから条件の合う数値とそれに伴う数値を昇順に並べる [#zadc829e]
 |RIGHT:|LEFT:|c
 |~ページ|[[OpenOffice.org FAQの登録ページ]]|
 |~投稿者|はっし|
 |~分類|#listbox3(Q&A,faq03,class)|
 |~優先順位|#listbox3(普通,faq03,priority)|
 |~状態|#listbox3(完了,faq03,state)|
 |~カテゴリー|#listbox3(Calc 表計算,faq03,category)|
 |~投稿日|2010-07-10 06:26:39 (土)|
 |~OS|XP SP3|
 |~依存するページ||
 |~バージョン|#listbox3(3.2.1,faq03,version)|
 
 //////////バグ対策(以降マッチさせない)
 
 ** メッセージ [#kd85e557]
 |LEFT:|c
 |回答ページでは行末に「~」を付加する必要はありません|
 いつもお世話になってます。~
 たて続けで申し訳ありませんが宜しくお願いいたします。~
 ~
 1)添付ファイルの上表から条件にあった数値を抜き出し別表に並べる~
 2)各組合せの指数も別表に並べる~
 3)指数の小さい順に上から並べ、それに対応する組合せから抜き出した数値を並べる~
 ~
 以上の内容を関数で処理するにはどのようにすればよいかご教授願います。~
 ~
 #ref(サンプル1.ods)~
 
 
 ----
 ***1例です [#f73e20d5]
 >M.Kamataki (2010-07-10 11:20:19 (土))~
 ~
 1)を実現するためには、作業用のセル領域を作成したほうがわかりやすくなります。~
 ~
 例えば、「(B列=5 AND D列=14) OR (B列=14 AND D列=5)の条件でC列の値を表示する」列、「(C列=5 AND D列=14) OR (C列=14 AND D列=5)の条件でB列の値を表示する」列、「(B列=5 AND C列=14) OR (B列=14 AND C列=5)の条件でD列の値を表示する」列を作成します。数値の抜き出しはそれぞれの行を合計する列を作成します。~
 ~
 最後に合計列を利用して、0以上の結果行を標準フィルタ(「データ」-「フィルタ」-「標準フィルタ」)で抜き出すと目的のものになるのではと思います。なお、順位付けはしなくても良いのですよね。以下、サンプルファイルです。別表にしてませんが、簡単に別表にできると思います。~
 ~
 &attachref(faq5_440sample1.ods);~
 ~
 他にもアイデアはあると思います。~
 
 //
 ***faq5_440sample1.ods案について [#m36b8351]
 >はっし (2010-07-10 14:11:29 (土))~
 ~
 M.Kamataki様 ありがとうございます。~
 いつもお世話様です。~
 ~
 早速ですが、M.Kamataki様のサンプルで条件に合った数値の抽出は問題なくできました。~
 しかしながら、実際サンプル1.odsの上表は200行ほどあるため、予め下表を作成して条件の数値を検索抽出を手動ですると結構な作業になってしまいます。~
 できれば「元の表(上表)から検索・抽出して下表へ抽出したものだけを展開する」としたいのですが…。~
 尚、下表の枠組み(フォーマット・表)は初めから別表として用意しておく方が好ましいです。その表へ抽出したものだけを空欄ができないように上から並べる形にしたいのですが…。~
 ~
 それと、抽出されたものを指数の低い順に並べた際、抽出前の順位とは別に新たに順位昇順として並べる。と、言うのは稀に上表のものが昇順で無い場合があります。~
 そのためにも、サンプル1.odsの上表から検索・抽出して下表へ展開という形が望ましいです。~
 途中処理をするための作業域などはあってもかまいません。~
 ~
 あとから色々と条件を付加してしまい誠に申し訳ありませんが何卒宜しくお願い致します。~
 ~
 #ref(サンプル2.ods)~
 ~
 
 //
 ***追伸です [#y2e66304]
 >はっし (2010-07-10 16:19:55 (土))~
 ~
 M.Kamataki様 お世話様です。~
 ~
 M.Kamataki様より~
 ~
 「最後に合計列を利用して、0以上の結果行を標準フィルタ(「データ」-「フィルタ」-「標準フィルタ」)で抜き出すと目的のものになるのではと思います。(中略)簡単に別表にできると思います。」~
 ~
 との記述がありましたが、この別表の作成時には「標準フィルタ」の操作が必要なんですよね?~
 できれば、検索-抽出-展開の一連の動作をデータを貼り付けするだけで完了したいと思っています。~
 ~
 マクロを使えば安易なのかもしれませんができれば関数でより良い方法があれば教えて頂ければ助かります。~
 宜しくお願いします。~
 
 //
 ***正規表現で検索 [#kf89c351]
 >ike@九州 (2010-07-10 16:48:34 (土))~
 ~
 正規表現での試行です~
 Sheet2 〜 Sheet4 に各組み合わせ例(D1、E1 に入力)~
 ~
 A、B 列が追加作業領域~
 ~
 A 列は正規表現にて検索しています~
 ~
 B 列は指数値が同じだった場合の順位付けの為の列(指数値 + ROW()/1000)で、行が違えば下の行が大きくなるようにしています。~
 (Sheet4 の 10、14 の組み合わせでこの効果が出ています)~
 ~
 A,B 列を 200 行までドラッグコピーすればそのまま利用可ですが、Sheet1 のデータを 200 行まで拡大して検証してください。~
 ~
 正規表現は奥が深い為、より良い記述があればお知らせください~
 #ref(サンプル3.ods)~
 
 //
 ***Re: faq5_440sample1.ods案について [#e2650396]
 >M.Kamataki (2010-07-10 22:21:42 (土))~
 ~
 ike@九州さんのサンプルを参考に、標準フィルタを使わない順位付けを行うよう、サンプル2.odsを修正してみました。以下です。数値の抜き出しは合計値ではなく、IF文で抽出しています。速度的には合計しちゃう方法のほうが手抜きなので早いかもしれないです。~
 ~
 &attachref(faq5_440sample2.ods);~
 ~
 基本的には想定される順位まで表を作成しないといけないので、下表も200行いるんじゃないかと思いますが、どうでしょうか。~
 
 //
 ***解決しました [#p6b4689a]
 >はっし (2010-07-11 01:15:41 (日))~
 ~
 ike@九州様、M.Kamataki様 ありがとうございます。~
 お二方の案を参考にさせていただきお蔭様で処理することができました。~
 ~
 ike@九州様~
 「正規表現は奥が深い」~
 正規表現自体の意味もよく判っていませんが普段いつも正規表現で使用してます。特に問題は無いのですが何かの条件によっては使い分けなどしたほうが良いのでしょうか?~
 ~
 M.Kamataki様~
 「下表も200行いるんじゃないかと思いますが、どうでしょうか」~
 はい。別シートで処理して、本編シートに整理して展開するようにしました。~
 ~
 いつもいつも大変助かっています。本当に感謝してます。~
 また宜しくお願い致します。~
 ありがとうございました。~
 
 //
 ***IF文 [#s7ebef5b]
 >M.Kamataki (2010-07-11 07:30:12 (日))~
 ~
 最初のコメントで書いたようにTRUE、FALSEの論理値で計算も可能です。そのことを利用して値を抽出するIF文は以下のようにも書けますね。~
  =IF(SUM(E2:G2)=0;"";SUM(E2:G2))
 とか~
  =IF(1<SUM(E2:G2);SUM(E2:G2);"")
 など。~
 ~
 こちらの方が、実行速度は早いかもです。~
 
 //
 #article