Excelでシートを複数選択して印刷できるアドインを作ってみた(前編)

エクセルで好きなシートを選択して一気に印刷できたらいいな

なんて思ったりしたことないですか。僕はあります。例えばエクセル内にもう目も当てられないくらい大量のシートがあったとして、そこから任意のシートだけを選んで一気に印刷したいなんてとき。

これって個人的にはあると便利だと思うのにエクセル内のメニューの中にはないんですよね。あまり重要視されていないのかな。仕方がないのでCTRL押しながらポチポチとシート選択して印刷ってやるんですけど、そのままシートをグループ化したの忘れてシート編集しちゃって関係ないシートまで自分でグチャグチャに破壊したりなんて三流コントみたいなことやっちゃったりなんかして「ムキー!」てなります。

ないものは作ってみる

ということで、今回はこの印刷機能をVBAで作り、アドイン※として自分のエクセル環境に取り込んでしまおうと思います。
※アドイン・・・エクセルに追加機能をつけることができるプログラム

ちょっと長くなりそうなので記事は前編、後編と二つに分けて紹介しようと思います。

  • 前編 アドインを作る
  • 後編 アドインを組み込んでメニューにする

といった感じでやっていきます。今回作成したアドインを使いたいという方は以下のリンクよりダウンロードできます。

シートの選択印刷アドイン_ダウンロード(ファイル名 sheet_print.zip)

スポンサーリンク

Excelでシートを複数選択して印刷できるアドインを作ってみた(前編)

今回のマクロに必要と思われる機能

  • シート名一覧をフォーム上に表示する
  • シート名一覧をマウスで選択できる
  • 選択したシートをグループ化して印刷ダイアログを表示
  • グループ化の解除

主にこのような機能があればいいと思います。ついでに全シートの選択・解除ボタンもつけると便利そうです。まずはフォームの作成から始めます。

ユーザーフォームを作成

VBE(「ALT」+「F11」)を立ち上げて左上のプロジェクトウィンドウ内で「右クリック」→「挿入」→「ユーザーフォーム」を選択します。

adin001_a

ユーザーフォームは以下のように作りました。

adin002

主なオブジェクトとオブジェクト名については以下のとおり設定しました。リストボックスはシート名の一覧を表示させる領域です。
ユーザーフォーム ・・・ UserForm_SELECT_SHEET_PRINT
リストボックス ・・・ ListBox_SELECT_SHEETS
「すべて選択」ボタン ・・・ CommandButton_ALL_SELECT
「すべて解除」ボタン ・・・ CommandButton_ALL_ANSELECT
「印刷する」ボタン ・・・ CommandButton_SHEETS_PRINT

フォームのイニシャライズコードの作成

VBEでフォームの開いているところを「右クリック」→「コードの表示」にてコードを表示します。

adin003

コードエディタの左上のプルダウンリストをUserForm、右上のプルダウンリストをInitializeに変更すると自動的にプロシージャのひな形が作成されます。

adin004

UserFormのInitializeはユーザーフォームが生成される時に呼び出されるプロシージャです。ここに以下のコードを作成します。
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
ユーザーフォームが生成される時にFor文を使った繰り返し処理により、ワークシートの数分(Worksheets.Count)だけ「ワークシートの名前を取得」→「リストボックスに表示」(ListBox.AddItem)を繰り返します。

「印刷する」ボタンのコードの作成

ユーザーフォームの印刷するボタンをダブルクリックすると、対応するプロシージャのひな形が自動生成されます。

adin005

ここに以下のコードを作成します。
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




マクロの解説

6行目
chosenFirstIndexには選択された最初のシート番号(chosenFirstSheetファンクションプロシージャで返された数字)が入ります。実際の作業中、選択されていないシートがアクティブになっている状態は普通にありえるので、ここでは選択された最初のシートへとアクティブ状態を移します。

8~12行目
リストボックスで選択されたシート名に対応するシート番号を繰り返し処理により選択していきます。Worksheets(i).Selectの後に「False」をつけることで単体のSelectではなく、複数の選択が可能になります。

18行目
Application.Dialogs(xlDialogPrint).Showで選択されたシートの状態をプリントダイアログへ渡します。その後はユーザー側が印刷作業に入ります。

21行目
Worksheets(chosenFirstIndex).Selectであえてひとつシートを選択することでグループ化を解除しておきます。

その他のボタンのコードの作成

今回はあると便利だと思ったので「すべて選択」ボタンと「すべて解除」ボタンを作りました。それぞれ同様にダブルクリックして自動でひな形を作成し、以下のコードを挿入します。

'********************************************************
'   すべて選択ボタン
'********************************************************
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

ユーザーフォーム呼び出し用のプロシージャを作ります

ユーザーフォームを呼び出すための処理を標準モジュールに作成します。ユーザーフォーム作成時と同様にプロジェクトウィンドウ内で「右クリック」→「挿入」→「標準モジュール」を選択します。

標準モジュール(Module1)内に以下の呼び出しコードを作成します。

Sub SHEET_PRINT()
    UserForm_SELECT_SHEET_PRINT.Show
End Sub

プロシージャ名はなんでも良いです。ここではただユーザーフォームを表示するだけの処理を書きます。このプロシージャは後編のアドイン登録時のメニューに設定するためのものです。

アドインとして保存します

ここまで作成したらあとはファイルをアドインとして保存します。

「名前を付けて保存」より、ファイルの種類を「Excel97-2003アドイン」に変更して保存します。名前は自分がわかればなんでも良いです。

sheet001

保存場所はデフォルトで「C:\Users\ユーザー名\AppData\Roaming\Microsoft\AddIns」になるようなのでこのまま保存します。ちなみにAppDataフォルダは隠しフォルダです。(Excel2010の場合)

次回はこれをアドインとしてメニューに組み込んでみます。

後編を読む

スポンサーリンク
  • このエントリーをはてなブックマークに追加

コメントをどうぞ

メールアドレスが公開されることはありません。