- 締切済み
関係性を持ったソート
例えば以下の様なデータで 親-子, 判定とした場合 1-1, true 1-2, true 1-3, true 2-1, true 2-2, true 2-3, false 群の中で一つでもfalseがあれば親単位で全てを抜き出すと言う方法を探しています 結果として 2-1, true 2-2, true 2-3, false だけ抜き出せればOKです
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- kagakusuki
- ベストアンサー率51% (2610/5101)
回答No.5です。 書き忘れておりましたが、回答No.5の方法では例えば2-12の後に1-8があるなどといった様な、親-子のデータが順不同に並んでいる場合にも、親の数字と子の数字が昇順となる様に並べ替えた形で表示が行われます。 又、例えば4-9と15-12の様に、親ないし子の数字の桁数が異なるものがあった場合で、桁数の少ない方の数字の方が、最も左端の桁の数字が大きい場合においても、桁数の少ない方が上、桁数が多い方が下になる様に並べて表示されます。 尚、回答No.5の方法はExcelのバージョンがExcel2007以降の物でなければ使用出来ません。 ですから、もしExcel2000等の古いバージョンのExcelを使う場合には、以下の様にして下さい。 今仮に、Sheet1のA列に親-子のデータが入力されていて、Sheet1のB列にTRUEやFALSE等の判定結果が入力されていて、Sheet2のA列に抽出してソートした結果を表示させるものとします。 又、Sheet3のA列~C列を作業列として使用するものとします。 まず、Sheet3のA1セルに次の関数を入力して下さい。 =IF(AND(COUNTIF(INDEX(Sheet1!$A:$A,ROW()),"*?-*?"),INDEX(Sheet1!$B:$B,ROW())=FALSE),LEFT(INDEX(Sheet1!$A:$A,ROW()),FIND("-",INDEX(Sheet1!$A:$A,ROW()))),"") 次に、Sheet3のB1セルに次の関数を入力して下さい。 =IF(COUNTIF(INDEX(Sheet1!$A:$A,ROW()),"*?-*?"),IF(COUNTIF($A:$A,LEFT(INDEX(Sheet1!$A:$A,ROW()),FIND("-",INDEX(Sheet1!$A:$A,ROW())))),RIGHT(REPT(0,7)&LEFT(INDEX(Sheet1!$A:$A,ROW()),FIND("-",INDEX(Sheet1!$A:$A,ROW()))),8)&RIGHT(REPT(0,7)&REPLACE(INDEX(Sheet1!$A:$A,ROW()),1,FIND("-",INDEX(Sheet1!$A:$A,ROW())),),7),""),"") 次に、Sheet3のC1セルに次の関数を入力して下さい。 =IF($B1="","",COUNTIF($B:$B,"<"&$B1)+COUNTIF($B$1:$B1,$B1)-COUNTIF($B:$B,"<*")) 次に、Sheet3のA1~C1のセル範囲をコピーして、Sheet3のA列~C列の2行目以下に貼り付けて下さい。 次に、Sheet3のA2セルに次の関数を入力して下さい。 =IF(ROWS(A$2:A2)>COUNT(Sheet3!$C:$C),"",INDEX(Sheet1!$A:$A,MATCH(ROWS(A$2:A2),Sheet3!$C:$C,0))) 次に、Sheet3のA2セルをコピーして、Sheet3のA3以下に貼り付けて下さい。 以上です。
- kagakusuki
- ベストアンサー率51% (2610/5101)
今仮に、Sheet1のA列に親-子のデータが入力されていて、Sheet1のB列にTRUEやFALSE等の判定結果が入力されていて、Sheet2のA列に抽出してソートした結果を表示させるものとします。 又、Sheet3のA列とB列を作業列として使用するものとします。 まず、Sheet3のA1セルに次の関数を入力して下さい。 =IF(COUNTIF(INDEX(Sheet1!$A:$A,ROW()),"*?-*?"),IF(COUNTIFS(Sheet1!$A:$A,LEFT(INDEX(Sheet1!$A:$A,ROW()),FIND("-",INDEX(Sheet1!$A:$A,ROW())))&"*?",Sheet1!$B:$B,FALSE),RIGHT(REPT(0,7)&LEFT(INDEX(Sheet1!$A:$A,ROW()),FIND("-",INDEX(Sheet1!$A:$A,ROW()))),8)&RIGHT(REPT(0,7)&REPLACE(INDEX(Sheet1!$A:$A,ROW()),1,FIND("-",INDEX(Sheet1!$A:$A,ROW())),),7),""),"") 次に、Sheet3のB1セルに次の関数を入力して下さい。 =IF($A1="","",COUNTIFS($A:$A,"<"&$A1,$A:$A,"*?")+COUNTIF($A$1:$A1,$A1)) 次に、Sheet3のA1~B1のセル範囲をコピーして、Sheet3のA列~B列の2行目以下に貼り付けて下さい。 次に、Sheet3のA2セルに次の関数を入力して下さい。 =IFERROR(INDEX(Sheet1!$A:$A,MATCH(ROWS(A$2:A2),Sheet3!$B:$B,0)),"") 次に、Sheet3のA2セルをコピーして、Sheet3のA3以下に貼り付けて下さい。 以上です。
- bunjii
- ベストアンサー率43% (3589/8249)
>だけ抜き出せればOKです 複数の親に" false"の判定があるのですよね? Excelの組込み関数だけで処理するには少々面倒な数式を組み立てなければなりません。 貼付画像はExcel 2013で検証した結果です。 D1=IFERROR(INDEX(A$1:A$100,LARGE(INDEX(COUNTIFS($A$1:$A$100,LEFT($A$1:$A$100,FIND("-",$A$1:$A$100))&"*",$B$1:$B$100," false")*ROW($A$1:$A$100),0),SUMPRODUCT(COUNTIFS($A$1:$A$100,LEFT($A$1:$A$100,FIND("-",$A$1:$A$100))&"*",$B$1:$B$100," false")*1)+1-ROW())),"") D1セルをE1セルへコピーし、D1とE1を選択して下へ必要数コピーしてください。 但し、処理対象範囲は1行目から100行目までになっていますので、範囲が広い場合は行番号を訂正してください。 Excel 2003以前のバージョンではIFERROR関数とCOUNTIFS関数がありませんので代替の数式を組まなければなりません。
- msMike
- ベストアンサー率20% (364/1804)
[No.2]ですが、質問文の末尾の「だけ抜き出せればOKです」の上を見ると、「判定」の欄もご所望だったことに気付きました。対策は簡単です。 何のことはない、抽出範囲の「$F$1」を「$F$1:$G$1」にするだけぇ~!
- msMike
- ベストアンサー率20% (364/1804)
- Nouble
- ベストアンサー率18% (330/1783)
-以前の値に置いて 以下にfalseを含む 同値群を 探せば良いのですね やってみましょう でも、まずはヒントだけ 但し Excelが2007以降での対応です。 また、 データがA列にある とします。 まず、 offset($a:$1, small( index(iserror(find(a:a,"false"))-1,,)*row(a:a) +max(index(1-iserror(find("false",a:a)),,)*row(a:a)+1) ,row(indirect("a1:a:"&sumproduct(index(1-iserror(find("false",a:a)),,))))) -1,0,1,1) 此により falseを含むセル位置を 割り出します しかし 此のまま進めては 例えば2-という親の一群 此にfalseが 複数含まれていた場合 其の2- に含むfalseの 重複個数分の回数 falseを含む要素を 重複させて 出力します。 此は困りもので 此の点が 此の課題の 厄介なポイントだ と、思います。 安心してください、 回避方法があります。 例を挙げます 例えば 1- 1- 1- 2- 2- 3- 3- 3- 3- 4- と、言う 10要素数のリストを得た場合 まずダミー項 例えば - を1つ加え 1- 1- 1- 2- 2- 3- 3- 3- 3- 4- - と、します。 前式の場合では 一例としては、 ,row(indirect("a1:a:"&sumproduct(index(1-iserror(find("false",a:a)),,)))) 此の部分を ,row(indirect("a1:a:"&sumproduct(index(1-iserror(find("false",a:a)),,))+1)) と、します。 例の話しに戻ります。 ダミーを加えたリスト中の、 先頭からの10要素 1- 1- 1- 2- 2- 3- 3- 3- 3- 4- と、 2番目からの10要素 1- 1- 2- 2- 3- 3- 3- 3- 4- - 其れを 1- = 1- 1- = 1- 1- = 2- 2- = 2- 2- = 3- 3- = 3- 3- = 3- 3- = 3- 3- = 4- 4- = - 此の様に比べます、 前式の場合では 一例としては、 ,row(indirect("a1:a:"&sumproduct(index(1-iserror(find("false",a:a)),,)))) = ,row(indirect("a2:a:"&sumproduct(index(1-iserror(find("false",a:a)),,))+1)) ですかね。 相違した項を 1- = 2- 2- = 3- 3- = 4- 4- = - 此の様に選り出します 此の状態で 左辺だけ列挙します 1- 2- 3- 4- 此の様にね こうすると 項の重複の無い 一覧が得られます。 話を例から元に戻して 同様にすると 2-5,false なら2-と、いう 親の行位置の リストが得られます。 其の上で 其のリスト中の falseを含むリストを 選り出して セルをリストアップすれば 解の一覧が得られるでしょう。 では、今回のヒントは此処まで。 是非、頑張って 此の抽出というスキルを ものにしてくださいね。