質問: 2つの条件で重複しないデータを抽出 シート1 1|品名 種類 名前 データ 2|a 1 あ 21 3|b 2 い 11 4|f 2 あ 51 5|a 1 い 21 6|b 2 あ 64 7|a 1 あ 84 シート2 1|品名 a 2|種類 1 3| 4|名前 5|あ 6|い シート1のデータから、シート2の2つの条件(a1:b2)で、重複しない名前を表示する方法を教えて下さい。 上記のデータでいうと、品名aであり種類が1の名前を重複なしで特定の位置(a5)から詰めて縦に表示するようにして、 シート1のデータ、シート2の条件を変更したらa5からの名前が自動更新されるようにしたいです。 以下できたら追加したいこと 1.表示する名前の順番が、シート2の条件で集計したデータ値が多い名前順 2.シート2のb2の種類に0を入れると種類の条件無しで表示 実際はa5からの名前の行は数行を結合したもので右側には複数の行でデータ項目別になって、名前が入力された時に日毎のデータを自動表示しています。 全部で名前の種類は30以上ありますが、品名の条件をつければ名前は10種類以下になります。 グラフは名前別で表示しており、不要な名前が増えると表示しずらいので、必要な名前だけのデータを表示するようにしたいです。 どうかよろしくお願いします。
回答: no.1です! 補足を読ませていただきました。 データは10000行位あり、今後も増える予定だというコトですので、 vbaでの方法はどうでしょうか? ※ 実は前回、 >1.表示する名前の順番が、シート2の条件で集計したデータ値が多い名前順 >2.シート2のb2の種類に0を入れると種類の条件無しで表示 の件を無視していましたので、 sheet1・sheet2の配置はお示し通りになっていて、sheet3を作業用に使用しています。 (sheet3は現在なにも使用していないという前提です。) 画面左下にあるsheet2のsheet見出し上で右クリック → コードの表示 → vbe画面が出ますので ↓のコードをコピー&ペーストしてsheet2のb1・b2セルのデータを変更してみてください。 private sub worksheet_change(byval target as range) 'この行から dim i, j as long dim ws1, ws3 as worksheet set ws1 = worksheets(1) set ws3 = worksheets(3) application.screenupdating = false if target.row <= 2 and target.column = 2 then if worksheetfunction.countblank(range("b1:b2")) then exit sub i = cells(rows.count, 1).end(xlup).row if i > 4 then range(cells(5, 1), cells(i, 1)).clearcontents end if ws1.columns("a:d").copy destination:=ws3.cells(1, 1) ws3.columns("a:d").sort key1:=ws3.cells(1, 4), order1:=xldescending ws3.columns(1).insert if cells(2, 2) = 0 then for i = 2 to ws3.cells(rows.count, 2).end(xlup).row if ws3.cells(i, 2) = cells(1, 2) and _ worksheetfunction.countif(ws3.columns(1), ws3.cells(i, 4)) = 0 then ws3.cells(i, 1) = ws3.cells(i, 4) end if next i for j = 2 to ws3.cells(rows.count, 1).end(xlup).row if ws3.cells(j, 1) <> "" then cells(rows.count, 1).end(xlup).offset(1) = ws3.cells(j, 1) end if next j else for i = 2 to ws3.cells(rows.count, 3).end(xlup).row if ws3.cells(i, 2) = cells(1, 2) and ws3.cells(i, 3) = cells(2, 2) and _ worksheetfunction.countif(ws3.columns(1), ws3.cells(i, 4)) = 0 then ws3.cells(i, 1) = ws3.cells(i, 4) end if next i for j = 2 to ws3.cells(rows.count, 1).end(xlup).row if ws3.cells(j, 1) <> "" then cells(rows.count, 1).end(xlup).offset(1) = ws3.cells(j, 1) end if next j end if ws3.cells.clearcontents application.screenupdating = true end if end sub 'この行まで ※ b2セルが「0」の場合は「種類」は無視して、「品名」ごとの最大データの人を表示! ※ b2セルが「0」以外の場合は「品名」・「種類」が一致する最大データの人を表示! という考え方にしています。 お役に立てば良いのですが・・・m(_ _)m