• 締切済み

受注リストから請求書を印刷する方法について

以前の質問で解決できなかったので再度質問いたします。 差込印刷で、差込のフィールド数がページによって異なる場合の差込印刷はできないのでしょうか。 例えば、次のようなデータファイル(エクセル)をもとに、顧客ごとにワードで請求書を作成する場合、差込印刷を使うことはできないのでしょうか。 顧客名 商品名 数量 小計 ------------------------- A社  商品X1 10個 Y1円 A社  商品X2  5個 Y2円 B社  商品X1 12個 Y3円 B社  商品X3 22個 Y4円 B社  商品X4  8個 Y5円  こういう使い方は結構あると思うのですが・・・ もし、差込印刷が使えなければ、他に良い方法はありますか? エクセルのオートフィルタで表示はできますが、請求書として印刷したいのです。 他の方法としてマクロを使えばできそうですが、マクロは少し苦手です。  WindowsXPでOffice2000を使用しています。

みんなの回答

回答No.5

Word2000はわかりませんが、2002ではWordでもフィルターをかけられます [差し込み印刷]ツールバー上にある[差し込み印刷の宛先]コマンドボタンをクリック ▼顧客 で「A社」を選択します。 ちなみに、(詳細)で並び替えも可能です。 手作業以外はわかりませんでした。m(_ _)m

  • hallo-2007
  • ベストアンサー率41% (888/2115)
回答No.4

>エクセルのオートフィルタで表示はできますが、請求書として印刷したいのです。 エクセルにはフィルターオプションという機能がありますので試してみてください。 http://www.eurus.dti.ne.jp/~yoneyama/Excel/filter3.htm こういった感じ、顧客名が一致したデータをほかのシートに引っ張ってこれます。 ちなみに、添付のようにシートを準備して 請求書のシートの名前のタブを右クリック、コードの表示 で Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$A$3" Then Sheets("売上データ").Columns("A:D").AdvancedFilter Action:=xlFilterCopy, _ CriteriaRange:=Range("A2:A3"), CopyToRange:=Range("B6:D6"), Unique:=False End If End Sub を貼り付けて顧客名を変更してみてください もし、罫線の処理を加えると以下の感じになります。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$A$3" Then Range("B7:D" & Range("B65536").End(xlUp).Row).Select Selection.Borders(xlEdgeLeft).LineStyle = xlNone Selection.Borders(xlEdgeTop).LineStyle = xlNone Selection.Borders(xlEdgeBottom).LineStyle = xlNone Selection.Borders(xlEdgeRight).LineStyle = xlNone Selection.Borders(xlInsideVertical).LineStyle = xlNone Selection.Borders(xlInsideHorizontal).LineStyle = xlNone Sheets("売上データ").Columns("A:D").AdvancedFilter Action:=xlFilterCopy, _ CriteriaRange:=Range("A2:A3"), CopyToRange:=Range("B6:D6"), Unique:=False Range("B7:D" & Range("B65536").End(xlUp).Row).Select With Selection.Borders(xlEdgeLeft) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With With Selection.Borders(xlEdgeTop) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With With Selection.Borders(xlEdgeRight) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With With Selection.Borders(xlInsideVertical) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With With Selection.Borders(xlInsideHorizontal) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With End If End Sub

take103
質問者

お礼

ご回答ありがとうございます。マクロを理解するために勉強してみます。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.3

下記はエクセルの応用として書いてます。ワードの差込印刷は関係ない 方法です。 私なら始から終わりまでエクセルVBAで考える。しかし VBAを出来ない人に、避けられない最小限のVBAの使用でやってみる。 記述に微妙な所があるので、頭のクリアなときにじっくり 読んで、このやり方で、そうする理由などを理解してください。 下記は、私の考え方であって、WEBや解説書では類似の記述は無いと思います。 多にも色々なやり方があるが、VBAの使用を最小限にという事で下記が 出てきました。 まず基本は指定会社のデータの抜き出しです。これを自称imogasi方式という方式で 1社分を別シートに抜き出します。このシートは納品書シートになります。 それを1社分ずつVBAで印刷します。 ーー (1)抜き出し準備過程 例データ Sheet1 A1:D9 社名 商品 個数 価格 作業列 社名 A社 商品X1 10個 100円 A社 A社 商品X2 5個 150円 B社 A社 商品X3 6個 60円 C社 B社 商品X1 12個 360円 B社 商品X3 22個 440円 B社 商品X4 8個 240円 C社 商品X5 12個 120円 1 C社 商品X6 7個 35円 2 F列の社名は、データーフィルターフィルタオプションの設定で 抽出先をF1:F9に指定し、「重複するレコードは無視する」に チェックを入れて、手操作する。 社名について、F列に、ダブリが無く漏れが無い社名が作れる。 E列の作業列は、Sheet2のB3に指定した社名と同じ行の データに上から連番を振る。 式は F2に =IF(A2=Sheet2!$B$3,MAX($E$1:E1)+1,"") ト入れて下方向に式を複写する。 Sheet2のB3セルがC社の場合上のようになる。 ーーー (2)抜き出し過程 Sheet2で 納品書 <--不動文字 A社 御中   <--A社はプログラムでセット 社名 商品 個数 価格 <--不動文字 A社 商品X1 10 100円 A社 商品X2 5 150円  <--関数でSheet1よりセット A社 商品X3 6 60円 計 310円  <--関数計算 計は不動文字 不動文字のところは手操作で入れておきます。 罫線、フォント種類、サイズ、表示形式などは人手の操作で設定しておく。 B6の式は =IF(ROW()-5>MAX(Sheet1!$E$1:$E$100),"",INDEX(Sheet1!$A$1:$D$100,MATCH(ROW()-5,Sheet1!$E$1:$E$100,0),COLUMN()-1)) この式を右方向にE列まで式複写。 B6:E6の式を10行分下方向に式を複写する(以上がimogasi方式) ーーー (3)印刷過程 標準モジュールに Sub test01() d = Worksheets("Sheet1").Range("F1000").End(xlUp).Row 'F列の最終行を取得 For i = 2 To d 'gai2行目からF列最終行まで毎行で繰り返し '--Sheet1のF列からSheet2のB3セルに社名を順次1づつセット Worksheets("Sheet2").Cells(3, "B") = Worksheets("Sheet1").Cells(i, "F") '--Sheet2のA1:F18を印刷 Worksheets("Sheet2").Range("A1:F18").PrintOut '--変わるセル範囲をクリア Worksheets("Sheet2").Range("B61:E15").ClearContents Next i End Sub 実行すると、A社、B社、C社が1枚ずつ3枚に印刷された(確認済み)。 ーー 問題点は10社(Sheet2での想定行数)以上の明細がある場合ですが、複雑になるので 考慮してません。 -- エクセルを仕事に利用しようとすると、VBAに熟達している必要があるというのが、私の持論です。 何度質問しようと、VBAが出来ないと旨く行かない(旨い回答は出ない)と思う。勉強するしかない。 ーー imogasi方式は、関心があれば、Googleででも「imogasi方式」で照会してください。どういう背景で出てきたものか判ります。

take103
質問者

お礼

ご回答ありがとうございます。マクロを理解するために勉強してみます。

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.2

回答No1です。 顧客名で絞り込むということは当然行数が変わってもよいことになりますね。 一度試験されているのでしょうか?

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.1

差し込み印刷を設定する操作で宛先の選択ではエクセルのシートを選択するわけですがそこでは「顧客名」の項目で「A社」などと絞り込みができますので、その機能を使うことで対応することができるでしょう。

take103
質問者

補足

ご回答ありがとうございます。顧客により、データの行数が異なるので差込では対応が難しいのでしょうか?

関連するQ&A