ユーザーフォームのVBAで領収書の印刷をコントロールする方法

ryousyu_userformeyecatcha

エクセルで領収書を作成します。

ユーザーフォームのVBAを使って印刷全体をコントロールできるようにします。
今回がこのテーマの記事の最終回となります。

 

こんにちは、じゅんぱ店長(@junpa33)です。

 

今回は、領収書印刷をコントロールするためのパネル(ユーザーフォーム)作成と設定を行います。

このテーマ(領収書の作成)については、今回の記事が最終回となります。

 

これまでの流れについては、先の記事でご確認いただけます。

 

<<<一つ前の記事を読み返す<<<

エクセルVBA 領収書の金額をオシャレに表示するコツ。

 

領収書作成についての関連記事はこちらになります。

「領収書作成」の記事一覧を開く

 

印刷をコントロールするユーザーフォームのデザイン

 

MEMO
領収書作成のエクセルVBA全コードを確認することが出来ます。

オリジナルな領収書作成のエクセルVBA モジュール記述の全コード集

 

作成して、印刷していくための操作ボタンを設置したコントロールパネルを作っていきます。

コントロールパネルは、タブによるページ切り替えで、単独印刷画面と連続印刷画面を表示できるようにします

 

それでは、

作業ごとに区切りながら説明していきます。

 

ユーザーフォームを表示する

 

VBEからユーザーフォームボタンをクリック

contpanel001a1

 

すると、このような感じになります。

contpanel002a1

 

この”User form”で作業していきますが、適宜 拡大縮小をしてください。

 

ユーザーフォームの表示のタイミングを設定をする

 

”発行データ入力シート”での作業の時に使用しますので、その時に表示されているようにします。

 

「印鑑を自動で挿入」の記事で解説したことと同様に、

”発行データ入力シート”がアクティブの時に表示される設定とします。

シートモジュール(発行データ入力のシートモジュール)に記述します。

コード⑨

コード
Private Sub Worksheet_Activate()
  If コントロールパネル.Visible Then Exit Sub
  コントロールパネル.Show vbModeless
End Sub

contpanel017a

このように記述してください。

 

コントロールパネルの”発行日入力窓”設定

 

まず最初に

”User form”という名称を”コントロールパネル”に変更します。

contpanel003a

つぎに

ツールボックスボタンを押してツールを使えるようにします。

contpanel004_1

 

ツールボックスボタンの中の”A のラベルボタン”をおしてタイトル付けをします。

contpanel005a1

 

発行年月日を入力できる設定をします。

ツールボックスボタンの中の”ab| のテキストボタン”をおしてテキスト入力ボックスをセットします。

contpanel006a1

 

同様に作業を繰り返して、

「(元号)(ねん)年 (つき)月 (にち)日」を完成させてください。

contpanel007

 

コマンドボタンを配置します。

ツールボックスからコマンドボタン(プッシュ型のボタンマークのもの)を選択してください。

contpanel009a1

 

入力した発行日情報をデータ利用するエクセルVBA

 

ここで使う変数

  • 元号の代入先としての変数・・・・Gen
  • 年の代入先としての変数・・・・・Nen
  • 月の代入先としての変数・・・・・Tuk
  • 日の代入先としての変数・・・・・Nit

ここで設定する変数は、このプロジェクトのモジュール間を跨いで利用しますので、変数宣言もそれが可能になる宣言方法で行います。

 

テキスト入力ボックスに入力したデータをVBAコード化します。

コードの入力ウインドウを開きます。

 

日付を入力したときに”日付入力ボタン”をクリックして、データを確定するコードです。

ユーザーフォームモジュール(コントロールパネルのモジュール)に記述します。

コード⑩

コード

Private Sub 日付入力_Click()
  Gen = コントロールパネル.Controls("元号").Value
  Nen = コントロールパネル.Controls("ねん").Value
  Tuk = コントロールパネル.Controls("つき").Value
  Nit = コントロールパネル.Controls("にち").Value
End Sub

 

このようになります。

contpanel010a

 

次に変数の宣言のためのコードを記述します。

 

コードの設置場所は”標準モジュール”に記述した”コード①”の上 一番最初です。そこに置いてください。

関連記事

エクセルVBA 変数の適用範囲を宣言方法でコントロールする

 

コード⑪

コード

  Public Gen As String
  Public Nen As Variant
  Public Tuk As Variant
  Public Nit As Variant

 

このようになります。

contpanel011a

 

さらに、コード②の中にコード⑫を設置します。設置場所に注意ください。

CHECK
Worksheets(“発行データ入力”).Select
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 = "済"

 

このようになります。

contpanel016a2

 

タブで変わるページを設置する

 

1件毎選択して印刷していくボタンを設置します。

 

マルチページの設置方法についてはこちら↓の記事でも確認していただけます。

エクセルVBAマルチページ作成。秘密鍵コードで非表示化!

 

まず、ツールボックスの”マルチページ”ボタンを選択してタブでページ切り替えができるようにします。

先ほど作成した「コントロールパネル」の「日付入力」ボタンの下に設置してください。

 

このような感じです。

contpanel013a1

 

次に、タブの文字を大きくハッキリ表示させます。

 

プロパティの選択で”MultiPage1”をプルダウンメニューから選択します。

”Font”のところで文字のスタイルを変更してください。

”Page1”を「連続印刷

”Page2”を「単独印刷」  とタイプしてください。

contpanel014a1

 

ユーザーフォームで印刷をコントロールするVBAコード作成

 

ユーザーフォーム上に単独印刷と連続印刷の2種類のコントロールページを作ります。

単独印刷ページをつくる

 

ここで使う変数

  • 印刷指定のため選択したセルの行番号・・・・aR
  • 印刷指定した宛先名・・・・・・・・・・・・PVa

 

それでは次に単独印刷のために必要な項目を設定していきます。

作業の流れ

 

まず”ラベル”を4つ設置します。

先ほどと同じように、ツールボックスボタンの中の”A のラベルボタン”をおしてラベルを付けます。

  1. Caption 「一件づつ印刷をする場合の設定をします。」
    (オブジェクト名)一件づつ印刷文字色はForeColorで選択できます。
  2. Caption 「印刷対象宛名」
    (オブジェクト名)印刷対象宛名
  3. Caption 「宛名をクリックすると最新に更新します。」
    (オブジェクト名)宛名をクリック文字色はForeColorで選択できます。
  4. Caption 「印刷宛名」
    (オブジェクト名)印刷宛名文字色はForeColorで選択できます。ボックスの色はBackColorで選択できます。

コマンドボタンを配置します。

ツールボックスからコマンドボタン(プッシュ型のボタンマークのもの)を選択してください。

  1. Caption 「印刷スタート」
    (オブジェクト名)一件印刷

 

このような感じで仕上げてください。カラーリングは適宜設定されたらと思います。

contpanel015

 

ラベル部分のコード設定

 

ラベル「宛名をクリックすると最新に更新します。」を実行するコードを記述します。

4のラベルのところでクリックすると今印刷される宛先が表示されるというコードです。

”印刷宛名”の表示部分を”ダブルクリック”するとコードウインドが表示されますので、そこに記入してください。

ユーザーフォームモジュール(コントロールパネルのモジュール)での記述になります。

VBAコード参考記事
ここの説明で出てくるVBAコードの参考にしていただける記事です。

vbacalleyecatch Callステートメントはプロシージャーの部品化に必須項目 エクセルVBA最速理解

 

コード⑬

コード
Private Sub 印刷宛名_Click()
  宛名確認
End Sub

と記述してください。

contpanel018

 

つぎに”宛名確認”のマクロ(VBA)を標準モジュール(module1)に記述します。

コード⑭

コード
Sub 宛名確認()
  Dim PVa As String
  Worksheets("発行データ入力").Select
  aR = ActiveCell.Row
  PVa = Range("D" & aR).Value
  コントロールパネル.印刷宛名.Caption = PVa
End Sub

contpanel019a

このようになります。

印刷スタートボタンの起動設定

 

「印刷スタート」ボタンの設置をしていきます。

先ほどと同じように、「印刷スタート」ボタンをダブルクリックするとコードウインドが開きます

ユーザーフォームモジュール(コントロールパネルのモジュール)での記述になります。

このように記述してください。

コード⑮

コード
Private Sub 一件印刷_Click()
  一件を印刷
End Sub

 

contpanel020

 

”一件を印刷”のマクロ(VBA)を標準モジュール(module1)に記述します。

コード⑯

コード
Sub 一件を印刷()
  領収書作成
  Worksheets("領収書").PrintOut from:=1, To:=2, Preview:=True
  Worksheets("発行データ作成").Select
End Sub

 

コードの「領収書作成」は”一件を印刷”の命令(マクロ)の中にあって、領収書作成のマクロを実行しなさいということです。
contpanel021a

 

”印刷スタートボタン”を押すと印刷プレビュー画面が表示されるようになります。

プレビューを確認したうえで印刷するような設定です。

印刷するときはプレビュー画面上の「印刷」をクリックしてください。

 

これで単独印刷の設定は完了です。

 

連続印刷ページをつくる

 

ここで使う変数

  • コントロールパネルで印刷を指定した始点番号・・・・STA
  • コントロールパネルで印刷を指定した終点番号・・・・STO
  • 印刷指定した始点のデータがあるセルの行番号・・・・Arow
  • 印刷指定した終点のデータがあるセルの行番号・・・・Orow
  • 印刷指定の始点・終点番号の入力エラーに番号を付与・ErrNo
  • メッセージボックスからの返答を代入する変数・・・・rea

ここで使う関数・メソッド

  • 印刷指定された支店・終点番号を探す関数・・・・Match
  • ユーザーからの返答を動作に反映させる関数・・・MsgBox

 

MEMO

Match関数の使い方についての記事はこちらです。

エクセルVBAで使うMatch関数 活用度アップでテッパン関数に!

MsgBoxの使い方についてはこちらの記事が参考になります。

メッセージボックス MsgBox実際の使い方を最速に理解

 

次に連続印刷のために必要な項目を設定していきます。

一連の作業

 

先ほどと同様に作業します。

 

”ラベル”を4つ設置します。

先ほどと同じように、ツールボックスボタンの中の”A のラベルボタン”をおしてラベルを付けます。

  1. Caption 「連続して印刷をする場合の設定をします。」  (オブジェクト名)連続印刷 文字色はForeColorで選択できます。
  2. Caption 「伝票番号 開始番号」   (オブジェクト名)開始番号
  3. Caption 「伝票番号 終了番号」   (オブジェクト名)終了番号文字色はForeColorで選択できます。
  4. Caption 「入力番号確認」   (オブジェクト名)番号確認文字色はForeColorで選択できます。 ボックスの色はBackColorで選択できます。

 

伝票番号を入れるテキストボックスを設置します。

ツールボックスボタンの中の”ab| のテキストボタン”をおしてテキスト入力ボックスをセットします。

  1. 開始番号のテキストボックス(オブジェクト名)伝票番号始点
  2. 終了番号のテキストボックス(オブジェクト名)伝票番号終点

 

コマンドボタンを配置します。

ツールボックスからコマンドボタン(プッシュ型のボタンマークのもの)を選択してください。

  1. Caption 「入力確認」(オブジェクト名)入力確認ボタン
  2. Caption 「印刷開始」(オブジェクト名)印刷開始

 

このような感じになります。

contpanel022

 

連続印刷の伝票番号チェック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

contpanel023

 

 

”moduleウインド”の一番上に 追加で変数の定義を行います。

標準モジュール(Module1)の一番最初に記述します。

コード⑱

コード

  Public STA As Long
  Public STO As Long
  Public Arow As Variant
  Public Orow As Variant
  Public ErrNo As Long

 

次に「領収書連続印刷準備」というプロシージャーを記述します。

標準モジュール(Module1)に記述します。

始点終点番号の正誤をチェックするコードです。

 

MEMO

Gotoステートメントの使い方についてはこちらを参考にしてください。

Gotoステートメントの利用法を最速に理解。毒コードと薬コード

 

コード⑲

コード
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

 

contpanel024a

このようになります。

 

印刷スタートボタンを設定します。

 

コントロールパネルのコードウインドに以下のコードを記述してください。

このコードはメッセージウインドウを出してチェックを促します。

ユーザーフォームモジュール(コントロールパネルのモジュール)での記述になります。

コード⑳

コード
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

 

contpanel025a

 

次に「領収書連続印刷実行」というマクロを”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

 

contpanel026

 

連続印刷については、”印刷スタート”ボタンを押すと、印刷プレビュー画面なしに、すぐに印刷が始まります。

印刷プレビュー画面を表示すると、動作がすべて一旦停止してしまうので、連続にならないからです。

 

以上でVBAコード記入作業は終わりです。

 

お疲れさまでした。

 

ユーザーフォーム全体の見栄えをチェックします。

 

これで入力したデータがすべて領収書テンプレートに表示されるようになりました。

最後に領収書テンプレートの文字サイズや文字の配置を整えて、見栄えをチェックしてください。

 

VBAでこれらの表示設定のセットはすべて可能ですが、ここはセルの書式設定を使ったほうが速くて簡単です。

発行先名  文字の大きさ14

領収金額  文字の大きさ14で太字

内訳金額  配置を右詰め

 

他にも気になるところは適宜 設定変更してください。

 

ユーザーフォームのVBAで印刷をコントロールのまとめ

 

これでオリジナルな領収書の作成方法の解説は終了です。

 

”発行データ入力シート”のセルには数式などは全く入っていませんので、データはそのまま加工利用することがでます。

記述しましたコードをご利用に応じてカスタマイズして、さらに自分なりに使いやすくしてください。

 

一応 完成品のエクセル「領収書作成.xlsm」をダウンロードできるようにしています。

ダウンロードで入手できるものは、VBAマクロの保護をしていますので、改変することはできません。

このソフトはご自分で業務でお使いいただくのはフリーですが、

転載や転売については許可しておりませんので、ご使用にならないよう固くお断りいたします。

 

最初から記事を読み返す。<<<

領収書テンプレートづくりから』へ

 

短期間でエクセルVBAの独学習得を目指したいなら

 

エクセルVBAを独学する独習方法は、学習者それぞれ十人十色、多種多様と思われます。

けれども、

出来るだけ効率よく学習するためには、いくつかの大切なポイントがあります。

独学でもVBA習得の中級クラスに達するのはそんなに難しいことではありません。

先人が行った勉強方法をあなたがそのまま利用すればよいということです。

vbastudyeyecatch002 エクセルVBAを独学で習得する!ために大切な7つのポイントを解説します

独習のための大切な7つのポイントは、上記記事にて解説しています。

重要ワード

独習によるVBA習得のキーワードは、

出来るだけ多くの実例に触れること!

です。

正直、VBAの学習について自分の周りの仕事(業務)からだけ実例を得るのでは効率良い習熟は無理です。

ハッキリ言って、

本当に短い期間でVBA習得を成功させたいなら、今使っている参考書が良書かどうかを判断し、新ツールとしてオンライン学習も取り入れて行うことが、

手っ取り早く短期間習得できるというのは間違いないでしょう。

 

 

業務効率UPのためにエクセルVBAを使いだして、始めのうちに知っておきたい内容を記事にしています。

「VBA最速理解」の記事一覧を開く

 

実際のご利用上において、

A6の用紙の準備方法や出力用として利便性のあるプリンターへの変更など、

実際に使っているものがありますので、参考にしていただける記事を載せておきます。

NECの業務用コンパクトプリンター5800Cは装備機能充実

 

<記事内容についての告知>VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。