はじめに
皆さん、Excel VBAを使ってプリンターを制御する方法をご存知ですか?
これは、印刷物の出力を自動化したり、環境に応じて印刷設定を変更したりするのにとても便利です。
Excel VBAにはActivePrinterプロパティというものがあり、これを使うと現在のプリンターの名前を取得したり設定したりできます。
この記事では、このActivePrinterプロパティについて詳しく説明します。そして、実際のコード例を使いながら、Excel VBAでプリンター設定を自在に操る方法を紹介します。ぜひ参考にしてみてください。
ActivePrinterプロパティの基礎
ActivePrinterプロパティは、Applicationオブジェクトからアクセスできるプロパティです。このプロパティは、現在選択されているプリンターの名前を文字列型で返してくれます。例えば、「Canon MG7700 series」といった具合です。
このプロパティの値を取得するには、次のようなコードを使います。
1 |
MsgBox Application.ActivePrinter |
このコードを実行すると、現在選択されているプリンターの名前が表示されます。
では、ActivePrinterプロパティの値を設定する方法も見てみましょう。
1 |
Application.ActivePrinter = "Canon MG7700 series" |
このコードを実行すると、指定したプリンターがアクティブプリンターになります。
実践的な使い方
ActivePrinterプロパティを使うと、プログラム内でプリンターを変更することができます。
いくつかの実例を見ていきましょう。
複数のプリンターを使用する場合
例えば、複数のプリンターが接続されている場合、ActivePrinterプロパティを使って適切なプリンターに出力することができます。
1 2 |
Application.ActivePrinter = "Canon MG7700 series" ActiveSheet.PrintOut |
このコードを実行すると、現在選択されているプリンターが「Canon MG7700 series」に変更され、シートの内容が印刷されます。
プリンターの設定を変更する場合
プリンターの設定を変更することで、印刷物の品質を改善することができます。例えば、以下のようなコードを使用して、プリンターの解像度を変更することができます。
1 2 3 4 5 6 7 |
Application.ActivePrinter = "Canon MG7700 series" With ActiveSheet.PageSetup.PrinterSettings .PrintQuality = 600 End With ActiveSheet.PrintOut |
このコードを実行すると、プリンターが「Canon MG7700 series」に変更され、シートの内容が600dpiの高解像度で印刷されます。
印刷ダイアログボックスを制御する場合
印刷ダイアログボックスを制御することで、ユーザーが印刷の詳細設定を行う必要がなくなります。
1 2 3 4 5 6 7 |
Application.ActivePrinter = "Canon MG7700 series" With ActiveSheet.PageSetup.PrinterSettings .ShowPrintDialog = False End With ActiveSheet.PrintOut |
このコードを実行すると、プリンターが「Canon MG7700 series」に変更され、印刷ダイアログボックスが表示されずにシートの内容が印刷されます。
エラーハンドリング
VBAでプリンターを制御する際には、エラーハンドリングも重要です。以下のコード例では、エラーハンドリングを追加して、プリンター設定時にエラーが発生した場合の対処法を示します。
1 2 3 4 5 6 7 8 9 |
Sub SetActivePrinter() On Error GoTo ErrorHandler Application.ActivePrinter = "Canon MG7700 series" MsgBox "プリンターが正常に設定されました。" Exit Sub ErrorHandler: MsgBox "プリンターの設定に失敗しました。エラー: " & Err.Description End Sub |
環境について
このコードは、Excel 2016以降のバージョンで動作確認しています。使用するExcelのバージョンによっては、プロパティやメソッドが若干異なる場合がありますので、ご注意ください。
まとめ
ActivePrinterプロパティは、Excel VBAを使ってプリンターを制御するための非常に重要なプロパティです。
これを使うことで、プログラム内でプリンターの設定を簡単に変更し、自動化した印刷を実現できます。
この記事で紹介した実践的な使い方を覚えておくと、Excel VBAでの印刷作業がさらに効率的になります。
ぜひ、日常の業務に取り入れてみてください。
サンプルコード
アクティブなプリンターの名前を表示
まずは、現在設定されているアクティブなプリンターの名前を表示するシンプルなコードから始めましょう。
1 2 3 |
Sub ShowActivePrinter() MsgBox "現在のアクティブプリンターは: " & Application.ActivePrinter End Sub |
プリンターを変更して印刷
次に、アクティブなプリンターを特定のプリンターに変更してからシートを印刷するコードです。
1 2 3 4 5 6 7 8 9 10 11 12 |
Sub ChangePrinterAndPrint() On Error GoTo ErrorHandler ' プリンターを指定 Application.ActivePrinter = "Canon MG7700 series" ' シートを印刷 ActiveSheet.PrintOut MsgBox "印刷が完了しました。" Exit Sub ErrorHandler: MsgBox "プリンターの設定または印刷に失敗しました。エラー: " & Err.Description End Sub |
プリンター設定を変更して印刷
特定のプリンターに変更し、解像度や他の印刷設定を変更してから印刷するコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Sub ChangePrinterSettingsAndPrint() On Error GoTo ErrorHandler ' プリンターを指定 Application.ActivePrinter = "Canon MG7700 series" ' ページ設定を変更 With ActiveSheet.PageSetup .PrintQuality = 600 ' 印刷解像度を600dpiに設定 .Orientation = xlPortrait ' ページを縦向きに設定 End With ' シートを印刷 ActiveSheet.PrintOut MsgBox "印刷が完了しました。" Exit Sub ErrorHandler: MsgBox "プリンターの設定または印刷に失敗しました。エラー: " & Err.Description End Sub |
異なるプリンターに対するバッチ印刷
複数のプリンターに対して同じシートを順番に印刷するコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Sub BatchPrintToMultiplePrinters() Dim printers As Variant printers = Array("Canon MG7700 series", "HP OfficeJet Pro 8720", "Brother HL-L2350DW") Dim i As Integer For i = LBound(printers) To UBound(printers) On Error GoTo ErrorHandler Application.ActivePrinter = printers(i) ActiveSheet.PrintOut MsgBox "印刷が完了しました: " & printers(i) Next i Exit Sub ErrorHandler: MsgBox "プリンターの設定または印刷に失敗しました。エラー: " & Err.Description End Sub |
プリンターの状態を確認してから印刷
プリンターがオンラインであるかどうかを確認してから印刷を行うコードです。このコードでは、WMI (Windows Management Instrumentation) を使用してプリンターの状態を取得します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
Sub PrintIfPrinterIsOnline() Dim printerName As String printerName = "Canon MG7700 series" If IsPrinterOnline(printerName) Then On Error GoTo ErrorHandler Application.ActivePrinter = printerName ActiveSheet.PrintOut MsgBox "印刷が完了しました。" Else MsgBox "プリンターがオンラインではありません: " & printerName End If Exit Sub ErrorHandler: MsgBox "プリンターの設定または印刷に失敗しました。エラー: " & Err.Description End Sub Function IsPrinterOnline(printerName As String) As Boolean Dim colPrinters As Object Dim objPrinter As Object Dim strComputer As String strComputer = "." Set colPrinters = GetObject("winmgmts:\\" & strComputer & "\root\cimv2").ExecQuery("Select * from Win32_Printer Where Name = '" & printerName & "'") For Each objPrinter In colPrinters If objPrinter.WorkOffline = False Then IsPrinterOnline = True Exit Function End If Next objPrinter IsPrinterOnline = False End Function |
現在の日付と時刻でファイル名を更新してシートをPDFに変換する
次のコードを試してみてください。
現在の日付と時刻に基づいてレポート名を生成し、現在のワークシートを指定されたフォルダーにPDFファイルとして保存します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
Sub SaveSheetAsPDF() ' 現在の日付と時刻を取得する Dim today As String Dim now As Date now = Now today = Format(now, "yyyy-mm-dd") ' ファイル名と保存先を指定 Dim file_name As String file_name = "report-" & today & ".pdf" Dim folder_path As String folder_path = "C:\Users\user\Desktop\" ' PDFファイルとして保存 With ActiveSheet.PageSetup .Orientation = xlPortrait .Zoom = False .FitToPagesWide = 1 .FitToPagesTall = False End With ' PDFファイルとして保存 ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _ folder_path & file_name, Quality:= _ xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, _ OpenAfterPublish:=True End Sub |
指定した範囲をパスワード保護されたPDFとして保存する
こちらのコードも試してみましょう。
指定した範囲のシートをPDFファイルとして保存し、そのPDFファイルにパスワードを設定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
Sub SaveRangeAsPasswordProtectedPDF() ' 現在の日付と時刻を取得する Dim today As String Dim now As Date now = Now today = Format(now, "yyyy-mm-dd") ' ファイル名と保存先を指定 Dim file_name As String file_name = "report-" & today & ".pdf" Dim folder_path As String folder_path = "C:\Users\user\Desktop\" ' PDFファイルとして保存する範囲を指定(A1からD10までのセル範囲) Dim export_range As Range Set export_range = ThisWorkbook.Sheets("Sheet1").Range("A1:D10") ' パスワードを設定 Dim pdf_password As String pdf_password = "mypassword123" ' PDFファイルとして保存 With export_range.PageSetup .Orientation = xlPortrait .Zoom = False .FitToPagesWide = 1 .FitToPagesTall = False End With ' PDFファイルとして保存 export_range.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _ folder_path & file_name, Quality:= _ xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, _ OpenAfterPublish:=True, Password:=pdf_password End Sub |
このコードを実行すると、指定した範囲のシートがPDFファイルとして保存され、そのPDFファイルは指定されたフォルダに日付を含むファイル名で保存されます。
また、PDFファイルはパスワード保護され、パスワードを知らない限り開けなくなります。
コメント