広告

【VBA】【請求書自動印刷システム】2日目 ミニ請求書印刷システム

2022.10.10更新

【VBA】【請求書自動印刷システム】のタイトル画像になります

ExcelVBAを使って請求書一覧からデータを読み取り一気に印刷する自動印刷システムを作っていきます。

請求書自動印刷システム作りを通してExcelVBAを使用する前提でのマスターデータの作り方、大量なデータの一括処理方法、その時々によって個数が変化するデータの取り扱い方などを学んでいきます。

「ExcelVBAでプログラミング入門」の応用編になりますので、まだ終えてない方はそちらを先にご覧ください。

ミニ請求書印刷システム

手始めに見た目などは無視して必要最低限のデータを移し替えて印刷するというだけのプログラムを書いてみたいと思います。

今回はこちらのデータを使って

ミニ請求書印刷システムに使う元データの画像です

こちらのミニ請求書の

ミニ請求書の画像になります

データを書き換えて印刷をするというトコロまでをやっていきます。

元データの個数を数える

まずは「Do While」を使ってデータの個数を数えてみます。

■2日目 プログラム1■


'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

■実行結果■

「Do While」を使ってデータの個数を数えた結果の画像になります

■説明■

「Cells(count,1)」のデータが空白になるまで繰り返しをする事によってデータの個数を知る事ができます。

この場合は空白セルの部分でカウントが止まりますので題名の分と合わせて「-2」する事によってデータの個数がわかりますね!

データの個数分データを移し替えて印刷する

データの個数がわかれば何回印刷すればよいのかもわかりますので、ただいま得た情報を使ってデータの個数分データを移し替えて印刷してみたいと思います。

移し替える先のセル「会社名→sheet2のA2セル」・「請求金額→sheet2のA3セル」こちらを頭に入れておきましょう。

こんなしょうもないデータが印刷されても困るので今回は印刷プレビューを表示したいと思います。

■2日目 プログラム2■


'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

■実行結果■

VBAから印刷プレビューを表示させてみた結果の画像になります

■説明■

なんとなくデータの移し替え、プレビューを表示するトコロまでできました。


Worksheets("sheet2").Range("A2").Value = _
			Worksheets("sheet1").Cells(i + 1,1).Value

データ移し替えのループで使っている変数「i」をそのまま使うと「題名」から移し替えてしまうので「i + 1」にするトコロがポイントです。

エラー対策

先ほどのプログラムだと元のデータをいっぱいにした時最後の「合計」欄まで印刷されてしまうかも・・・、と気づいたアナタはプログラミングに向いているかもしれません。

ちなみにこのような状態です。

「Do While」を使ってデータの個数を数えた時に発生しそうなエラーの説明画像1になります

実際にやってみましょう。

「Do While」を使ってデータの個数を数えた時に発生しそうなエラーの説明画像2になります

最後の「合計」欄まで移し替えてしまいました!

これでは欠陥システムになってしまうのでさっそくエラー対策を加えます。

■2日目 プログラム3■


'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

■実行結果■

「Do While」を使ってデータの個数を数えた時に発生しそうなエラーを対策した結果画像になります

■説明■

今度はうまくいきました!

いくつか方法があると思いますが今回はシンプルに


If Worksheets("sheet1").Cells(i + 1,1).Value = "合計" Then
	Exit For
End If

「For」の頭で「合計」欄まで来ていたら「Exit For」でループを抜けるみたいな一文を加えてエラー対策をしてみました。

広告

プログラムを簡潔に書く

ここまで順序だてて説明してきましたが、実はこちらのプログラムの下部の「For」文はまるごと省略する事ができます。

■2日目 プログラム4■


'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

■実行結果■

プログラムの省略のやり方の説明画像になります

■説明■

下の部分をまるっと省略する事ができましたね!

ちょっとまどろっこしい手順を踏んでしまいましたが、最初のウチは少しずつ間違いのないように組み立てていって、キチンと動くプログラムができたらムダを省いていくのがいいと思います。

ここまでの中間ソースになります。

中間ソース1

それでは骨組みは完成したので次回はカタチを整えて完成させましょう!

次回

【VBA】【請求書自動印刷システム】3日目(最終日) 品目部分の移し替え

広告

Copyright 2016 K.N/petitetech.com