0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

「印刷ボタンを押すたびに毎回同じ設定をやり直す」を終わらせる5本

0
Posted at

「印刷ボタンを押すたびに毎回同じ設定をやり直す」を終わらせる5本

タグ: VBA Excel 印刷 帳票 業務効率化
投稿先: Qiita


印刷まわりだけ、なぜか自動化を後回しにしていた

Excelマクロで自動化を進めていく中で、印刷・帳票まわりだけは意外と手をつけていない人が多いのではないでしょうか。データ処理や集計は真っ先にマクロ化するのに、「印刷範囲を選択してPage Layoutで確認して印刷」という一連の作業は、毎回手作業で繰り返しがちです。

ここまで読み進めているということは、あなたも印刷まわりの地味な繰り返し作業に、一度は面倒くささを感じたことがあるはずです。この記事では、印刷・帳票まわりの定型作業をボタン化する5本のマクロを、実際のコードとともに紹介します。

1. 選択範囲をそのまま印刷範囲にする

Sub SetPrintArea()
    Dim ws As Worksheet
    Dim printArea As String

    On Error GoTo ErrorHandler

    If TypeName(Selection) <> "Range" Then
        MsgBox "セル範囲を選択してください。", vbExclamation
        Exit Sub
    End If

    Set ws = ActiveSheet
    printArea = Selection.Address

    ws.PageSetup.PrintArea = printArea

    MsgBox "印刷範囲を設定しました: " & printArea, vbInformation
    Exit Sub

ErrorHandler:
    MsgBox "エラーが発生しました: " & Err.Description, vbCritical
End Sub

セルを選択してから実行するだけで、その範囲がそのまま印刷範囲になります。ページ設定ダイアログを開いて印刷範囲を手入力する手間がなくなります。

2. 印刷範囲をリセットする

Sub ClearPrintArea()
    Dim ws As Worksheet

    On Error GoTo ErrorHandler

    Set ws = ActiveSheet

    If ws.PageSetup.PrintArea = "" Then
        MsgBox "印刷範囲は設定されていません。", vbInformation
        Exit Sub
    End If

    ws.PageSetup.PrintArea = ""

    MsgBox "印刷範囲をクリアしました。", vbInformation
    Exit Sub

ErrorHandler:
    MsgBox "エラーが発生しました: " & Err.Description, vbCritical
End Sub

SetPrintAreaとセットで用意しておくと、「前回の印刷範囲が残っていて意図しない範囲が印刷される」という事故を防げます。既に印刷範囲が空の場合はその旨をメッセージで返すだけにしているので、誤操作の心配もありません。

3. ヘッダー/フッターを対話式で設定する

Sub AddHeaderFooter()
    Dim ws As Worksheet
    Dim sheetName As String

    On Error GoTo ErrorHandler

    sheetName = InputBox("ヘッダー/フッターを設定するシート名を入力:", "ヘッダー/フッター設定", ActiveSheet.Name)
    If sheetName = "" Then Exit Sub

    On Error Resume Next
    Set ws = Worksheets(sheetName)
    On Error GoTo ErrorHandler

    If ws Is Nothing Then
        MsgBox "「" & sheetName & "」は存在しません。", vbExclamation
        Exit Sub
    End If

    ' 左/中央/右のヘッダー・フッターをInputBoxで順に取得し反映
    ' (詳細はサイト本体のコード参照)

    MsgBox "「" & sheetName & "」にヘッダー/フッターを設定しました。", vbInformation
    Exit Sub

ErrorHandler:
    MsgBox "エラーが発生しました: " & Err.Description, vbCritical
End Sub

社内帳票では「左に会社名、中央にタイトル、右にページ番号」のような型が決まっていることが多いです。毎回ページ設定ダイアログの6つの入力欄を埋めるより、InputBoxで対話的に聞いていく形の方が迷いません。

4. デフォルトプリンタでそのまま印刷する

Sub QuickPrint()
    On Error GoTo ErrorHandler

    Dim ws As Worksheet
    Set ws = ActiveSheet

    ws.PrintOut Preview:=False

    MsgBox "印刷を開始しました", vbInformation, "印刷"

    Exit Sub

ErrorHandler:
    MsgBox "エラーが発生しました:" & vbCrLf & Err.Description, vbCritical, "エラー"
End Sub

「印刷プレビューを開いて確認して印刷ボタンを押す」を1ステップにまとめただけですが、SetPrintAreaで範囲を決めた直後に呼べば、選択→印刷までがワンクリックで完結します。

5. PDFとしてエクスポートする

Sub CreatePDFExport()
    On Error GoTo ErrorHandler

    Dim ws As Worksheet
    Dim pdfPath As String
    Dim fileName As String

    Set ws = ActiveSheet

    fileName = Left(ws.Name, InStrRev(ws.Name, ".") - 1)
    If fileName = ws.Name Then fileName = ws.Name
    pdfPath = ws.Parent.Path & "\" & fileName & ".pdf"

    ws.ExportAsFixedFormat Type:=xlTypePDF, Filename:=pdfPath, Quality:=xlQualityStandard

    MsgBox "PDFを作成しました:" & vbCrLf & pdfPath, vbInformation, "PDF作成完了"

    Exit Sub

ErrorHandler:
    MsgBox "エラーが発生しました:" & vbCrLf & Err.Description, vbCritical, "エラー"
End Sub

紙で印刷する必要がなく、メール添付や共有フォルダへの格納が目的なら、QuickPrintの代わりにこちらを使えばファイル名も自動で決まります。ブック名から拡張子を除いた名前がそのままPDF名になります。

組み合わせて使うと効果が出る

この5本は単体でも便利ですが、SetPrintAreaAddHeaderFooterQuickPrint(またはCreatePDFExport)という順で呼ぶと、「範囲を選ぶ→印刷情報を整える→出力する」までが一連の流れになります。月次帳票のように「毎月同じ形式で出す」作業ほど、この一連の流れをボタン化しておく効果が大きくなります。

ここで紹介したSetPrintAreaClearPrintAreaAddHeaderFooterQuickPrintCreatePDFExportを含む、VBAマクロ100本をサイトにまとめて公開しています。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?