• 締切済み

納品書をExcelVBAで作成したいです。

初めて質問いたします。 ExcelVBAマクロで納品書を作成使用と思っております。 シートは納品一覧というシートとSetting(開始行を設定するシート)と納品書の雛形シートの3つがあります。 納品一覧シートに納品書番号、発行日、納品日、販売店、商品、重量、数量、単価、金額(金額は自動計算)を入力。 Seettingシートは開始行と使用済み納品書番号(使用済み番号は自動で入ります。) 納品書雛形はA5サイズで9品まで表示することができます。 下記のようなコードを作成しましたが、ご質問したい事があります。 Option Explicit Const Maxrow = 10000 '共通変数定義 Public wsData As Worksheet '納品データを入れる変数 Public wsRiminder As Worksheet '納品書雛形 Public wsSetting As Worksheet 'セッティング用シート Public RowsData As Long '納品データの行 Public NouhinNum As Long '納品書番号 Public r, rr, r1, r2, r_to As Integer 'for文用カウンター Public previousCilient As String Public clientname As String 'シート初期化 Sub clear_Sheet() wsRiminder.Rows("15:23").Hidden = False '隠れている行を再表示する。 wsRiminder.Range("B15:X23").Value = "" '納品書の項目、数量、単価の部分を初期化 End Sub Sub Copy_Sheet() wsRiminder.Copy before:=wsRiminder '納品書雛形をコピーする ActiveSheet.Name = NouhinNum 'シート名を納品番号にする。 Set wsRiminder = ActiveSheet 'シートをコピーすると新しくできたシートがアクティブになる。 End Sub Sub Create_Riminder(r1, r2) '請求書作成 wsRiminder.Cells(2, 30).Value = NouhinNum '納品書番号 wsRiminder.Cells(3, 30).Value = wsData.Cells(r1, 2).Value '発行日 wsRiminder.Cells(4, 30).Value = wsData.Cells(r1, 3).Value '納品日 wsRiminder.Cells(6, 1).Value = wsData.Cells(r1, 4).Value '顧客名 r_to = 15 '納品書の項目名の最初の行番号 For r = r1 To r2 With wsRiminder .Cells(r_to, 2).Value = wsData.Cells(r, 5).Value '商品名 .Cells(r_to, 20).Value = wsData.Cells(r, 6).Value '重量 .Cells(r_to, 24).Value = wsData.Cells(r, 7).Value ' 数量 .Cells(r_to, 28).Value = wsData.Cells(r, 8).Value '単価 r_to = r_to + 1 End With Next wsData.Cells(r2, 10).Value = "済" End Sub Sub Createlist_Riminder(r1, r2) '請求書の項目の部分のみ作成 For r = r1 To r2 With wsRiminder .Cells(r_to, 2).Value = wsData.Cells(r, 5).Value '商品名 .Cells(r_to, 20).Value = wsData.Cells(r, 6).Value '重量 .Cells(r_to, 24).Value = wsData.Cells(r, 7).Value ' 数量 .Cells(r_to, 28).Value = wsData.Cells(r, 8).Value '単価 r_to = r_to + 1 End With Next wsData.Cells(r2, 10).Value = "済" End Sub Sub Process_Riminder() Dim BlnRtn As Boolean Set wsData = ActiveWorkbook.Worksheets("納品一覧") Set wsSetting = ActiveWorkbook.Worksheets("Setting") Set wsRiminder = ActiveWorkbook.Worksheets("納品書雛形") RowsData = wsData.Cells(Rows.Count, 2).End(xlUp).Row 'リストの最終行番号を取得 NouhinNum = wsSetting.Cells(2, 1).Value 'for文用カウンターの定義(r1=2行目から始める,r2はリストの行数) r1 = wsSetting.Cells(2, 1).Value r2 = r1 + 1 Do While Len(Trim(wsData.Cells(r1, 4).Value)) <> 0 And wsData.Cells(r1, 9).Value <> "済" '会社名が空欄ではない場合ループする previousCilient = wsData.Cells(r1 - 1, 4).Value clientname = wsData.Cells(r1, 4).Value If wsData.Cells(r1, 9).Value <> "済" Then 'リストが作成済みになっていないもの '会社名によって初期設定される雛形シートが違う If wsData.Cells(r1, 1).Value <> wsData.Cells(r1 - 1, 1).Value Then '納品書番号が次の行と違うとき NouhinNum = wsData.Cells(r1, 1).Value For r = r1 To r2 - 1 Call clear_Sheet '雛形シートを初期化 現在の納品書の雛形ですと9品までしか表示できないので 9品以上ある場合は別途納品内訳書というシートを作成してそこに商品名、重量、数量、単価、金額を表示するようにしたいのですが、どのように組めばいいかイメージがわきません。 どうかお力添えいただけないでしょうか。

この投稿のマルチメディアは削除されているためご覧いただけません。

みんなの回答

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

こんな長いVBAコードを質問コーナーに載せて、読者は読んでどうせよというのか。 会社の業務なのだから、本来システム設計の会社に相談すべきようなことだ。 もっとどうしたいのか文章で伝えるべきでしょう。 もっと構想(帳票設計)段階の問題だろう。 下記案ではどうですか。後続の回答者の参考のために、質問に補足したほうがよいと思う。 帳票というものは記載件数(行数)に限度があり、10件前後しか記載できないのは当たり前。 だからそんなことは覚悟して、超えたら別葉に印刷するのが当たり前だろう。 ーー ただ別途納品内訳書を作ると、様式も、印字作業も、封入作業も、プログラムも2種類になりすっきりしないのではないか。 9件(行)を超えたら、プログラムで察知できるのだから、1ページ印刷(PrintOut)して、印刷エリアデータをクリアし、ページ数を+1する。、納品先は同じ。行ポインターは 最初行へセット。 請求書を1枚ずつ、切り離した後は、同名請求先の複数ページ分の請求者はまとめて(この作業は必要)は同じ封筒に封入する。 その際、帳票が続きで出るように、データを納品先でソートしたものを使えばよい。 1枚のシートに、何枚もの納品書を詰め込んで設計している場合は、データをセットするロジックがやや複雑になるが大したことはない。 ーー >Seettingシートは開始行と使用済み納品書番号( がなぜ必要なのか理解できなかった。 ユーザーフォームで聞くとか、最低MessageBoxで聞けば済むのではないのか。

noname#211938
質問者

補足

回答ありがとうございます。 申し訳ございません。 以前別の質問をした時に、ソースコードもわからないのにイメージだけで回答はできないとの回答をいただいたことがあり、 その時の回答者様のとおり長いソースコードを載せてしまいました。 このプログラムは個人で作成しています。 用途は友人からの依頼なので私も帳票関係は詳しくなく、友人のイメージをただエクセルで完結するように起こしただけです。 画像の帳票もネットにあるテンプレートです。 メッセージボックスが出ることを好まない方なのでメッセージボックスは極力使うなと言われています。 そのためのセッティングシートです。 やはり帳票は行数の限界があるんですね。 プログラミングは授業で習った程度と個人で簡単に使う程度しか組んだことしかありません。 友人ともう一度帳票をしっかり勉強して再度質問したいと思います。 ありがとうございました。

回答No.1

> 9品以上ある場合は別途納品内訳書というシートを作成してそこに > 商品名、重量、数量、単価、金額を表示するようにしたい やりたいことはわかっているのですよね? 何がわからないのか伝えないと、回答得られませんよ。

noname#211938
質問者

補足

やりたいことはわかっているのですが、プログラムとしてそう組めばいいかがわからないのですがそういう時はどう伝えたらいいのでしょうか。

関連するQ&A