- ベストアンサー
エクセル複数データ抽出で困っています。助けてください。
- エクセルの複数データの抽出で困っています。他の方の回答例も使用してみましたがうまく出来ませんでした。
- シート1のA列グループを選択すると全てのデータを摘出したいです。選択方法は1と3、2と4、1と5など結構なパターンがあります。
- 助けていただけると幸いです。関数やマクロの使用は問いません。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
その他の回答 (6)
- kagakusuki
- ベストアンサー率51% (2610/5101)
今仮に、グループ選択で指定するグループ名をSheet2のB1、C1、D1セルに入力すると、抽出結果をSheet2の4行目以下に表示させるものとします。 まず、Sheet2のA4セルに次の数式を入力して下さい。 =IF(ROWS($4:4)>COUNTIF(Sheet1!$A:$A,$B$1)+COUNTIF(Sheet1!$A:$A,$C$1)+COUNTIF(Sheet1!$A:$A,$D$1),"",INDEX(Sheet1!A:A,SUMPRODUCT(ROW($A$1:INDEX($A:$A,MATCH("゛",Sheet1!$C:$C,-1)))*COUNTIF($B$1:$D$1,Sheet1!$A$1:INDEX(Sheet1!$A:$A,MATCH("゛",Sheet1!$C:$C,-1)))*(COUNTIF(OFFSET(Sheet1!$A$1,,,ROW($A$1:INDEX($A:$A,MATCH("゛",Sheet1!$C:$C,-1)))-ROW($A$1)+1),$B$1)+COUNTIF(OFFSET(Sheet1!$A$1,,,ROW($A$1:INDEX($A:$A,MATCH("゛",Sheet1!$C:$C,-1)))-ROW($A$1)+1),$C$1)+COUNTIF(OFFSET(Sheet1!$A$1,,,ROW($A$1:INDEX($A:$A,MATCH("゛",Sheet1!$C:$C,-1)))-ROW($A$1)+1),$D$1)=ROWS($4:4))))) 次に、Sheet2のA4セルをコピーして、Sheet2のB4~D4の範囲に貼り付けて下さい。 次に、Sheet2のA4~D4の範囲をコピーして、同じ列の5行目以下に貼り付けて下さい。 後は、グループ選択で指定するグループ名をSheet2のB1、C1、D1セルに入力しておくだけで、全自動で抽出結果が表示されます。(「Ctrl+Shift+Enter」操作や作業列は不要です) 尚、この数式では、Sheet1に入力されている元データの表の、何行目にまでデータが入力されているのかを、D列の数量欄に、数値データが存在している最下段の行が、何行目であるのかを判定する事で、計算処理を行っているため、正確に動作させるためには、データが入力されている最下段の行の数量欄には、必ず数値が入力されていなければなりません。(どうしても最下段の数量欄に数値データを入力出来ない場合には、データが入力されている最下段の行よりも下にある行中の数量欄に、0等の適当な数値を入力してから、抽出を行って下さい)
- MackyNo1
- ベストアンサー率53% (1521/2850)
補助列を使わずに関数で対応するなら以下のような配列数式を使うことになります。 抽出条件を入力するセルがA2:A5セルに設定されている場合(最大4条件まで選択できる場合)、以下のような数式をD2セルに入力して、Ctrl+Shift+Enterで確定して下方向に適当数オートフィルコピーします(添付画像参照)。 =INDEX(Sheet1!A:A,SMALL(IF(ISNUMBER(FIND(TRANSPOSE($A$2:$A$5),Sheet1!$A$1:$A$1000))*(TRANSPOSE($A$2:$A$5)<>""),ROW($A$1:$A$1000)*1,1000),ROW(A1)))&"" E2セルには以下の式を入力してCtrl+Shift+Enterで確定し、右方向に3つ、下方向に適当数オートフィルします。 =IF($D2="","",INDEX(Sheet1!B:B,SMALL(IF(ISNUMBER(FIND(TRANSPOSE($A$2:$A$5),Sheet1!$A$1:$A$1000))*(TRANSPOSE($A$2:$A$5)<>""),ROW($A$1:$A$1000)*1,1000),ROW(B1))))
- hallo-2007
- ベストアンサー率41% (888/2115)
フィルターオプションの機能を紹介しておきます。 データが入っているシートが Sheet1 として 別のシートに A B C D 1 グループ 2 1 3 2 4 5 グループ メーカ 部品 数量 6 と検索した値を A1~A3セルに入れておきます 表示を出したい部分にその項目名を入れておきます。 エクセル2010 の場合で データ=>フィルター 明細設定で 指定した範囲 にチェック リスト範囲 Sheet1!A:D 検索条件範囲 A1:A3 抽出範囲 A5:D5 でOKすると グループが 1 と 2が抽出されます。 これをマクロの記録で実行してできたコードを活用した事例ですが 抽出して表示するシート名を右クリック コードの表示でVBエディターを起動して Private Sub Worksheet_Change(ByVal Target As Range) If Target.Row < 4 Then Sheets("Sheet1").Columns("A:D").AdvancedFilter Action:=xlFilterCopy, _ CriteriaRange:=Range("A1:A3"), CopyToRange:=Range("A5:D5"), Unique:=False End If End Sub を貼り付けして閉じると A2とA3セルに抽出を希望する グループの番号を入れるたびに表示が変わってくれます。
- KURUMITO
- ベストアンサー率42% (1835/4283)
シート1はもとの表でA1セルからD1セルには項目名が入力され2行目から下方にお示しのデータが並んでいるとします。 作業列をE列に設け、E2セルには次の式を入力して下方にオートフィルドラッグします。 =IF(A2="","",A2+COUNTIF(A$2:A2,A2)/1000) シート2には抽出したデータを表示させることにしてA1セルにはグループ名を例えば1と入力し、B1セルにはグループ名を例えば2と入力します。 2行目にはシート1と同じ項目名を入力します。 A3セルには次の式を入力してD3セルまでオートフィルドラッグしたのちに下方にもオートフィルドラッグします。 =IF(ROW(A1)<=COUNTIF(Sheet1!$A:$A,$A$1),INDEX(Sheet1!$A:$D,MATCH($A$1+ROW(A1)/1000,Sheet1!$E:$E,0),COLUMN(A1)),IF(ROW(A1)<=COUNTIF(Sheet1!$A:$A,$A$1)+COUNTIF(Sheet1!$A:$A,$B$1),INDEX(Sheet1!$A:$D,MATCH($B$1+(ROW(A1)-COUNTIF(Sheet1!$A:$A,$A$1))/1000,Sheet1!$E:$E,0),COLUMN(A1)),"")) このような方法ではシート1の表では必ずしもグループごとにデータが並んでいなくても対応することができます。
- tom04
- ベストアンサー率49% (2537/5117)
こんばんは! 一例です。 ↓の画像のようにSheet1のデータをSheet2に表示するようにしてみました。 Sheet1に作業用の列と検索データを入力するセルを設けています。 (作業列・検索セルはどこでも構いません) 作業列E2セルに =IF(COUNTIF($G$2:$G$5,A2),ROW(),"") という数式を入れオートフィルでずぃ~~~!っと下へコピーしておきます。 そしてSheet2のA2セルに =IF(COUNT(Sheet1!$E:$E)<ROW(A1),"",INDEX(Sheet1!A:A,SMALL(Sheet1!$E:$E,ROW(A1)))) という数式を入れ列方向と行方向にオートフィルでコピーすると 画像のような感じになります。 尚、VBAでやる場合は作業用の列は必要ありませんが、検索データをINPUTBOXに入力するようにする、 もしくは画像のように検索データを入力するセルを設ける必要があると思います。 検索データのパターンが二つとか決まっているのであればINPUTBOX等でも良いと思いますが 検索データの数を好みによって変えたいという場合は前述のような関数が簡単かもしれませんね。 以上、参考になれば良いのですが・・・m(_ _)m
お礼
ご返信遅れてすみません。 親切丁寧な説明ありがとうございます。 お陰様で上手くできました。 もう一つ教えていただきたいのですが シート2のグループ選択を増やす場合は A4の数式中「$D$1」の箇所を$Eとか$Fとかに 変更すれば4個、5個に増やせますか? よろしくお願い致します。