エクセルで領収書を作成します。
ユーザーフォームのVBAを使って印刷全体をコントロールできるようにします。
今回がこのテーマの記事の最終回となります。
こんにちは、じゅんぱ店長(@junpa33)です。
今回は、領収書印刷をコントロールするためのパネル(ユーザーフォーム)作成と設定を行います。
このテーマ(領収書の作成)については、今回の記事が最終回となります。
これまでの流れについては、先の記事でご確認いただけます。
<<<一つ前の記事を読み返す<<<
領収書作成についての関連記事はこちらになります。
コンテンツ
印刷をコントロールするユーザーフォームのデザイン
作成して、印刷していくための操作ボタンを設置したコントロールパネルを作っていきます。
コントロールパネルは、タブによるページ切り替えで、単独印刷画面と連続印刷画面を表示できるようにします。
それでは、
作業ごとに区切りながら説明していきます。
ユーザーフォームを表示する
VBEからユーザーフォームボタンをクリック
すると、このような感じになります。
この”User form”で作業していきますが、適宜 拡大縮小をしてください。
ユーザーフォームの表示のタイミングを設定をする
”発行データ入力シート”での作業の時に使用しますので、その時に表示されているようにします。
「印鑑を自動で挿入」の記事で解説したことと同様に、
”発行データ入力シート”がアクティブの時に表示される設定とします。
シートモジュール(発行データ入力のシートモジュール)に記述します。
コード⑨
Private Sub Worksheet_Activate()
If コントロールパネル.Visible Then Exit Sub
コントロールパネル.Show vbModeless
End Sub
このように記述してください。
コントロールパネルの”発行日入力窓”設定
まず最初に
”User form”という名称を”コントロールパネル”に変更します。
つぎに
ツールボックスボタンの中の”A のラベルボタン”をおしてタイトル付けをします。
発行年月日を入力できる設定をします。
ツールボックスボタンの中の”ab| のテキストボタン”をおしてテキスト入力ボックスをセットします。
同様に作業を繰り返して、
「(元号)(ねん)年 (つき)月 (にち)日」を完成させてください。
コマンドボタンを配置します。
ツールボックスからコマンドボタン(プッシュ型のボタンマークのもの)を選択してください。
入力した発行日情報をデータ利用するエクセルVBA
ここで使う変数
- 元号の代入先としての変数・・・・Gen
- 年の代入先としての変数・・・・・Nen
- 月の代入先としての変数・・・・・Tuk
- 日の代入先としての変数・・・・・Nit
ここで設定する変数は、このプロジェクトのモジュール間を跨いで利用しますので、変数宣言もそれが可能になる宣言方法で行います。
テキスト入力ボックスに入力したデータをVBAコード化します。
コードの入力ウインドウを開きます。
「日付を入力したときに”日付入力ボタン”をクリックして、データを確定」するコードです。
ユーザーフォームモジュール(コントロールパネルのモジュール)に記述します。
コード⑩
Private Sub 日付入力_Click()
Gen = コントロールパネル.Controls("元号").Value
Nen = コントロールパネル.Controls("ねん").Value
Tuk = コントロールパネル.Controls("つき").Value
Nit = コントロールパネル.Controls("にち").Value
End Sub
このようになります。
次に変数の宣言のためのコードを記述します。
コードの設置場所は”標準モジュール”に記述した”コード①”の上 一番最初です。そこに置いてください。
関連記事
コード⑪
Public Gen As String
Public Nen As Variant
Public Tuk As Variant
Public Nit As Variant
このようになります。
さらに、コード②の中にコード⑫を設置します。設置場所に注意ください。
aR = ActiveCell.Row
の下に設置してください。
これで発行日の和暦を表示します。
”元号” の部分は、「平成」でも「令和」でもOKです。
コード⑫
If Nen = "" Then Nen = " "
If Tuk = "" Then Tuk = " "
If Nit = "" Then Nit = " "
Range("B" & aR).Value = Gen & Nen & "年" & Tuk & "月" & Nit & "日"
Range("H" & aR).Value = "済"
このようになります。
タブで変わるページを設置する
1件毎選択して印刷していくボタンを設置します。
マルチページの設置方法についてはこちら↓の記事でも確認していただけます。
まず、ツールボックスの”マルチページ”ボタンを選択してタブでページ切り替えができるようにします。
先ほど作成した「コントロールパネル」の「日付入力」ボタンの下に設置してください。
このような感じです。
次に、タブの文字を大きくハッキリ表示させます。
プロパティの選択で”MultiPage1”をプルダウンメニューから選択します。
”Font”のところで文字のスタイルを変更してください。
”Page1”を「連続印刷」
”Page2”を「単独印刷」 とタイプしてください。
ユーザーフォームで印刷をコントロールするVBAコード作成
ユーザーフォーム上に単独印刷と連続印刷の2種類のコントロールページを作ります。
単独印刷ページをつくる
ここで使う変数
- 印刷指定のため選択したセルの行番号・・・・aR
- 印刷指定した宛先名・・・・・・・・・・・・PVa
それでは次に単独印刷のために必要な項目を設定していきます。
作業の流れ
まず”ラベル”を4つ設置します。
先ほどと同じように、ツールボックスボタンの中の”A のラベルボタン”をおしてラベルを付けます。
- Caption 「一件づつ印刷をする場合の設定をします。」
(オブジェクト名)一件づつ印刷 文字色はForeColorで選択できます。 - Caption 「印刷対象宛名」
(オブジェクト名)印刷対象宛名 - Caption 「宛名をクリックすると最新に更新します。」
(オブジェクト名)宛名をクリック 文字色はForeColorで選択できます。 - Caption 「印刷宛名」
(オブジェクト名)印刷宛名 文字色はForeColorで選択できます。 ボックスの色はBackColorで選択できます。
コマンドボタンを配置します。
ツールボックスからコマンドボタン(プッシュ型のボタンマークのもの)を選択してください。
- Caption 「印刷スタート」
(オブジェクト名)一件印刷
このような感じで仕上げてください。カラーリングは適宜設定されたらと思います。
ラベル部分のコード設定
ラベル「宛名をクリックすると最新に更新します。」を実行するコードを記述します。
4のラベルのところでクリックすると今印刷される宛先が表示されるというコードです。
”印刷宛名”の表示部分を”ダブルクリック”するとコードウインドが表示されますので、そこに記入してください。
ユーザーフォームモジュール(コントロールパネルのモジュール)での記述になります。
コード⑬
Private Sub 印刷宛名_Click()
宛名確認
End Sub
と記述してください。
つぎに”宛名確認”のマクロ(VBA)を標準モジュール(module1)に記述します。
コード⑭
Sub 宛名確認()
Dim PVa As String
Worksheets("発行データ入力").Select
aR = ActiveCell.Row
PVa = Range("D" & aR).Value
コントロールパネル.印刷宛名.Caption = PVa
End Sub
このようになります。
印刷スタートボタンの起動設定
「印刷スタート」ボタンの設置をしていきます。
先ほどと同じように、「印刷スタート」ボタンをダブルクリックするとコードウインドが開きます。
ユーザーフォームモジュール(コントロールパネルのモジュール)での記述になります。
このように記述してください。
コード⑮
Private Sub 一件印刷_Click()
一件を印刷
End Sub
”一件を印刷”のマクロ(VBA)を標準モジュール(module1)に記述します。
コード⑯
Sub 一件を印刷()
領収書作成
Worksheets("領収書").PrintOut from:=1, To:=2, Preview:=True
Worksheets("発行データ作成").Select
End Sub
”印刷スタートボタン”を押すと印刷プレビュー画面が表示されるようになります。
プレビューを確認したうえで印刷するような設定です。
印刷するときはプレビュー画面上の「印刷」をクリックしてください。
これで単独印刷の設定は完了です。
連続印刷ページをつくる
ここで使う変数
- コントロールパネルで印刷を指定した始点番号・・・・STA
- コントロールパネルで印刷を指定した終点番号・・・・STO
- 印刷指定した始点のデータがあるセルの行番号・・・・Arow
- 印刷指定した終点のデータがあるセルの行番号・・・・Orow
- 印刷指定の始点・終点番号の入力エラーに番号を付与・ErrNo
- メッセージボックスからの返答を代入する変数・・・・rea
ここで使う関数・メソッド
- 印刷指定された支店・終点番号を探す関数・・・・Match
- ユーザーからの返答を動作に反映させる関数・・・MsgBox
次に連続印刷のために必要な項目を設定していきます。
一連の作業
先ほどと同様に作業します。
”ラベル”を4つ設置します。
先ほどと同じように、ツールボックスボタンの中の”A のラベルボタン”をおしてラベルを付けます。
- Caption 「連続して印刷をする場合の設定をします。」
(オブジェクト名)連続印刷 文字色はForeColorで選択できます。 - Caption 「伝票番号 開始番号」
(オブジェクト名)開始番号 - Caption 「伝票番号 終了番号」
(オブジェクト名)終了番号 文字色はForeColorで選択できます。 - Caption 「入力番号確認」
(オブジェクト名)番号確認 文字色はForeColorで選択できます。 ボックスの色はBackColorで選択できます。
伝票番号を入れるテキストボックスを設置します。
ツールボックスボタンの中の”ab| のテキストボタン”をおしてテキスト入力ボックスをセットします。
- 開始番号のテキストボックス
(オブジェクト名)伝票番号始点 - 終了番号のテキストボックス
(オブジェクト名)伝票番号終点
コマンドボタンを配置します。
ツールボックスからコマンドボタン(プッシュ型のボタンマークのもの)を選択してください。
- Caption 「入力確認」
(オブジェクト名)入力確認ボタン - Caption 「印刷開始」
(オブジェクト名)印刷開始
このような感じになります。
連続印刷の伝票番号チェックVBAコード
コントロールパネルのコードウインドに以下のコードをタイプしてください。
“入力確認ボタン”を押したときの動きを指示しています。始点終点の伝票番号を入力しているかいないかの条件分岐をしています。
そのあと「領収書連続印刷準備」というマクロでmoduleウインドに移ります。
コントロールパネルのコードウインドに記述します。
ユーザーフォームモジュール(コントロールパネルのモジュール)での記述になります。
コード⑰
Private Sub 入力確認ボタン_Click()
If コントロールパネル.Controls("伝票番号始点").Value = "" Then
MsgBox "印刷開始伝票番号がありません。", vbOKOnly, "メッセージ"
Exit Sub
End If
If コントロールパネル.Controls("伝票番号終点").Value = "" Then
MsgBox "印刷終了伝票番号がありません。", vbOKOnly, "メッセージ"
Exit Sub
End If
コントロールパネル.番号確認.Caption = Me.伝票番号始点.Value & "から" & Me.伝票番号終点.Value & "まで印刷します。"
領収書連続印刷準備
End Sub
”moduleウインド”の一番上に 追加で変数の定義を行います。
標準モジュール(Module1)の一番最初に記述します。
コード⑱
Public STA As Long
Public STO As Long
Public Arow As Variant
Public Orow As Variant
Public ErrNo As Long
次に「領収書連続印刷準備」というプロシージャーを記述します。
標準モジュール(Module1)に記述します。
始点終点番号の正誤をチェックするコードです。
コード⑲
Sub 領収書連続印刷準備()
ErrNo = 0
STA = コントロールパネル.伝票番号始点.Value
STO = コントロールパネル.伝票番号終点.Value
Worksheets("発行データ入力").Select
On Error GoTo Err_trap1
Arow = WorksheetFunction.Match(STA, Range("A:A"), 0)
On Error GoTo Err_trap2
Orow = Application.WorksheetFunction.Match(STO, Range("A:A"), 0)
If Arow > Orow Then
MsgBox "伝票番号は昇順で指定してください。", vbYes, "メッセージ"
Exit Sub
End If
Exit Sub
Err_trap1:
MsgBox "印刷開始伝票番号が存在していません。", vbYes, "メッセージ"
コントロールパネル.伝票番号始点.Value = ""
コントロールパネル.伝票番号終点.Value = ""
ErrNo = 1
Exit Sub
Err_trap2:
MsgBox "印刷終了伝票番号が存在していません。", vbYes, "メッセージ"
コントロールパネル.伝票番号始点.Value = ""
コントロールパネル.伝票番号終点.Value = ""
ErrNo = 1
End Sub
このようになります。
印刷スタートボタンを設定します。
コントロールパネルのコードウインドに以下のコードを記述してください。
このコードはメッセージウインドウを出してチェックを促します。
ユーザーフォームモジュール(コントロールパネルのモジュール)での記述になります。
コード⑳
Private Sub 印刷開始_Click()
rea = MsgBox("印刷を始めますか?", vbYesNo + vbQuestion + vbDefaultButton2, "メッセージ")
If rea = vbNo Then Exit Sub
If コントロールパネル.Controls("伝票番号始点").Value = "" Then
MsgBox "印刷開始伝票番号がありません。", vbOKOnly, "メッセージ"
Exit Sub
End If
コントロールパネル.番号確認.Caption = Me.伝票番号始点.Value & "から" & Me.伝票番号終点.Value & "まで印刷します。"
If コントロールパネル.Controls("伝票番号終点").Value = "" Then
MsgBox "印刷終了伝票番号がありません。", vbOKOnly, "メッセージ"
Exit Sub
End If
コントロールパネル.番号確認.Caption = Me.伝票番号始点.Value & "から" & Me.伝票番号終点.Value & "まで印刷します。"
領収書連続印刷実行
End Sub
次に「領収書連続印刷実行」というマクロを”moduleウインド”に記述します。
標準モジュール(Module1)に記述します。
コード㉑
Sub 領収書連続印刷実行()
領収書連続印刷準備
If ErrNo = 1 Then Exit Sub
For n = Arow To Orow
Worksheets("発行データ入力").Select
Range("A" & n).Select
領収書作成
Worksheets("領収書").PrintOut from:=1, To:=2
Next n
Worksheets("発行データ入力").Selectコントロールパネル.伝票番号始点.Value = ""
コントロールパネル.伝票番号終点.Value = ""
End Sub
連続印刷については、”印刷スタート”ボタンを押すと、印刷プレビュー画面なしに、すぐに印刷が始まります。
印刷プレビュー画面を表示すると、動作がすべて一旦停止してしまうので、連続にならないからです。
以上でVBAコード記入作業は終わりです。
お疲れさまでした。
ユーザーフォーム全体の見栄えをチェックします。
これで入力したデータがすべて領収書テンプレートに表示されるようになりました。
最後に領収書テンプレートの文字サイズや文字の配置を整えて、見栄えをチェックしてください。
VBAでこれらの表示設定のセットはすべて可能ですが、ここはセルの書式設定を使ったほうが速くて簡単です。
発行先名 文字の大きさ14
領収金額 文字の大きさ14で太字
内訳金額 配置を右詰め
他にも気になるところは適宜 設定変更してください。
ユーザーフォームのVBAで印刷をコントロールのまとめ
これでオリジナルな領収書の作成方法の解説は終了です。
”発行データ入力シート”のセルには数式などは全く入っていませんので、データはそのまま加工利用することがでます。
記述しましたコードをご利用に応じてカスタマイズして、さらに自分なりに使いやすくしてください。
一応 完成品のエクセル「領収書作成.xlsm」をダウンロードできるようにしています。
ダウンロードで入手できるものは、VBAマクロの保護をしていますので、改変することはできません。
入手先はこちらへ
[ダウンロードが見つかりません]
このソフトはご自分で業務でお使いいただくのはフリーですが、
転載や転売については許可しておりませんので、ご使用にならないよう固くお断りいたします。
最初から記事を読み返す。<<<
無料ダウンロード 領収書発行ソフト。VBAで自作方法紹介も【テンプレート編】
短期間でエクセルVBAの独学習得を目指したいなら
エクセルVBAを独学する独習方法は、学習者それぞれ十人十色、多種多様と思われます。
けれども、
出来るだけ効率よく学習するためには、いくつかの大切なポイントがあります。
独学でもVBA習得の中級クラスに達するのはそんなに難しいことではありません。
先人が行った勉強方法をあなたがそのまま利用すればよいということです。
独習のための大切な7つのポイントは、上記記事にて解説しています。
独習によるVBA習得のキーワードは、
出来るだけ多くの実例に触れること!
です。
正直、VBAの学習について自分の周りの仕事(業務)からだけ実例を得るのでは効率良い習熟は無理です。
ハッキリ言って、
本当に短い期間でVBA習得を成功させたいなら、今使っている参考書が良書かどうかを判断し、新ツールとしてオンライン学習も取り入れて行うことが、
手っ取り早く短期間習得できるというのは間違いないでしょう。
業務効率UPのためにエクセルVBAを使いだして、始めのうちに知っておきたい内容を記事にしています。
実際のご利用上において、
A6の用紙の準備方法や出力用として利便性のあるプリンターへの変更など、
実際に使っているものがありますので、参考にしていただける記事を載せておきます。