コンボボックスのプルダウンで印刷シートを指定する

vbajikyukeisaneyecatch008

エクセルシートにコンボボックスを設置して、そのプルダウンリストで選択されたシートを印刷します。
多量のシートでも、シートを開きに行かずに印刷することが出来ます。

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

今回は、作成保存した時給計算表を、紙印刷やPDF化する時の便利機能をエクセルVBAコードで作っていきます。

時給計算表作成の記事編成

コンボボックスで印刷シートを指定

vbajikyuhyocomboinsatup009

保存した時給計算表をPDF化を含めてプリントアウトする仕組みを作っていきます。

印刷の方法としては、印刷したいシートを開き「ファイル」→「印刷」でいいのですが、

操作パネルの「初期設定項目」シートを、VBAコードで組み立てていますので、ここでもうちょっと便利に操作できるようにコード化したいと思います。

この記事の説明でやりたいことは、以下のような仕組みを作ることになります。

STEP1.「シートリスト作成」ボタンをクリックします。

vbajikyuhyocomboinsatup001
矢印下001

STEP2.「プルダウンボタン(ActiveXコントロール・コンボボックス)」を押す。

この個人別時給計算表に存在するシートがリスト化されています。

vbajikyuhyocomboinsatup002
矢印下001
vbajikyuhyocomboinsatup003
矢印下001

STEP3.シート名を選択し「シート印刷」をクリックします。

vbajikyuhyocomboinsatup004
矢印下001

4.選択したシートの印刷プレビュー画面が表示されます。

シートを確認して良ければ「印刷」をクリックします。

vbajikyuhyocomboinsatup006
矢印下001

STEP5.ファイル内のシート構成を変更した場合は、「シートリストクリア」をクリックします。

今あるリストを削除することが出来ます。

vbajikyuhyocomboinsatup007

ActiveXコントロール・コマンドボタンとVBAプロシージャーとの紐づけは、後の記事で説明します。

コンボボックスから印刷シートを指定するVBAコード

vbajikyuhyocomboinsatup010

この記事のエクセルVBAコードは、「Module3」に記述していきます。

コンボボックスの設置から行っていきます。

コンボボックスの設置

コンボボックスの設置はコマンドボタンと同様です。

Excelの「開発タブ」から「挿入」→「ActiveXコントロール」→「コンボボックス」と指定して、エクセルシート上の必要か所に十字カーソルで大きさを決めて設置してください。

vbajikyuhyocomboinsatup008

オブジェクト名はデフォルトの「ComboBox1」です。

シート名をコンボボックスのリストに登録するVBA

コンボボックスをシートに設置するだけでは ” 単なる空箱 ” にしか過ぎません。

次に、コンボボックスのプルダウンリストにシート名を登録表示するVBAコードを作成していきます。

コンボボックスにシート名を登録表示させるには、「AddItem」メソッドを使います。

シート数、シート名は個人別時給計算表の使用状況によって全く変わります。固定しておくことは出来ません。

なので、動的に可変できる「配列」を使用してシート数、シート名を指定します。

VBA
Sub シート名()
    Dim Sh As Worksheet
    Dim ShN() As String
    Dim n As Long
    Dim ComboBox1 As MSForms.ComboBox
'全シート名を抽出するして配列に代入します
        n = Worksheets.Count
'配列を再宣言します
    ReDim ShN(n)
'0からスタートして、配列にシート名を代入していきます
        n = 0
        For Each Sh In Worksheets
            ShN(n) = Sh.Name
            n = n + 1
        Next
'配列に代入したシート名をコンボボックスアイテムに移し登録します
        For n = 0 To Worksheets.Count - 1
            Worksheets("初期設定項目").ComboBox1.AddItem ShN(n)
        Next n
End Sub

全シート名を抽出するして配列に代入します

vbahairetueyecatch 1次元配列とは。静的配列と動的配列 エクセルVBA

配列を再宣言します

    Dim Sh As Worksheet
    Dim ShN() As String
    Dim n As Long
    Dim ComboBox1 As MSForms.ComboBox
'全シート名を抽出するして配列に代入します
        n = Worksheets.Count
'配列を再宣言します
    ReDim ShN(n)

変数ShN()は配列です。それぞれのシート名を入れますが、シート名と数がまだ不明です。

数が確定した時点でReDimで再宣言を行います。

配列に代入したシート名をコンボボックスアイテムに移し登録します

全てのシート名を配列の要素として代入し、「AddItem」メソッドを使ってリストに登録していきます。

'0からスタートして、配列にシート名を代入していきます
        n = 0
        For Each Sh In Worksheets
            ShN(n) = Sh.Name
            n = n + 1
        Next
'配列に代入したシート名をコンボボックスアイテムに移し登録します
        For n = 0 To Worksheets.Count - 1
            Worksheets("初期設定項目").ComboBox1.AddItem ShN(n)
        Next n

コンボボックスで選択したシートを印刷するVBAコード

次に、コンボボックスで選択されたシートを印刷します。

コンボボックスで選んだシート名を取り出す

「ListIndex」プロパティはリストの番号を取得します(整数値)。

「List」メソッドはリストの項目テキストを取得します。

シート名(文字列)を表示させるためには「.List(.ListIndex)」と記述します。

VBA
Sub シート印刷()
    Dim PSh As String
        Call Module1.設定値代入
        Worksheets("初期設定項目").Select
'リストで選択されたシート名を取り出します
        With Worksheets("初期設定項目").ComboBox1
            On Error GoTo errstep1
            PSh = .List(.ListIndex)
        End With
'印刷のための設定を行います
        With Worksheets(PSh).PageSetup
            .PrintArea = "A1:K34"
            .RightHeader = EmpName & "時給計算表" & PSh
            .PaperSize = xlPaperA4
            .Orientation = xlLandscape
            .LeftMargin = Application.CentimetersToPoints(1)
            .RightMargin = Application.CentimetersToPoints(1)
            .TopMargin = Application.CentimetersToPoints(1)
            .BottomMargin = Application.CentimetersToPoints(0.5)
            .HeaderMargin = Application.CentimetersToPoints(0.5)
            .FooterMargin = Application.CentimetersToPoints(0.5)
        End With
'プリントプレビューを表示します
        Worksheets(PSh).PrintPreview
        Exit Sub
errstep1:
        MsgBox "シートの選択がされていません", vbExclamation, _
            "時給計算表作成"
End Sub
vbacalleyecatch 部品化プロシージャーでCallステートメントは必須

リストで選択されたシート名を取り出します

        With Worksheets("初期設定項目").ComboBox1
            On Error GoTo errstep1
            PSh = .List(.ListIndex)
        End With

シートを指定できなかった場合は「errstep1」にジャンプします。

VBAGotoeyecatch001 Gotoステートメントでコードをジャンプ!毒と薬の2面性

印刷のための設定を行います

  • プリントエリアの指定
  • ヘッダー表示
  • A4サイズ指定、印刷方向
  • 上下左右余白

プリントプレビューを表示します

        Worksheets(PSh).PrintPreview
        Exit Sub
errstep1:
        MsgBox "シートの選択がされていません", vbExclamation, _
            "時給計算表作成"

プリントプレビューで印刷するシートの確認を行い、大丈夫なら印刷ボタンをクリックします。

印刷シートの指定が出来なかった場合は、メッセージを表示して「OKボタン」で終了します。

コンボボックスのリストのクリア

シート構成が変わった時には、コンボボックスのリストを変更しておきましょう。

VBA
Sub コンボリストクリア()
'コンボボックスのアイテムをクリアする
        With Worksheets("初期設定項目").ComboBox1
            .Clear
        End With
End Sub

シートに設置したコンボボックスからの印刷のまとめ

vbajikyuhyocomboinsatup011

作成保存した時給計算表の印刷方法について説明してきました。

エクセルのデフォルトの印刷機能であれば、よくご存じのように印刷したいシートを表示して「ファイル」→「印刷」(その前に印刷設定もあります)をしないといけません。

会計月毎の保存シートも1年で12枚、多年に渡ればその何倍かになります。

その度毎に、シートを開きに行ったのでは大変です。

シート数が増えれば増えるほど、今回説明したこの機能が役に立ってくると思います。

またこの方法は、別にいろいろな場面でも使えるテクニックですので、ご自身で応用を考えられても面白いかと思います。

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

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

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

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

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

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