印刷設定を行うVBA インボイス見積納品請求伝票日付版

invoice3tenprinteyecatch

インボイス見積納品請求伝票日付版のエクセルソフト作成です。
適格請求書に対応した形で、印刷設定のVBAの作り方の説明を行います。
見積納品請求の各帳票を発行出来ます。

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

エクセルVBAソフトのインボイス見積納品請求伝票日付版を作成しています。

今回は、先回に完成した帳票を印刷できるように整えていきます。

印刷は、プリントプレビューの状態で表示し、そのプレビューの印刷ボタンで印刷できるようにします。

印刷操作のVBA設計では、各利用者側のプリンター使用環境への依存度が大きく影響します。

なので、

Worksheets(・・・).PrintOut

は使わずに

Worksheets(・・・).PrintPreview

を利用しています。PrintPreviewメソッドを持って印刷実行としています。

  1. コード設計のメリットとして、プリンター設定をPCに任せることで、VBA側からの使用するプリンターの指定を回避できる。
  2. トレイ指定や両面指定など個々の利用環境を考慮しなくてよい。
  3. 印刷余白ヘッダーフッターなどの追加修正をプレビューで行うことが出来る。

など、この印刷操作を行うVBAコードを埋め込まないことで、印刷時の予期せぬエラーを回避することが出来るからです。

インボイス見積納品請求3点伝票作成の記事編成

印刷設定の完成形(プリントプレビュー)

invoice3tenprintp001

今回はここまで作成します。

invoice3tentorihizp03
invoice3tentorihizp04

印刷を設定するVBAコード

invoice3tenprintp002

ユーザーフォームの「帳票印刷」ボタンをクリックすると、実行されるプロシージャーを設計します。

印刷を設定するVBA 全コード

ここではVBAコードをModule3に記述しています。

VBA
Option Explicit

Sub 印刷設定()
    Dim SaRow, KeRow, NRow, Pc As Long
    Dim a, s, b As Long
    Dim Fsa, Fsb As Variant         'インボイス3点操作パネルデータを使用
        Worksheets("作業シート").Select
        SaRow = Cells(Rows.Count, 5).End(xlUp).Row
'印刷の範囲を調べる
        If SaRow < 23 Then
            KeRow = 40
        Else
            KeRow = 40 + Application.WorksheetFunction. _
                        RoundUp((SaRow - 23) / 34, 0) * 34
        End If
'ページ数のカウント
        Pc = Application.WorksheetFunction. _
                        RoundUp((SaRow - 23) / 34, 0)
'印刷範囲を設定
        For a = 2 To 4
            Worksheets(a).Select
            With Worksheets(a)
                NRow = .Cells(Rows.Count, 1).End(xlUp).Row
                    .PageSetup.PrintArea = False
                    .PageSetup.PrintTitleRows = "$15:$15"
                If KeRow = 40 Then
                    .PageSetup.PrintArea = "A1:I40"
                Else
                    .PageSetup.PrintArea = "A1:I" & KeRow
                End If
'ページ番号
                .PageSetup.CenterFooter = "&P"
'固定のフォントサイズ(品名以外)
                .Range(Cells(16, 3), Cells(KeRow, 8)) _
                            .Font.Size = 11
                .Range(Cells(16, 1), Cells(KeRow, 1)) _
                            .Font.Size = 10
'品名のフォントサイズ
                .Range(Cells(14, 3), Cells(KeRow - 3, 3)).WrapText = True
                Fsa = インボイス3点操作パネル.品名F.Value
                If Fsa = "" Then
                    Fsa = 10
                Else
                    Fsa = Val(Fsa)
                End If
                .Range(Cells(14, 3), Cells(NRow, 3)) _
                            .Font.Size = Fsa
'品名の個別フォントサイズ
                If インボイス3点操作パネル.CheckBox4 = True Then
                    Call Module3.番号別フォントサイズ
                End If
'合計のフォントサイズ
                .Cells(NRow + 1, 2).Font.Size = 11
'顧客名のフォント
                Fsb = インボイス3点操作パネル.顧客F.Value
                If Fsb = "" Then
                    Fsb = 13
                Else
                    Fsb = Val(Fsb)
                End If
                .Range("B6").Font.Size = Fsb
'フォント種選択(ユーザーフォームから選択)
                If インボイス3点操作パネル.ComboBox1.Value = "" Then
                    .Cells.Font.Name = "MS Pゴシック"
                Else
                    .Cells.Font.Name = インボイス3点操作パネル.ComboBox1.Value
                End If
            End With
        Next a
'プレビュー画面を表示
        For b = 2 To 4
            Worksheets(b).PrintPreview
        Next b
'自動保存設定
        If インボイス3点操作パネル.CheckBox3 = True Then
            Module4.伝票保存
        End If
End Sub

ユーザーフォームのフォントサイズ変更で品名個別指定がされている時に呼び出されるプロシージャーです。

VBA
Sub 番号別フォントサイズ()
    Dim HN() As String
    Dim HNRow As Long
    Dim HNList As String
    Dim Fsc As Long
    Dim a, i, Nomber As Long
        HNList = インボイス3点操作パネル.個別品名番号.Value
        Fsc = インボイス3点操作パネル.個別フォントサイズ.Value
        Fsc = Val(Fsc)
        For a = 2 To 4
            With Worksheets(a)
                .Select
'テキストボックスの文字列から数値を配列取り出し
                HN = Split(HNList, ",")
                For i = LBound(HN) To UBound(HN)
                    Nomber = Val(HN(i))
                    On Error Resume Next
'取り出した数値から行番号を調べる
                    HNRow = WorksheetFunction.Match(Nomber, _
                                .Range("A:A"), 0)
                    .Cells(HNRow, 3).Font.Size = Fsc
                    On Error GoTo 0
                Next i
            End With
        Next a
End Sub

個々のVBAコードの動作説明

印刷設定 プロシージャー

印刷範囲設定から印刷ページ番号付与

印刷の範囲を調べる

SaRowは作業シートのデータ入力行数

KeRowは帳票ページ(「見積書」「納品書」「請求書」)の罫線を引く行数

「作業シート」の帳票作成データのボリューム(データ行数)を調べます。

帳票1ページ目は商品データ記入可能行数が22行です。

帳票2ページ以降は商品データ記入可能行数が34行となります。

別途合計欄3行を加味します。

ページ数のカウント

Pcはページ数

「作業シート」の商品データ行数を2ページ以降の記入可能行数で割り算をして算出します。

(とりあえず、この時点で変数Pcの利用はありませんが・・・)

印刷範囲を設定

PageSetupでプリントタイトルを15行目に設定します。

印刷範囲を設定します。

ページ番号

PageSetupでフッター中央にページ番号を振ります。

フォントの設定

固定のフォントサイズ(品名以外)

商品データ行の商品以外の基準のフォントサイズを設定します。

品名のフォントサイズ

セル内のテキスト表示を「折り返して表示」に設定します。

フォントサイズは、ユーザーフォームで指定したサイズで表示します。無指定の場合のサイズは「10」とします。

品名の個別フォントサイズ

個別にフォントサイズを設定するにチェックした場合は、入力ボックスの品名番号についてフォントサイズを変更することが出来ます。

チェックマークがされた時は、部品化プロシージャー「番号別フォントサイズ」が実行されます。

品名が長くセル内に表示しきれない場合などに利用します。

合計のフォントサイズ

NRowは帳票ページの商品番号の最終入力セルの行数です。

フォントサイズは「11」に設定します。

顧客名のフォント

フォントサイズは、ユーザーフォームで指定したサイズで表示します。無指定の場合のサイズは「13」とします。

フォント種選択(ユーザーフォームから選択)

ユーザーフォームのコンボボックス(プルダウン)から選択します。

無指定の場合は“MS Pゴシック”となります。

プレビュー画面表示とオプション設定

プレビュー画面を表示

「請求書」「納品書」「見積書」の順番でプレビュー画面を表示します。

最終印刷OK化を確認して印刷します。

プリンターを指定して紙印刷にするか、PDF印刷にするかをここで選択できます。

自動保存設定

ユーザーフォームの「印刷時自動保存」チェックで、この印刷動作の最後で、「伝票保存」プロシージャーを呼び出し、続いて帳票保存プログラムを実行します。

番号別フォントサイズ プロシージャー

品名番号毎にフォントサイズを変更するプログラムです。

帳票シート毎にフォントサイズ変更処理を行っていきます。

テキストボックスの文字列から数値を配列取り出し

品名番号入力ボックス(テキストボックス)のデータ(カンマ区切りでつながった文字列)を分解し、品名番号を配列として取り出します。(Split関数)

vbahairetu2eyecatch Array・LBound・RBoundの配列関数と各ステートメントを最速理解

取り出した数値から行番号を調べる

取り出した品名番号は、Match関数を使用して帳票シートのどの行数にあるのかを調べる。

見つかったその行の品名のフォントを変更する。

Match関数は、検索データが見つからないとエラーとなるので、必ずエラー回避コードも付けておきましょう。

印刷設定を行うVBA まとめ

invoice3tenprintp003

印刷設定を行うVBAの説明を行いました。

これで商品データの加工から印刷まで一連の作業を行えるようになりました。

次回は、作成した帳票を保存するためのVBAを説明します。

エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。

vbastudyeyecatch2 エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です

今回の記事はここまでです。   最後までご覧いただき有難うございました。

エクセルVBA最速理解で必要な知識を集めよう!

エクセルVBA業務ツールで日常の業務改善を行いましょう。

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

アンケートでポイ活しよう!!

アンケートに答えれば答えるほど ”使える” ポイントがたまります。

NTTコム サーチ

af_banner01

Dstyle web

dstyleweb_logo
dstyle_320x50-min