- ベストアンサー
エクセルマクロで条件抽出と定型書式への書出し
- エクセルマクロ(VB)を使用して、条件抽出と定型書式への書き出しを行いたいです。
- 条件入力フォームの条件からSheet1のデータをSheet2に抽出し、Sheet3の定型フォームに書き出します。
- 条件入力フォームからSheet2への抽出転記はできそうですが、定型フォーム(Sheet3)への書き出し方法がわかりません。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
その他項目多数が有ってそれらをどの様に取り扱って行くかわ別の問題としてここでは説明します。 シート1ではA1セルからD1セルまでに項目名の売上月から原価が、各データは2行目から下方にあるとします。 ところで検索のための条件ですがシート2でそれらの条件を入力します。 シート2のA1セルには販売月ー開始の項目名を入れB1セルに2010/4のように入力します。 A2セルには販売月ー終了と項目名を入れB2セルに2010/4のように入力します。 A3セルには商品名1と入力し、B3セルには魚などと入力します。 A4セルには商品名2と入力し、B4セルには肉などと入力します。 A5セルには販売価格と入力し、B5セルではリストの形で1000、2000,5000、空白などが選べるようにします。 A6セルには原価と入力し、B6セルではリストの形で500,1000、空白が選べるようにします。 そこでこれらの条件を受けてシート1では作業列を設けシート1の例えばJ2セルには次の式を入力して下方にオートフィルドラッグします。 =IF(AND(A2>=Sheet2!B$1,A2<=Sheet2!B$2),IF(AND(Sheet2!B$5<>"",Sheet2!B$6<>""),IF(AND(OR(B2=Sheet2!B$3,B2=Sheet2!B$4),C2=Sheet2!B$5,D2=Sheet2!B$6),A2*10000+COUNTIF(A$2:A2,A2),""),IF(AND(Sheet2!B$5<>"",Sheet2!B$6=""),IF(AND(OR(B2=Sheet2!B$3,B2=Sheet2!B$4),C2=Sheet2!B$5),A2*10000+COUNTIF(A$2:A2,A2),""),IF(AND(Sheet2!B$5="",Sheet2!B$6<>""),IF(AND(OR(B2=Sheet2!B$3,B2=Sheet2!B$4),D2=Sheet2!B$6),A2*10000+COUNTIF(A$2:A2,A2),""),IF(AND(Sheet2!B$5="",Sheet2!B$6=""),IF(OR(B2=Sheet2!B$3,B2=Sheet2!B$4),A2*10000+COUNTIF(A$2:A2,A2),""),"")))),"") このほかにシート1のK2セルには次の式を入力して下方にオートフィルドラッグします。 =IF(B2="","",IF(COUNTIF(B$2:B2,B2)=1,MAX(K$1:K1)+1,INDEX(K$1:K1,MATCH(B2,B$1:B1,0)))) シート1のL2セルには次の式を入力して下方にオートフィルドラッグします。 =IF(K2="","",A2*10000+K2) そこでシート2の条件B1からB6のデータを満足する抽出のデータをシート2の9行目から下方に表示させるとしてシート2のA8セルには売上月、B8セルには商品名、C8セルには販売価格、D8セルには原価(円)と項目名を入力し、A9セルには次の式を入力した後でD9セルまでオートフィルドラッグしたのちに下方にもオートフィルドラッグします。 =IF(ROW(A1)>COUNT(Sheet1!$J:$J),"",IF(INDEX(Sheet1!$A:$I,MATCH(SMALL(Sheet1!$J:$J,ROW(A1)),Sheet1!$J:$J,0),COLUMN(A1))=0,"",INDEX(Sheet1!$A:$I,MATCH(SMALL(Sheet1!$J:$J,ROW(A1)),Sheet1!$J:$J,0),COLUMN(A1)))) なお、A9セルから下方のセルを選択して右クリックし、「セルの書式設定」から「表示形式」の「ユーザー定義」で yyyy/m と入力します。 なお、シート3を作成するために必要な作業列としてシート2のJ9セルには次の式を入力して下方にオートフィルドラッグします。 =A9&B9&C9 シート3は定型フォームでA1セルに売上月、B1セルに商品名、C1セルに数量、D1セルに原価計の項目名を入力します。 A2セルには次の式を入力したのちにB2セルまでオートフィルドラッグしたのちに下方にもオートフィルドラッグします。 =IF(ROW(A1)>COUNT(Sheet1!$L:$L),"",INDEX(Sheet1!$A:$C,MATCH(SMALL(Sheet1!$L:$L,ROW(A1)),Sheet1!$L:$L,0),COLUMN(A1))) C列およびD列にデータを入力するために作業列としてシート3のJ2セルには次の式を入力して下方にオートフィルドラッグします。 =A2&B2&C2 その後にC2セルには次の式を入力して下方にオートフィルドラッグします。 =IF(J2="","",IF(AND(COUNTIF(J$2:J2,J2)=1,COUNTIF(Sheet2!$J:$J,J2)>0),COUNTIF(Sheet2!$J:$J,J2),"")) D2セルには次の式を入力して下方にオートフィルドラッグします。 =IF(D2="","",SUMIF(Sheet2!J$9:J$10000,J2,Sheet2!D$9:D$10000)) それぞれのシートで作業列が目障りでしたらその列を選択して右クリックし、「非表示」を選択すればよいでしょう。
その他の回答 (3)
- 某HN クロメート(Chromate)(@CoalTar)
- ベストアンサー率40% (705/1742)
- 某HN クロメート(Chromate)(@CoalTar)
- ベストアンサー率40% (705/1742)
抽出ができるなら、作業列がいらなくなるが数式で出してみた 販売月=売上月 として条件表を書いてみた(添付図参照) また、シリアル値として入力している なお、原価欄は入力していない 作業列1 E2セルに =A2&B2&C2 作業列2 条件表に合致する項目なのかを検証した F15セル 0 F16セル =DCOUNT($A$15:$C16,,$A$11:$E$13) 下へオートフィル 数量 =IF(F15=F16,0,COUNTIF($E$2:$E$9,A16&B16&C16)) 下へオートフィル 原価 =IF(D16=0,0,SUMIF($E$2:$E$9,A16&B16&C16,$D$2:$D$9)) 下へオートフィル 空欄処理は書式設定、または、VBAで処理できると思います。
お礼
ありがとうございます。
- imogasi
- ベストアンサー率27% (4737/17069)
(1)Sheet1からSheet2作成 多条件の抜き出しで、エクセルVBA程度では難しいと思いますが、どのようにした、または仕様としてますか? 私の考えるところでは、フィルタオプションの設定をVBA化して使うのを思いつきますが。 これも原データと条件、抽出結果が別シートに亘る場合注意が必要です。 (2)Sheet2からSheet3の作成。 掲示データ例の数がアンバランスで聞きたいことがよく伝わらない。 (1)行数はSheet2<Sheet3のように増えることはありますか。 (2)列数的に計算項目は別にして(例 単価X数量=総金額の用なのは別にして)在りますか。 (3)Sheet3では中間集計行的なものは増えてますか これら(1)(2)(3)のようなことを説明して無いのでよくわからない。 データ例を挙げるのも大切だが、やることで特徴的な事項も説明を加えること。 私から言うとSheet2からSheet3咲くせいなど、データの代入だけの問題で質問に当たらない(>どなたかお知恵を拝借できますでしょうかー>知恵というものは要らない)と思うが、反論をしてください。
お礼
私の説明の仕方が悪かった部分もあるので、もう一度検証してみます。ありがとうございます。
お礼
VBで考えているのですが、もし自分で無理な場合は、アドバイスいただいた方法でやろうと思います。とても早くご解答いただきありがとうございます。まだ思案中でございます。