- ベストアンサー
複数シートからのデータ検索、コピー
- 複数のシートから条件に合致するデータを検索して、別ファイルの新しいシートに必要なデータをコピーする方法を知りたい。
- 検索するシートが複数で、検索条件も複数あるため、初心者の私には難しく感じます。
- シートから抽出したいデータは、「貸借対照表」と「損益計算書」の両方にあります。コード(数字)と勘定科目(文字)の条件を満たす行のデータを抽出したいです。マクロ機能を使うべきか悩んでいます。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>このような、検索、書き出し等が学べるサイトがありましたら 教えてください。 一般的に、一定の条件の複数データを抽出するには、通常の関数ではなく配列数式を利用する必要があります。 配列数式については、以下のページが参考になると思います。 http://pc.nikkeibp.co.jp/pc21/special/hr/ さらに、今回の質問にある2つのシートのデータを1つのシートにまとめて表示させる場合には、さらに複雑な数式を利用することになりますが、これらは関数のいろいろな利用法を1つ1つ積み重ねて覚えていくしかありません。 そのような意味で、このようなQ&Aサイトのいろいろな回答者の回答を見て(自分でもチャレンジして)、実戦的な使い方を覚えていくのもよいのではないかと思います。 複数の該当データを表示するには、そもそも複雑な配列数式を使う必要があるので、今回のように2つのシートから抽出する条件がついたさらに複雑なケースでは、無理に1つの式にするのではなく、作業列を使って該当データを抽出しやすくする関数を入力して対応するなど、順次段階を踏んでレベルアップしていくのがよいと思います。
その他の回答 (3)
- MackyNo1
- ベストアンサー率53% (1521/2850)
ご希望の表示をするには以下のようなきわめて複雑な配列数式を利用する必要があります。 たとえば、Sheet1とSheet2の1行目が項目名で2行目から20行目までの範囲にデータが入力されているなら、以下の式をSheet3のA2セルに入力して下方向にオートフィルします。 =IF(SUMPRODUCT((LEN(Sheet1!$A$2:$A$20)=3)*(Sheet1!$D$2:$D$20&Sheet1!$E$2:$E$20<>"00"))<ROW(A1),INDEX(Sheet2!B:B,SMALL(INDEX(((LEN(Sheet2!$A$2:$A$20)=3)*(Sheet2!$D$2:$D$20&Sheet2!$E$2:$E$20="00")+(LEN(Sheet2!$A$2:$A$20)=4))*1000+ROW($A$2:$A$20),),ROW(A1)-SUMPRODUCT((LEN(Sheet1!$A$2:$A$20)=3)*(Sheet1!$D$2:$D$20&Sheet1!$E$2:$E$20<>"00"))))&"",INDEX(Sheet1!B:B,SMALL(INDEX(((LEN(Sheet1!$A$2:$A$20)=3)*(Sheet1!$D$2:$D$20&Sheet1!$E$2:$E$20="00")+(LEN(Sheet1!$A$2:$A$20)=4))*1000+ROW($A$2:$A$20),),ROW(A1)))&"") B2セルには以下の式を入力して右方向に3つ、下方向に適当数オートフィルします。 =IF(A2="","",IF(SUMPRODUCT((LEN(Sheet1!$A$2:$A$20)=3)*(Sheet1!$D$2:$D$20&Sheet1!$E$2:$E$20<>"00"))<ROW(A1),VLOOKUP($A2,Sheet2!$B:$E,COLUMN(B1),0),VLOOKUP($A2,Sheet1!$B:$E,COLUMN(B1),0))) ちなみに、上記の数式は無理やり1つのセルで計算するようにしましたが、「SUMPRODUCT((LEN(Sheet1!$A$2:$A$20)=3)*(Sheet1!$D$2:$D$20&Sheet1!$E$2:$E$20<>"00"))」の部分は、どこかのセルに計算しておき、このセルを参照するようにしたほうが何度も同じ計算をしないので計算効率がよくなります。
- KURUMITO
- ベストアンサー率42% (1835/4283)
例えばシート1にお示しのデータがあるとして、それと同じようなデータがシート2にもあるとします。 シート3ではお求めの表を作成するとします。 シート1には作業列としてJ列を使用し、J4セルには次の式を入力して下方にオートフィルドラッグします。 =IF(A4="","",IF(AND(LEN(A4)=3,OR(D4>0,E4>0)),MAX(J$3:J3)+1,"")) シート2でも作業列としてJ列を使用するとしてJ3セルには次の式を入力します。 =MAX(Sheet1!J:J) J4セルには次の式を入力して下方にオートフィルドラッグします。 =IF(A4="","",IF(AND(LEN(A4)=3,OR(D4>0,E4>0)),MAX(J$3:J3)+1,"")) まとめのシート3ではA3セルに勘定科目、B3セルに借方額、C3セルに貸方額と入力します。 A4セルには次の式を入力し、右横方向にオートフィルドラッグしたのちに下方にもオートフィルドラッグします。 =IF(A$3="","",IF(COUNTIF(Sheet1!$J:$J,ROW(A1))>0,INDEX(Sheet1!$A:$H,MATCH(ROW(A1),Sheet1!$J:$J,0),MATCH(A$3,Sheet1!$3:$3,0)),IF(COUNTIF(Sheet2!$J:$J,ROW(A1))>0,INDEX(Sheet2!$A:$H,MATCH(ROW(A1),Sheet2!$J:$J,0),MATCH(A$3,Sheet2!$3:$3,0)),"")))
お礼
ありがとうございました。 このような、検索、書き出し等が学べるサイトがありましたら 教えてください。
- MackyNo1
- ベストアンサー率53% (1521/2850)
質問内容が今一つ不明確です。 >(A4から)A列が三桁の数字の行を選んで、なおかつ、D列とE列が両方とも0で無い行のB列、D列、E列の値を二つのシートそれでれで検索し、別シートにコピーしたいのです。(どちらのシートからでも構いません。 確認ですが、D,E列には空白はなく、必ず数字が入力されるのですね。 また「どちらのシートからでも構いません」とはどのような意味でしょうか? ちなみに、それぞれのシートの該当データは、配列数式を利用すればそれぞれ別に表示することができます。 >A列のコードの値はシート毎ではダブらないので、両方で抽出されたB、D、E列の値が列記できれば良いです。) 確認ですが、コードと勘定科目は1:1に対応しているのでしょうか? 「シート毎にダブらない」と書いていますが、この条件があると数式で表示する際に何か関係あるのでしょうか? >ただ、2つのシートの列数は決まっておらず、一方のシートの抽出データともう一方のシートの抽出データがダブってコピーされない様にしたいなとは思っております。 2つのシートの列数が決まっていないと、どうして抽出データがダブってコピーされることになるのでしょうか? 単にB,C,D列の値を表示するだけではないのでしょうか? 回答者がわかりよいように、元データや実際にまとめたいリストのレイアウトなどを含めて、具体例をあげて補足説明してください。
補足
ご回答頂きましてありがとうございます。 >確認ですが、D,E列には空白はなく、必ず数字が入力されるのですね。 はい、数字が必ず入ります。0か任意の整数です。 >また「どちらのシートからでも構いません」とはどのような意味でしょうか? 検索の順番がどちらからでも良い、という意味です。 >確認ですが、コードと勘定科目は1:1に対応しているのでしょうか? はい、対応しています。 >「シート毎にダブらない」と書いていますが、この条件があると数式で表示する際に何か関係あるのでしょうか? >ただ、2つのシートの列数は決まっておらず、一方のシートの抽出データともう一方のシートの抽出データがダブってコピーされない様にしたいなとは思っております。 一つ目のシートから検索したデータを別シートにコピーした際に、これが例えば20個あって20行までコピーされたとした際に、次のシートからの検索データが21行目からコピーされる、という意味です。 A B C D E F G 100 現金 2000 100 200 2100 0.25 9000 流動資産計 5000 200 200 5000 0.65 250 仮払金 2000 0 0 2000 0.00 260 売掛金 500 500 0 1000 0.05 ・ ・ 具体的には、上記の様なレイアウトになっております。 会計ソフトからのデータをエクセルデータに変換した際に、 A列が3桁のデータで、なおかつ、D及びEが0ではない(上記で言えば A列が100,260のデータのうち、B、D、Eの値を別シートにコピーしたい、ということです。 現金 2000 100 200 売掛金 500 500 0 ・ ・ ・ 次のシートに検索データ ・ ・ ・ このような具体例でお分かりいただけたでしょうか? お手数お掛け致しますが、よろしくお願い致します。
お礼
ありがとうございました。 このような検索、書き出し等が勉強できるサイト等がありましたら 教えてください。 よろしくお願い致します。