エクセルで好きなシートを選択して一気に印刷できたらいいな
なんて思ったりしたことないですか。僕はあります。例えばエクセル内にもう目も当てられないくらい大量のシートがあったとして、そこから任意のシートだけを選んで一気に印刷したいなんてとき。
これって個人的にはあると便利だと思うのにエクセル内のメニューの中にはないんですよね。あまり重要視されていないのかな。仕方がないのでCTRL押しながらポチポチとシート選択して印刷ってやるんですけど、そのままシートをグループ化したの忘れてシート編集しちゃって関係ないシートまで自分でグチャグチャに破壊したりなんて三流コントみたいなことやっちゃったりなんかして「ムキー!」てなります。
ないものは作ってみる
ということで、今回はこの印刷機能をVBAで作り、アドイン※として自分のエクセル環境に取り込んでしまおうと思います。
※アドイン・・・エクセルに追加機能をつけることができるプログラム
ちょっと長くなりそうなので記事は前編、後編と二つに分けて紹介しようと思います。
- 前編 アドインを作る
- 後編 アドインを組み込んでメニューにする
といった感じでやっていきます。今回作成したアドインを使いたいという方は以下のリンクよりダウンロードできます。
シートの選択印刷アドイン_ダウンロード(ファイル名 sheet_print.zip)
Excelでシートを複数選択して印刷できるアドインを作ってみた(前編)
今回のマクロに必要と思われる機能
- シート名一覧をフォーム上に表示する
- シート名一覧をマウスで選択できる
- 選択したシートをグループ化して印刷ダイアログを表示
- グループ化の解除
主にこのような機能があればいいと思います。ついでに全シートの選択・解除ボタンもつけると便利そうです。まずはフォームの作成から始めます。
目次
ユーザーフォームを作成
VBE(「ALT」+「F11」)を立ち上げて左上のプロジェクトウィンドウ内で「右クリック」→「挿入」→「ユーザーフォーム」を選択します。
リストボックス ・・・ ListBox_SELECT_SHEETS
「すべて選択」ボタン ・・・ CommandButton_ALL_SELECT
「すべて解除」ボタン ・・・ CommandButton_ALL_ANSELECT
「印刷する」ボタン ・・・ CommandButton_SHEETS_PRINT
フォームのイニシャライズコードの作成
VBEでフォームの開いているところを「右クリック」→「コードの表示」にてコードを表示します。
[vb]
Private Sub UserForm_Initialize()
With UserForm_SELECT_SHEET_PRINT.ListBox_SELECT_SHEETS
For i = 1 To Worksheets.Count
.AddItem Worksheets(i).Name
Next
End With
End Sub
[/vb]
「印刷する」ボタンのコードの作成
ユーザーフォームの印刷するボタンをダブルクリックすると、対応するプロシージャのひな形が自動生成されます。
[vb]
Private Sub CommandButton_SHEETS_PRINT_Click()
Dim chosenFirstIndex As Integer
chosenFirstIndex = chosenFirstSheet
Worksheets(chosenFirstIndex).Activate
For i = 1 To Worksheets.Count
If UserForm_SELECT_SHEET_PRINT.ListBox_SELECT_SHEETS.Selected(i – 1) Then
Worksheets(i).Select False
End If
Next
‘ユーザーフォームの終了
Unload UserForm_SELECT_SHEET_PRINT
‘セレクトされたシートの印刷処理
Application.Dialogs(xlDialogPrint).Show
‘グループ化を解除する
Worksheets(chosenFirstIndex).Select
End Sub
‘/////////////////////////////////////////////////////////
‘ 選択された最初のシート番号を返す
‘/////////////////////////////////////////////////////////
Function chosenFirstSheet() As Integer
Dim sheet_count As Integer
With UserForm_SELECT_SHEET_PRINT
For sheet_count = 1 To .ListBox_SELECT_SHEETS.ListCount
If .ListBox_SELECT_SHEETS.Selected(sheet_count – 1) Then
Exit For
End If
Next
End With
chosenFirstSheet = sheet_count
End Function
[/vb]
マクロの解説
6行目
chosenFirstIndexには選択された最初のシート番号(chosenFirstSheetファンクションプロシージャで返された数字)が入ります。実際の作業中、選択されていないシートがアクティブになっている状態は普通にありえるので、ここでは選択された最初のシートへとアクティブ状態を移します。
8~12行目
リストボックスで選択されたシート名に対応するシート番号を繰り返し処理により選択していきます。Worksheets(i).Selectの後に「False」をつけることで単体のSelectではなく、複数の選択が可能になります。
18行目
Application.Dialogs(xlDialogPrint).Showで選択されたシートの状態をプリントダイアログへ渡します。その後はユーザー側が印刷作業に入ります。
21行目
Worksheets(chosenFirstIndex).Selectであえてひとつシートを選択することでグループ化を解除しておきます。
その他のボタンのコードの作成
今回はあると便利だと思ったので「すべて選択」ボタンと「すべて解除」ボタンを作りました。それぞれ同様にダブルクリックして自動でひな形を作成し、以下のコードを挿入します。
[vb]
‘********************************************************
‘ すべて選択ボタン
‘********************************************************
Private Sub CommandButton_ALL_SELECT_Click()
With UserForm_SELECT_SHEET_PRINT.ListBox_SELECT_SHEETS
For i = 0 To .ListCount – 1
.Selected(i) = True
Next i
End With
End Sub
‘********************************************************
‘ すべて解除ボタン
‘********************************************************
Private Sub CommandButton_ALL_ANSELECT_Click()
With UserForm_SELECT_SHEET_PRINT.ListBox_SELECT_SHEETS
For i = 0 To .ListCount – 1
.Selected(i) = False
Next i
End With
End Sub
[/vb]
ユーザーフォーム呼び出し用のプロシージャを作ります
ユーザーフォームを呼び出すための処理を標準モジュールに作成します。ユーザーフォーム作成時と同様にプロジェクトウィンドウ内で「右クリック」→「挿入」→「標準モジュール」を選択します。
標準モジュール(Module1)内に以下の呼び出しコードを作成します。
[vb]
Sub SHEET_PRINT()
UserForm_SELECT_SHEET_PRINT.Show
End Sub
[/vb]
プロシージャ名はなんでも良いです。ここではただユーザーフォームを表示するだけの処理を書きます。このプロシージャは後編のアドイン登録時のメニューに設定するためのものです。
アドインとして保存します
ここまで作成したらあとはファイルをアドインとして保存します。
「名前を付けて保存」より、ファイルの種類を「Excel97-2003アドイン」に変更して保存します。名前は自分がわかればなんでも良いです。
保存場所はデフォルトで「C:\Users\ユーザー名\AppData\Roaming\Microsoft\AddIns」になるようなのでこのまま保存します。ちなみにAppDataフォルダは隠しフォルダです。(Excel2010の場合)
次回はこれをアドインとしてメニューに組み込んでみます。