エクセルシートにコンボボックスを設置して、そのプルダウンリストで選択されたシートを印刷します。
多量のシートでも、シートを開きに行かずに印刷することが出来ます。
こんにちは、じゅんぱ店長(@junpa33)です。
今回は、作成保存した時給計算表を、紙印刷やPDF化する時の便利機能をエクセルVBAコードで作っていきます。
時給計算表作成の記事編成
- 時給計算表作成エクセルソフトの使い方とダウンロード
コンテンツ
コンボボックスで印刷シートを指定
保存した時給計算表をPDF化を含めてプリントアウトする仕組みを作っていきます。
印刷の方法としては、印刷したいシートを開き「ファイル」→「印刷」でいいのですが、
操作パネルの「初期設定項目」シートを、VBAコードで組み立てていますので、ここでもうちょっと便利に操作できるようにコード化したいと思います。
この記事の説明でやりたいことは、以下のような仕組みを作ることになります。
この個人別時給計算表に存在するシートがリスト化されています。
シートを確認して良ければ「印刷」をクリックします。
今あるリストを削除することが出来ます。
ActiveXコントロール・コマンドボタンとVBAプロシージャーとの紐づけは、後の記事で説明します。
コンボボックスから印刷シートを指定するVBAコード
この記事のエクセルVBAコードは、「Module3」に記述していきます。
コンボボックスの設置から行っていきます。
コンボボックスの設置
コンボボックスの設置はコマンドボタンと同様です。
Excelの「開発タブ」から「挿入」→「ActiveXコントロール」→「コンボボックス」と指定して、エクセルシート上の必要か所に十字カーソルで大きさを決めて設置してください。
オブジェクト名はデフォルトの「ComboBox1」です。
シート名をコンボボックスのリストに登録するVBA
コンボボックスをシートに設置するだけでは ” 単なる空箱 ” にしか過ぎません。
次に、コンボボックスのプルダウンリストにシート名を登録表示するVBAコードを作成していきます。
コンボボックスにシート名を登録表示させるには、「AddItem」メソッドを使います。
シート数、シート名は個人別時給計算表の使用状況によって全く変わります。固定しておくことは出来ません。
なので、動的に可変できる「配列」を使用してシート数、シート名を指定します。
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
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)」と記述します。
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
With Worksheets("初期設定項目").ComboBox1
On Error GoTo errstep1
PSh = .List(.ListIndex)
End With
シートを指定できなかった場合は「errstep1」にジャンプします。
Gotoステートメントでコードをジャンプ!毒と薬の2面性- プリントエリアの指定
- ヘッダー表示
- A4サイズ指定、印刷方向
- 上下左右余白
Worksheets(PSh).PrintPreview
Exit Sub
errstep1:
MsgBox "シートの選択がされていません", vbExclamation, _
"時給計算表作成"
プリントプレビューで印刷するシートの確認を行い、大丈夫なら印刷ボタンをクリックします。
印刷シートの指定が出来なかった場合は、メッセージを表示して「OKボタン」で終了します。
コンボボックスのリストのクリア
シート構成が変わった時には、コンボボックスのリストを変更しておきましょう。
Sub コンボリストクリア()
'コンボボックスのアイテムをクリアする
With Worksheets("初期設定項目").ComboBox1
.Clear
End With
End Sub
シートに設置したコンボボックスからの印刷のまとめ
作成保存した時給計算表の印刷方法について説明してきました。
エクセルのデフォルトの印刷機能であれば、よくご存じのように印刷したいシートを表示して「ファイル」→「印刷」(その前に印刷設定もあります)をしないといけません。
会計月毎の保存シートも1年で12枚、多年に渡ればその何倍かになります。
その度毎に、シートを開きに行ったのでは大変です。
シート数が増えれば増えるほど、今回説明したこの機能が役に立ってくると思います。
またこの方法は、別にいろいろな場面でも使えるテクニックですので、ご自身で応用を考えられても面白いかと思います。
エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。
エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です今回の記事はここまでです。 最後までご覧いただき有難うございました。
<記事内容についての告知>
VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。
アンケートでポイ活しよう!!
アンケートに答えれば答えるほど ”使える” ポイントがたまります。