広告
ExcelVBAを使って請求書一覧からデータを読み取り一気に印刷する自動印刷システムを作っていきます。
請求書自動印刷システム作りを通してExcelVBAを使用する前提でのマスターデータの作り方、大量なデータの一括処理方法、その時々によって個数が変化するデータの取り扱い方などを学んでいきます。
「ExcelVBAでプログラミング入門」の応用編になりますので、まだ終えてない方はそちらを先にご覧ください。
手始めに見た目などは無視して必要最低限のデータを移し替えて印刷するというだけのプログラムを書いてみたいと思います。
今回はこちらのデータを使って
こちらのミニ請求書の
データを書き換えて印刷をするというトコロまでをやっていきます。
まずは「Do While」を使ってデータの個数を数えてみます。
'2日目 プログラム1 Sub my_print_seikyusyo() Dim count As Integer count = 1 Do While Worksheets("sheet1").Cells(count,1).Value <> "" count = count + 1 Loop MsgBox "count = " & count MsgBox "データの個数 = " & (count - 2) End Sub
「Cells(count,1)」のデータが空白になるまで繰り返しをする事によってデータの個数を知る事ができます。
この場合は空白セルの部分でカウントが止まりますので題名の分と合わせて「-2」する事によってデータの個数がわかりますね!
データの個数がわかれば何回印刷すればよいのかもわかりますので、ただいま得た情報を使ってデータの個数分データを移し替えて印刷してみたいと思います。
移し替える先のセル「会社名→sheet2のA2セル」・「請求金額→sheet2のA3セル」こちらを頭に入れておきましょう。
こんなしょうもないデータが印刷されても困るので今回は印刷プレビューを表示したいと思います。
'2日目 プログラム2 Sub my_print_seikyusyo() Dim count As Integer Dim i As Integer count = 1 Do While Worksheets("sheet1").Cells(count,1).Value <> "" count = count + 1 Loop For i = 1 To (count - 2) Worksheets("sheet2").Range("A2").Value = _ Worksheets("sheet1").Cells(i + 1,1).Value Worksheets("sheet2").Range("A3").Value = _ Worksheets("sheet1").Cells(i + 1,2).Value Worksheets("sheet2").PrintPreview Next End Sub
なんとなくデータの移し替え、プレビューを表示するトコロまでできました。
Worksheets("sheet2").Range("A2").Value = _ Worksheets("sheet1").Cells(i + 1,1).Value
データ移し替えのループで使っている変数「i」をそのまま使うと「題名」から移し替えてしまうので「i + 1」にするトコロがポイントです。
先ほどのプログラムだと元のデータをいっぱいにした時最後の「合計」欄まで印刷されてしまうかも・・・、と気づいたアナタはプログラミングに向いているかもしれません。
ちなみにこのような状態です。
実際にやってみましょう。
最後の「合計」欄まで移し替えてしまいました!
これでは欠陥システムになってしまうのでさっそくエラー対策を加えます。
'2日目 プログラム3 Sub my_print_seikyusyo() Dim count As Integer Dim i As Integer count = 1 Do While Worksheets("sheet1").Cells(count,1).Value <> "" count = count + 1 Loop For i = 1 To (count - 2) If Worksheets("sheet1").Cells(i + 1,1).Value = "合計" Then MsgBox "合計まで来たのでループを抜けます" Exit For End If Worksheets("sheet2").Range("A2").Value = _ Worksheets("sheet1").Cells(i + 1,1).Value Worksheets("sheet2").Range("A3").Value = _ Worksheets("sheet1").Cells(i + 1,2).Value Worksheets("sheet2").PrintPreview Next End Sub
今度はうまくいきました!
いくつか方法があると思いますが今回はシンプルに
If Worksheets("sheet1").Cells(i + 1,1).Value = "合計" Then Exit For End If
「For」の頭で「合計」欄まで来ていたら「Exit For」でループを抜けるみたいな一文を加えてエラー対策をしてみました。
広告
ここまで順序だてて説明してきましたが、実はこちらのプログラムの下部の「For」文はまるごと省略する事ができます。
'2日目 プログラム4 Sub my_print_seikyusyo() Dim count As Integer count = 1 Do While Worksheets("sheet1").Cells(count + 1,1).Value <> "" If Worksheets("sheet1").Cells(count + 1,1).Value = "合計" Then Exit Do End If Worksheets("sheet2").Range("A2").Value = _ Worksheets("sheet1").Cells(count + 1,1).Value Worksheets("sheet2").Range("A3").Value = _ Worksheets("sheet1").Cells(count + 1,2).Value Worksheets("sheet2").PrintPreview count = count + 1 Loop End Sub
下の部分をまるっと省略する事ができましたね!
ちょっとまどろっこしい手順を踏んでしまいましたが、最初のウチは少しずつ間違いのないように組み立てていって、キチンと動くプログラムができたらムダを省いていくのがいいと思います。
ここまでの中間ソースになります。
それでは骨組みは完成したので次回はカタチを整えて完成させましょう!
広告
Copyright 2016 K.N/petitetech.com