• 締切済み

関係性を持ったソート

例えば以下の様なデータで 親-子, 判定とした場合 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です

みんなの回答

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.6

 回答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)
回答No.5

 今仮に、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/8248)
回答No.4

>だけ抜き出せれば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% (363/1775)
回答No.3

[No.2]ですが、質問文の末尾の「だけ抜き出せればOKです」の上を見ると、「判定」の欄もご所望だったことに気付きました。対策は簡単です。 何のことはない、抽出範囲の「$F$1」を「$F$1:$G$1」にするだけぇ~!

  • msMike
  • ベストアンサー率20% (363/1775)
回答No.2

Excel のバージョンを選ばない[フィルタオプションの設定]に依る方法を、ゴチャゴチャ解説抜きでご紹介。 添付図参照 C2: =IF(B2=FALSE,LEFT(A2,FIND("-",A2)-1),"") E2: =COUNTIF(C:C,LEFT(A2,FIND("-",A2)-1)) 抽出先→指定した範囲 リスト範囲→$A$1:$B$9($A$1:$C$9 でも構わない) 検索条件範囲→$E$1:$E$2 抽出範囲→$F$1 【お断り】[フィルタオプションの設定]をご存じなければ、この回答を無視されたい。

  • Nouble
  • ベストアンサー率18% (330/1783)
回答No.1

-以前の値に置いて 以下に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を含むリストを 選り出して セルをリストアップすれば 解の一覧が得られるでしょう。 では、今回のヒントは此処まで。 是非、頑張って 此の抽出というスキルを ものにしてくださいね。

関連するQ&A

  • Ruby バブルソート

    バブルソートのプログラムでわからないところがあるため、 質問させていただきます。 Rubyは1.9.3を使用しています。 <プログラム> --------------------------------------------------- def bsort(data)   while true     # swapped変数は数値の入れ替えを記憶     swapped = false     for i in 0..data.size-2       if data[i] > data[i+1]         temp = data[i]         data[i] = data[i+1]         data[i+1] = temp         swapped = true       end     end     return if !swapped   end end data = [10, 9, 8, 7, 6] bsort(data) puts "ソート結果#{data}" --------------------------------------------------- return if !swapped のところで、 なぜwhileのループから抜けられるのかがよくわかりません。 return if swapped == false と書き換えて実行しても同じ結果が得られたのですが、 数値の入れ替えがなければ swapped = false であるため、 !swappedはtrueとはならないのでしょうか。

  • 【SQL】1つのレコード内にある複数のデータの集計

    1つのテーブルの1つのレコード内に、以下のような複数のBooleanデータがあって、trueがいくつあるかを数えたいのですが、1つのSQLで記述できるでしょうか? ID data1 data2 data3 data4 ... 1  true  false  true  false ...

  • case文

    こんにちは、SQL初心者です。 値を判定して、trueなら「*」をfalseなら表示なしとするのですが、 判定項目がかなりありまあす。 case文だとtrue、falseで二通り書かないといけないと思うのですが、簡単な方法はありますか? if文みたいにelseを使えればいいのですが。

  • addEventListener の第三引数の意味

    addEventListener の第三引数の意味を教えてください。 MDNでは element.addEventListener - MDN https://developer.mozilla.org/ja/DOM/element.addEventListener 「true の場合、useCapture は、ユーザがキャプチャを開始したいことを示しています」 と書いてあり何のことやらさっぱり分かりませんでした。 一応下記のサイトを見て表面的な動きは理解しました。 addEventListener の第三引数について - hogehoge @teramako http://d.hatena.ne.jp/teramako/20070126/about_useCapture_of_addEventListener 以下の順で処理される。 1 親のtrue 2 子のtrue 3 子のfalse 4 親のfalse それは分かったのですが、どういうときに使い分けるのかということが結局分かりませんでした。おそらくはほとんどの場合でどちらでもいい・意識する必要が無いのではないかと思いますが、しかし一応きちんと理解しておきたいと思っています。 ◎addEventListener の第三引数の意味 ◎addEventListener の第三引数を ・trueにした方がいいケース ・falseにした方がいいケース このあたりを教えてください。 よろしくお願いします。

  • 条件付き書式設定でユーザー定義関数

    ユーザー定義関数を以下のように作成しました。 Function AAA(i As Integer) As Boolean If i = 1 Then AAA = True Else AAA = False End If End Function このユーザー定義関数を条件付き書式で使用するときに期待した動作になりません。 条件付き書式のルールに 【1】 =AAA(1) とするとTRUEになりましたが、 【2】 =AAA(ROW(B1)) と入力するとTrueと判定されませんでした。(ここでTrueと判定させたかった) なお【3】 =ISERROR(AAA(ROW(B1))) と入力するとTrueと判定されました。 (補足) 【2】はB1セルの行番号(=1)をAAA関数で判定させてます。 実際は、列番号も引数に加えて、表全体に条件付き書式を設定しようとしてます。 ちなみにセルに直接上記数式を入力した場合 【1】→True 【2】→True 【3】→False となります。 【2】のエラーの原因は何でしょうか? 【2】でTrueと判定させる方法はありますか? 以上、よろしくお願いします。 ※エクセル2010

  • 一部文字列が検索できたらtrueを返したい

    現在googleスプレッドシートを使っています。 今までは”Y14”というセルには”OK”か”予備”か、もしくは空白のテキストのどれかが入っていて、このセルのテキストを別のセルで内容判定の式として次のように判定していました。 =OR(Y14="OK",Y14="予備") しかし、このY14には、この3種類以外にも ・OK(改造済み) ・予備(改造済み) この2つのテキストが入るようになりました。 ”(改造済み)”というテキストが余計に追加される可能性が出たのですが、”OK”,”予備”というテキストが入っていたならTRUEを返して、なければFALSEを返したいと考えています。 試しに、 =OR(SEARCH("OK",Y14)>0,SEARCH("予備",Y14)) このような式を作成してみたのですが、Y14=”OK”の場合、SEARCH("OK",Y14)はTRUEが帰るのですが、SEARCH("予備",Y14)はエラーが起きてしまいます。 この場合はSEARCH("予備",Y14)はFALSEを返してもらいたいのですが、どうやれば良いのかご教示いただきますよう、よろしくお願いいたします。

  • PowerShellにおけるコマンドの戻り値につい

    はじめまして質問させていただきます。 最近PowrShellを書き始めました そこでですが、PowrShellにおいてBatならERRORLEVEL、Shellなら$?といったコマンドの実行結果コードをとる方法がありますしょうか? PowerShelでも$?は使用できますが、True/Falseだけなので生後判定が2種類しかないので・・

  • データグリッドの列見出しソート禁止で

    いつもお世話になります。 VB.NET2003+Access2000環境です。 データグリッドを使用してデータを入力しているのですが、ちょっと要望が出てきまして試したのですがうまくいきません。 お知恵を貸してください。 通常、複数行のデータがある場合、データを入力してから列見出しをクリックするとそれをキーにソートされますよね。 これを禁止するために datagrid1.AllowSorting = False を記述しました。 結果目的は達成されているのですが、データが1行だけの場合、しかも全ての列の入力が終わっておらない状態の時にどこかの列見出しに当たってしまうと入力データが消えてしまいます。 複数行あれば問題ないのですが、一行だけあるいは入力途中の時点でもソート禁止にする方法はないものでしょうか? よろしくお願いします。

  • while構文について質問

    以下は、ソースコードの一部です。それを見た上で私の質問に答えてください。 int i=0; while(true) System.out.println(i); i++ 質問:何故、whileの反復条件に「true」を書くと、無限ループになるのですか? その理由は、「while構文は、括弧の中の反復条件の判定の結果がtrueなら、処理を行うので、括弧の中にtrueを書くと、反復条件はtrueのまま変わらないので、その判定結果はtrueと判断されつづけ無限ループする」こういうことでしょうか?

    • ベストアンサー
    • Java
  • 画像読み込み失敗の判定

    VBA Excel2007を使用しています。 画像をインポートするために、例えば、myPicuter = ActiveSheet.Shapes.AddPicture(filename, true, false, 0, 0, 100,100)を実行した際に、読み込みに失敗するとmyPictureとして添付のような表示が現れますが、このmyPicuterが画像でないことを判定する方法は有るでしょうか。 また、もし直接判定ができなければ、中の文字列を読み出して、その内容から判定する方法はあるでしょうか。

専門家に質問してみよう