- ベストアンサー
EXCELにて請求書と請求明細を作るとき
EXCELにて請求書と請求明細を作るときに効果的な関数があったら教えて下さい。 SHEET1が請求書だとします。 項目は 1. 12/1 りんご 3個 150円 2. 12/3 バナナ 2個 200円 3. 12/10 メロン 1個 500円 4. 12/18 りんご 5個 250円 5. 12/20 バナナ 1個 100円 の場合、SHEET2がりんごの明細 SHEET3がばななの明細 SHEET4がメロンの明細とます。 SHEET2に 12/1 りんご 3個 150円 12/18 りんご 5個 250円 と入り、SHEET3に 12/3 バナナ 2個 200円 12/20 バナナ 1個 100円 と明細が各商品のシートごとに入るような関数はありますか? 請求書を訂正した場合に、自動的に明細も変更になるようにしたいのですが、可能なことでしょうか?(12/20のバナナをメロンに替えたら、SHEET4の明細に12/10と12/20が入り、SHEET3から12/20分が抜けるという状態です)
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは~ 以下の方法を試してみてください。 **<<前提条件>>******************* Sheet1 から Sheet4 まですべて A列‥「日付」、B列‥「品名」、C列‥「数量」、D列‥「金額」 1行目が見出し行で、データは 2行目から ********************************* ■ 作業列を使う方法 ■ 作業列は Sheet1のどの列でもかまいません。 ここでは仮に J列からK列を作業列とします。 ★ Sheet1 の J2セルに =IF($B2="りんご",ROW(),"") と入れて、L2セルまで右にコピー K2 の "りんご" → "バナナ" に L2 の "りんご" → "メロン" に変更 J2:L2 の式を、請求データ最終行までコピー 今後もデータが増えるなら、多めにコピーしておいてください。 ★ Sheet2 の A2セルに =IF(COUNT(Sheet1!$J:$J)<ROW(A1),"",INDEX(Sheet1!A:A,SMALL(Sheet1!$J:$J,ROW(A1)))) をコピー&ペーストしてください。 そのあと、D2セルまでコピー A2:D2 の式を必要なだけ下にフィルコピー コピー後、A列の表示形式を 「日付」にしてください。 ◆ Sheet3 は上の数式の Sheet1!$J:$J → Sheet1!$K:$K に変えてください( 2ヶ所 )。 ◆ Sheet4 は上の数式の Sheet1!$J:$J → Sheet1!$L:$L に変えてください( 2ヶ所 )。 ↑は、作業列が J列から K列の場合です。J列から K列以外の列を作業列にする場合は、その列記号に合わせてください。 ◆ 作業列が目障りなら非表示にしてください。 ◆ ROW(A1) は、先頭のセル( この例では A2セル )がどこであれ、A1のままにしておいてください。←先頭のセルのみ。あとは右に下にコピーするだけで OK。 ***** ■ 作業列を使わない方法 ■ ★ Sheet2 の A2セルに =IF(COUNTIF(Sheet1!$B$1:$B$100,"りんご")<ROW(A1),"",INDEX(Sheet1!A:A,100-LARGE(INDEX((Sheet1!$B$1:$B$100="りんご")*100-ROW($A$1:$A$100),0),ROW(A1)))) をコピー&ペーストしてください。 そのあと、D2セルまでコピー A2:D2 の式を必要なだけ下にフィルコピー コピー後、A列の表示形式を 「日付」にしてください。 ◆ Sheet1 の最大データ数を 100としています。 それ以上ある場合は、100( 5ヶ所 )を変更してください。 ◆ Sheet3、Sheet4 は、"りんご" ( 2ヶ所 )をそのシートの品名に変えてください。
その他の回答 (3)
- imogasi
- ベストアンサー率27% (4737/17069)
>SHEET1が請求書だとします。 というよりも、(1)Sheet1を請求書データとします。 (2)月ごとの請求書として、Sheet1には該当月の請求分明細のみが抜き出されているとします。 そうしないとさらに式が複雑化します。 (3)その中でりんごのみを別葉に印刷することを考えます。 例データ (質問では個数、金額を全角で単位つきの文字列になっているが 数字を入れるようにして、書式で単位を設定すること。 計算ができない弊害があるため。) Sheet1A1:E12 1 12月1日 りんご 3個 150円 2 12月3日 バナナ 2個 200円 3 12月10日 メロン 1個 500円 4 12月18日 りんご 5個 250円 5 12月20日 バナナ 1個 100円 6 12月21日 りんご 4個 200円 7 12月22日 バナナ 2個 300円 8 12月23日 りんご 1個 400円 9 12月24日 メロン 3個 1,000円 10 12月25日 バナナ 3個 800円 11 12月26日 りんご 5個 400円 H2に(G列以右ならどの列でも良い) =COUNTIF($C$2:C2,Sheet2!$B$1) H12まで式を複写。 H2:H12 1 1 1 2 2 3 3 4 4 4 5 Sheet2に行き B1にりんごを入れる。 B12に=COUNTIF(Sheet1!$C$1:$C$100,$B$1) E12に=SUM(E2:E10) をいれる。 B3に式 =IF((ROW()-2)<=$B$12,INDEX(Sheet1!$B$2:$E$100,MATCH(ROW()-2,Sheet1!$H$1:$H$100,0)-1,COLUMN()-1),"") と入れてE3まで式を複写 B3:E3を範囲指定して、Eで+ハンドルを出して、 B10:E10まで引っ張る 結果 12月1日 りんご 3個 150円 12月18日 りんご 5個 250円 12月21日 りんご 4個 200円 12月23日 りんご 1個 400円 12月26日 りんご 5個 400円 5 1,400円 各列や各セル(B12、E12など)書式を適当に整えてください。 以上imogasi方式です。
お礼
imogasi方式勉強してみます。私の下手な質問でこんなに詳しく答えてくださってありがとうございます。
- imogasi
- ベストアンサー率27% (4737/17069)
質問の回答ではないですが、 (1)請求書というのは、得意先に出すものだと思います。 得意先の名前、またはコードはどうなってますか。 (2)りんごなどの品物別に請求書シートを分けてますが 請求書は品物別に作るのですか もしりんごなどが得意先の意味なら、紛らわしいから、今後は A商事、B商店とでもにして、例を作ってください。 エクセル関数は、抜き出しが不得手で、関数でやるには式が複雑化します。 最低限のVBAを使って処理するよう、勉強したほうが良い。 請求書であれば、この後印刷するのでしょうが シートごとに分けないほうが良い。 シート1=りんご シート2=バナナ ・・・ 1シートずつ印刷(手作業?) でやるのでなく シート1=りんご 印刷(VBAで) シート1=バナナ 印刷(VBAで) ・・・ の形を目指すべきですが 明細が複数ある(本質問では複数日の注文あり)とき、1行ずつづらしてセットするのが、関数では むつかしい。 作業列を使う方法で、私はimogasi方式と名づけて、多数回答しています。OKWAVEで「imogasi方式」で照会してもらえば、類似例が出ると思います。 別質問で上げてみます。
- s___o
- ベストアンサー率35% (108/306)
ご質問はセルに効果的な関数(数式)を与える方法をお尋ねしているのでしょうか? そうですと、少々無理があると思います。 マクロを使えば、比較的簡単にできます。 SHEET1の果物名をキーに各シートに割り振るだけですから。
お礼
どうもありがとうございました。マクロを理解できるようになりたいです。
お礼
ありがとうございました。できました。私の下手な説明を理解してくださってありがとうございます。