オフィスで使われるプリンタは、ランニングコスト削減を理由に、白黒印刷がデフォルトに設定されていることが多い。(白黒とカラーでは料金がざっくり言って10倍違うので)
Excelマクロ(VBA)を使って、白黒印刷がデフォルトのプリンタでカラー印刷できるか?と後輩君に聞かれたので、ちょっと調べてみた。
なお、カラー印刷がデフォルトのプリンタに白黒で印刷したいなら、Excelのページ設定にあるので、当然マクロから制御可能だ。
object.PageSetup.BlackAndWhite = True
という具合。でもこれってExcel側で色を落としているだけなので、カウンター料金の契約だとしっかりカラー単価で請求されそうな気がするのだが実際どうなのだろう・・・?
方法
やり方は色々あるので、ひとつずつ解説していこう。
なお、プリンタのプロパティが変更できないポリシー設定の現場では、当たり前だが、以下に述べる方法は実現できない。システム管理者に相談しよう。
WindowsAPI を使う方法
Win32APIを使ってプリンタドライバの情報をDEVMODE構造体で取得し、dmColor
にDMCOLOR_COLOR
、dmFields
にDM_COLOR
をセットする方法。
でも、今どきVBAからWin32APIを直で叩くのは時代錯誤も甚だしいし、コード量が増えて面倒くさいだけなので試してもいない。
PowerShell の Set-PrintConfiguration を使う方法
かつてWin32APIに頼っていた機能の殆どはWMIに抽象化され簡単に実現できるようになった。そしてWMIはWSHというスクリプト言語で扱うことが多かったが、今のWindowsスクリプティング環境は、より洗練されたPowerShellへと移行している。PowerShellからWMIのWin32_Printer
/Win32_PrinterConfiguration
クラスを呼び出すとプリンタのプロパティを変更できそうだが、PowerShellのSet-PrintConfiguration
コマンドレットなら、さらにシンプルに書けそうなので、そちらを試してみた。
VBAからPowerShellのコードを実行するにはWScript.Shell
を経由する。
CreateObject("WScript.Shell").Run "PowerShell -ExecutionPolicy RemoteSigned -Command Set-PrintConfiguration -PrinterName 'プリンタ名' -Color $True", 0
一応、期待する動きになったが、マクロウイルスと判定されてしまった。
マイクロソフトサポートサイトの手順に沿って、信頼できる場所から起動しなければならない。
SendKeysメソッドを使う方法
逃げ道として大概でてくるSendKeysメソッド。
プリンタのプロパティ画面を表示してユーザに変えてもらう方法。運用負担軽減策としてはアリ。
SendKeys "%R"
Application.Dialogs(xlDialogPrint).Show
Office2007以降ならCommandBarsオブジェクトでも可。
Application.CommandBars.ExecuteMso "PrintPreviewAndPrint"
【本命】カラー印刷用のプリンタを追加する方法
最後に本命を載せる。
同じプリンタドライバで、カラー印刷用のプリンタを【Windowsの設定】から追加し、
object.PrintOut ActivePrinter:="プリンタ名"
とする方法。これが素直かつ、もっとも問題が起こりにくい簡単なやり方だろう。