dポイントプレゼントキャンペーン実施中!

注文番号別に納品書を作りたいと思っています。

エクセルで開くと1商品につき1行のCSVファイルがあります。
そのデータを、作成したフォーマットを使って、注文番号毎に印刷がしたいです。
たとえば、

注文番号  商品  単価  数量  注文者名
1234  ああ  30   1  いろはに
1234  いい  40   2  いろはに
1234  うう  50   3  いろはに
2345  ああ  30   1  ほへとち
2345  うう  50   5  ほへとち
3456  いい  40  10  りぬるを

というCSVデータの場合、注文番号別に3枚の納品書が印刷されるのが目的です。
使用するCSVデータの内容は毎日異なります。(もちろん項目名等は固定です)
ワードの差し込み印刷かと思いましたが、注文番号別に行を認識させて読み込ませる方法がわかりませんでした。
エクセルかワードで実現できれば幸いです。

ただし、CSVデータは一切編集せずに実現させたいと思ってます。
よろしくお願いいたします。

A 回答 (5件)

エクセルのVBAでやれば、、少し経験在る人には、難しくない課題と思う。

質問者について、その点なんとも書いてないが、それは経験が無いということだろう。すると課題の丸投げで、この課題をVBAでやろうというのが速すぎる。
下記ならば
・2シートの扱い
・シート間のセルのデータの代入
・セル範囲のクリア
・印刷
・行の最終行までの繰り返し
の知識しか要らない平凡な方法。
ーー
私なら、次のステップでやる。
データは注文番号でソートしておく。あるいは注文者名+注文番号で(この方がベター)。
罫線や書式・フォントサイズ種類は、フォーマットシートに手操作で設定しておく(初心者なら)
(1)データを元データシートから読んで、別シートだろうが「フォーマット」にセット(配置)する。
その前に伝票番号に対応するデータ(注文会社名など)はセットすることからはじめる。1伝票につき1回。
(1)’元データシートの読む行をヅラして、同じ注文番号の間は「フォーマット」の下の行にデータをセットする
(2)注文番号が変わったら。、今までフォーマットのシートに貯めたデータを印刷する。
その際合計いんさつ計算などが必要な場合がある。合計が同一セルなら関数をあらかじめ設定しておく手もある。
(3)フォーマットのシートの印刷データセル範囲をクリア
今のデータをフォーマットのシートの最上行にセット
(4)(1)から繰返す
(5)フォーマットの注文明細の最大行数を超えてないかいつも見張って、越えるようだと
 (2)の印刷をして(3)の繰り返しをして続ける。
(6)元データが最終行になったら、フォーマットを印刷する。
ーー
初心者はフォーマットのシートで、納品書が40枚あるとすると、上から順次ヅラして40枚の納品書イメージをつくり、1回の印刷で40枚印刷を続行することを考えるかもしれないが、昔は内部メモリが少なくて、展開するエリアも十分確保できなくて
上記のようなやり方で訓練されたものだ。多分こちらの方がVBAコードは易しいだろう。
ーー
フォーマットシートへ、データのセットは関数でも(複雑になるが)やれると思うが、自動で印刷はVBAでやらないと、いかんともしがたい。

この回答への補足

申し訳ございません。
当方、数式程度は扱えますが、VBAになると全く経験がありません。
エクセル、もしくはワードの基本的な機能で解決できるものかと思っておりました。
VBAが必要となると、仰るとおり課題の丸投げでした。
申し訳ございません。
いただいたヒントをもとにVBAを基礎から学ぼうと思います。

ご迷惑おかけしました。

補足日時:2011/09/21 21:31
    • good
    • 0
この回答へのお礼

いただいたストーリーを元にVBAを勉強してみます。
ありがとうございました。

お礼日時:2011/09/22 18:39

添付画像を忘れていましたのでアップします。

「CSVデータから納品書を作成したいのです」の回答画像5
    • good
    • 0

csvデータが添付画像の上のレイアウトで、請求書が添付ファイル下のレイアウト(Sheet1にはcsvデータをコピー貼り付けしてあり、Sheet2で21行目から20行ごとに改ページが入れてある)なら、関数で表示する場合は以下のような操作になります。



例えば重複のない注文番号は以下のような関数で表示できます。

H2セルに以下の式を入力して下方向にオートフィルします。

=INDEX(Sheet1!A:A,SMALL(INDEX((MATCH(Sheet1!$A$2:$A$100&"",Sheet1!$A$2:$A$100&"",0)<>ROW($A$2:$A$100)-1)*1000+ROW($A$2:$A$100),),ROW(A1)))&""

一番上のH2セルの周囲にカーソルを合わせ、B2セル(注文番号を入力するセル)にドラッグアンドドロップします(セルの移動)。
同様に2枚目の請求書のB22セルに2番目のH3セルを移動します。

商品番号以下の詳細データを表示するには、A6セルに以下のような関数を入力し、右方向および下方向に適当数オートフィルします。

=INDEX(Sheet1!C:C,SMALL(INDEX((Sheet1!$A$2:$A$100<>$B$2*1)*1000+ROW($A$2:$A$100),),ROW(A1)))&""

A26セルにも同じ式(セルではない)をコピー貼り付けし、$B$2の部分を$B$22に変更して、同様にオートフィルコピーします。

請求書シートのレイアウトが完全に決まっていればすべて同じ数式で対応することもできますが(複雑な関数になるので)、ひとまず上記の関数で必要データが抽出できるか調べてみてください。
なお上記の数式では、数字が文字列データとして取得されますので、それらの値を使用して合計などを計算するときは少し工夫が必要になります。

また、上記の配列数式を多用すると、シートの動きが重くなるため、実際の運用では、計算方法を手動にしてF9キーで必要な時に再計算するなどの対応が必要かもしれません。

この回答への補足

ありがとうございます。
確かに必要なデータが現れました。仰るとおり、処理が重くもなりました。

注文番号は多い時で100件を超える場合があるので、(この件もお伝えしておりませんでした。申し訳ございません。)できればドラックアンドドロップを省略し、データを貼付けたら全て自動にするのが理想です。

現在VBAに詳しい知人にご指導いただく方向で進んでおります。

補足日時:2011/09/22 18:38
    • good
    • 1

ご希望の操作は関数で対応することもできますが、その場合は複雑な配列数式と編集操作を利用必要があります。



したがって実際の納品書のレイアウトがそのようになっているか具体的に例示されたほうが良いと思います。

例えば、元データがSheet1にあり、Sheet2のA1セル、A21セル、A41セル、・・・に注文番号、B1セル、B21セル、B41セル、に注文者名を表示した、20行ごとにページ区切りが入った納品書のフォーマットがあり、その中でB3セルから下方向に10行分の詳細データの表示行があり、関数で表示したいデータが商品、単価、数量の3つ(金額欄は自分で作成する)のようにできる限り具体的に例示してください。

例えば、上記のレイアウト(すなわち、Sheet2に納品書のフォーマットを作成したブックを作っておき、CSVファイルを開いたExcelのシートをSheet1にコピーする方法)で良いなら、具体的な操作方法を提示することができます。 

この回答への補足

ご指摘ありがとうございます。

元データは単独で存在します。(data.csvとします)
納品書は別ファイルであり、納品書.xlsもしくは、納品書.docとします。
(まだどちらで作るべきかわかりません)
エクセルで作るなら元データ全てを納品書.xlsのsheet2にコピペしようと思ってます。

data.csvですが、1商品1行のデータです。注文番号順でソート済みです。
1件の注文で複数の商品を購入されている場合は、配送先や合計金額などの情報は注文商品の数だけ同じ値が存在します。
また、納品書.xls(もしくは納品書.doc)では計算はせず、基本はdata.csvから引用します。

data.csvの仕様ですが、主要な項目名を並べると
注文番号,注文日,商品番号,商品名,商品単価,数量,小計,合計金額,手数料,郵便番号,住所,氏名,電話番号…
のようになっています。
複数の商品購入の場合は、注文番号が同じで商品情報だけが異なる行が複数存在します。


納品書のレイアウトは上から
タイトル
注文番号 日付
配送先の情報
商品番号 商品名 単価 数量 小計

・(複数あるなら連続)

手数料
合計金額

といった簡単なレイアウトです。
注文番号ごとに1枚の納品書を印刷させるようになるので、
数式ではできないと思っておりました。
やはりVBAを勉強しようと思ってます。

補足日時:2011/09/22 09:28
    • good
    • 0

仕様が不明確です


>注文番号別に3枚の納品書が印刷されるのが目的です。
>1234  ああ  30   1  いろはに
上記の1行で3枚?

>1234  ああ  30   1  いろはに
>1234  いい  40   2  いろはに
>1234  うう  50   3  いろはに
上記の3行で3枚?


>エクセルかワードで実現できれば幸いです。
どちらにしても、CSVならPerlで簡単にできると思います。

この回答への補足

申し訳ございません。
注文番号が3種類あるので、6行全てのデータで3種類の納品書になります。

エクセルの数式程度なら使えますが、プログラムになると全くわからない自分です。

ありがとうございました。

補足日時:2011/09/21 21:26
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!