★★★★★★Access2000VBA・Excel2000VBA独学~現在インストールされているすべてのプリンタを調べてから、印刷したいプリンタに切り替え、さらに「選択した複数のシート」を印刷してから、通常使うプリンタに戻すプログラム。Excel2007以前などで「PDF化したいとき」に、フリーウェアなどのPDFプリンタを指定すれば直接PDF化も可能です。~
※まだ書きかけです。すみません。
※間違ってたらすみません。
※メモ書きなので、自分でも意味不明な箇所も多いです。ごめんなさい。
※参考Webページ
『 6) プリンターを指定する 』
『 Excel VBA プリンタを指定して印刷する 』
★ はじめに
・プリンタを切り替えて印刷したい、
・複数のシートを一括で印刷したい、
などの要望に応えるプログラムを試作してみました。
Excel2000などの「そもそも PDF保存 できない」バージョンでも使えるように、少し古い書き方で書いてあります。
新しいバージョンのExcelだと、また、OSが異なると、もっと違う書き方になるかもしれません。
また、今回のサンプルは「プリンタを切り替るだけ」でしたので、古いバージョンのやり方でやれましたが、もっと細かい制御をしたいときは、新しいバージョンのExcelの「Printerオブジェクト」?を使わないとダメかもしれません。
★ 情報の調査について
『 6) プリンターを指定する 』
↑内容的には、ちょっと異なりましたが、一応、参考になりました。
も参考になりました。
◎プリンタ名の調べ方(Win2000)
→プリンタのプロパティにて、「全般」タブの一番上の内容?
VBAコードでプリンタを探すときは、大文字小文字が区別されるようなので、
ここの文字列をまんまでコピペして使う方がいいです。
◎ポート名の調べ方
→同じくで、「ポート」タブにて、リストの中の「ポート」の列に
表示されている文字列?
それともイミディエイトで「? Application.ActivePrinter」で調べたときの「 ~~ on Ne02:」のような文字列?
◎ドライバ名の調べ方
→同じくで、「詳細設定」タブにて、「ドライバ」の文字列?
◎現在のActivePrinterの設定値の調べ方(イミディエイト)
「通常使うプリンタ」に設定してから、イミディエイトにて、
? Application.ActivePrinter
とやります。
プリンタ名だけでなく、「 ~~ on Ne02:」などと付加されて出てくるのですが、逆に設定を(プリンタを)切り替えるには、それが一応、全部必要です。
切り替えたい先のプリンタでも、「通常使うプリンタ」に設定してから、イミディエイトにて、
? Application.ActivePrinter すると分かります。その場合は、その後、もともとのプリンタを「通常使うプリンタ」に設定し戻します。
◎「PrinOut」メソッドで必要なプリンタ名について
→古いバージョンのExcelだと、前項のプリンタのプロパティにて、「全般」タブの一番上の内容じゃないとダメかも?。後述の「 ~~ on Ne02:」のような文字列が付加していると、エラーになった気がします。でも僕のPCだけかも?
新しいバージョンのExcelや、古いExcelでも何らかの要件を満たせば、「 ~~ on Ne02:」が付いていても大丈夫かも?
もしかしたらOSがWindows10だったからかも?OSがWin2000だとダメなのかも?
よくわかりませんので、必要に応じて、「 ~~ on Ne02:」を取ったり付けたりしてみてください。
すべてのケースで使えるのは、「 ~~ on Ne02:」を取った形のような気がします。
◎PrinOutメソッドを使う前、あるいは、印刷完了後の「ActivePrinterの設定・切替方法」について
(PrinOutメソッドを使う前の切替、あるいは、切替後+印刷完了後に、元のプリンタに戻したいときなど)
→Application.ActivePrinter = " ~~ on Ne02:"
とやります。
「 ~~ on Ne02:」などと付加された部分が必要です。
単純にプリンタ名だけだとエラーになります。
なお、Application.ActivePrinter = " ~~ on Ne02:"
とやっても、使うプリンタを変えるだけで「通常使うプリンタの設定」までは変わらないようなので、
安心して大丈夫です。
(もしWordやIEなどを同時に開いていて、COMオートメーションで連携していてもWordやIEのプリンタまでは切り替わらないと思います。)
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 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 |
' ' Option Explicit Sub PrintOut_ChangePrinter() Dim s_ShtNm As String Dim s_DefaultPrinterNm As String Dim o_win01 As Object Dim o_ItemPrtr01 As Variant Dim s_EpsonPrinterNm As String On Error GoTo error1: ' Application.ScreenUpdating = False Set o_win01 = CreateObject("Shell.Application") '↑「Microsoft Shell Controls And Automation=Shell Application=Shellオブジェクト」を実行時バインディング。 ' 「Shellオブジェクト」についてはたとえばこちら→http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/object/shell.htm ' 事前バインディングしたくて参照設定をするときは、これをコメントアウトして ' 「Microsoft Shell Controls And Automation」にチェックを入れます。 ' ' ※注・・・実行時バインディングは参照設定していても実行可能なので、 ' インテリセンス(入力補完機能)を使いたい間だけ(作っている途中だけ)参照設定して、 ' プログラムが完成したら参照設定を外して動作テストする・・・という風でもOKです。 ' 反面、事前バインディングしたいときは、参照設定は絶対に必要です。必須です。 ' ここはちょっと差異があり、混乱しやすいので注意が必要です。 ' 実行時バインディングは、「総称型のオブジェクト変数(=「AS Object」)を使う」、というだけのことですし、 ' 事前バインディングは、「固有型のオブジェクト変数(=AS Range、や、As Worksheet、など)を使う」、というだけのことです。 For Each o_ItemPrtr01 In o_win01.Namespace(4).Items '「4」で決め打ち。Const ssfPRINTERS = 4 プリンタ 「ShellSpecialFolderConstants」列挙。 'http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/object/shell.htm Debug.Print o_ItemPrtr01.Name If 0 < InStr(1, o_ItemPrtr01.Name, "EPSON EP-804A", vbBinaryCompare) Then '↑使いたいプリンタ名はアルファベットなどの大文字小文字が区別されます。 ' コントロールパネルなどでちゃんとした綴りを調べる必要があります。 ' 「EPSON EP-804A on Ne02:」のような形ではない、「EPSON EP-804A」といった、 ' 「純粋にプリンタ名だけ」の文字列が取得できます。 ' PDFプリンタを指定したいときは、 ' 「If InStr(1, o_ItemPrtr01.Name, "PDF", vbBinaryCompare) ' といった感じで書きます。必要に応て文言を増やして。 ' そうするとPDFプリンターでPDF作成ができるはずです。 ' (PDFプリンタによってはできない場合もあるかもしれませんが) s_EpsonPrinterNm = o_ItemPrtr01.Name '見つかったプリンタ名を、変数に代入して Exit For 'また、見つかった時点で、途中であってもループを抜ける。 Else End If Next '↑現在のEpsonのプリンターのプリンタ名を取得するループ。 '「EPSON EP-804A on Ne02:」のような形ではない、純粋にプリンタ名だけの文字列が取得されます。 ' のちの、「PrintOut」命令でのプリンタ指定では「 on Ne02:」などが付いていると ' エラーになってしまうようなので、このループではそのような「 on Ne02:」などが付いていない値をゲットします。 ' なお、このループでは、(目的のプリンタが見つかるまでは)すべてのプリンタを調べるので、 ' ここで、「そもそもEPSON EP-804A というプリンターがインストールされているのか?」 ' ということもチェックできることになります。 ' Windows2000+Excel2000でも動きます。 ' 実行時バインディングなので参照設定は不要です。 ' ' ※後日テストしてみたら、新しいバージョンのExcelは「 on Ne02:」などが付いてもイケました。 ' もしかしたらOSがWindows10だったからかも?OSがWin2000だとダメなのかも? ' よくわかりませんので、必要に応じて、「 on Ne02:」などを付けたり削ったりしてください。 ' 本サンプルは、一応、「 on Ne02:」などを付けたらエラーになる場合を想定して、 ' それ無しのプリンタ名を、「そもそもあるかないかチェックしながら」取得しています。 s_ShtNm = ActiveSheet.Name 'あとで今のシートに戻れるように、今のシートの名前をあらかじめ取得しておく。 s_DefaultPrinterNm = Application.ActivePrinter '↑あとで今のプリンタに戻れるように、今のプリンタの名前をあらかじめ取得しておく。 ' 「Brother DCP-J957N Printer on Ne07:」といった「 on Ne07:」が付加された名前が得られます。 ' 多くの場合、「通常使うプリンタ」の名前を取得することになります。 ' ここでこうする理由は、こうしておかないと、今のこのExcelファイルを開いている間じゅうは、 ' Application.ActivePrinterの値を書き変えてしまったプリンタでその後もずっと印刷されてしまうので。 ' Wordや他のソフトは「通常使うプリンタ」がちゃんと使われます。 ' なお、「Printout」命令では、「 on Ne07:」などの文字列が付加されているとエラーになりますが、 ' 「Application.ActivePrinter = ×××」では、逆に「 on Ne07:」などの文字列が付加されていないとエラーになります。 ' そこは注意が必要です。 If Worksheets("Sheet2").Range("B2") <> "" Then '2枚めのシート(Sheet2)のB2セルに値があった場合以下の処理をする。(1行目は列名、1行目は行の項目名が打ち込んであると仮定) Sheets(Array("Sheet1", "Sheet2")).Select 'Sheet1とSheet2を一括選択。(2枚ともを連続印刷したい、あるいは結合されたPDFを作成したいため。) ElseIf Worksheets("Sheet2").Range("B2") = "" Then '2枚めのシート(Sheet2)のB2セルに値が無かった場合、以下の処理をする。(1行目は列名、1行目は行の項目名が打ち込んであると仮定) Sheets(Array("Sheet1")).Select 'Sheet1 1枚だけを選択。 Else 'そのほかの場合は、とりあえず何もしないで「error1」へジャンプ。 GoTo error1: End If '↑例えば2枚のシートがある場合、そのうちの、 ' 2枚目にデータがある場合(複数シート印刷したい場合)と、 ' 2枚目にデータが無い場合(単シート印刷だけでいい場合)の、 ' 例えばの処理の区別。 Sheets("Sheet1").Activate ActiveWindow.SelectedSheets.PrintOut _ Copies:=1, _ ActivePrinter:=s_EpsonPrinterNm, _ Collate:=True '↑プリンタを切り替えての印刷。 ' 「EPSON EP-804A on Ne02:」などの名前を代入したもので印刷。 ' ネットワークプリンタでも、コントロールパネルのプリンタ名がそのまま使えるので ' 「ActiveSheet.PrintOut ActivePrinter:="¥¥http://アドレス¥プリンタ名"・・・」 ' みたいな書き方じゃなくても印刷できるようです。 ' (逆に、このような書き方やUNCパスじゃないと印刷できない事もあるかも?です。) ' ' なお、古いバージョンのExcelにて、 ' 「複数のシートをPDFプリンタで1つのPDFに結合したいとき」は、 ' 「ActiveSheet.PrintOut From:=2, To:=3・・・」みたいに書く方法も有効かもしれません。 ' ただし、その場合は、先の複数シートか単一シートかの条件分岐では、From と To を指定する内容に ' 書き換えないといけません。 ' PDFプリンタの仕様、OS等々、環境によって、必要に応じてそのような使い分けが必要かもしれません。 ' (今回のこのサンプルでは、『 シートを複数・同時選択して「選択したシート」の設定で印刷したことと同じ・・・ 』、という形になっています。) error1: '↑PDF化印刷キャンセルなどでエラーになったとき、後始末するためにここへ飛ぶようにします。 ' (何もしないとSheet1が選択されたまま・プリンタがモトに戻らないまま止まってしまうので) 'アクティブプリンタを「Brother DCP-J957N Printer on Ne07:」など、モトのプリンタに戻す。 Application.ActivePrinter = s_DefaultPrinterNm 'モト居た画面に戻る。 Worksheets(s_ShtNm).Select ' Application.ScreenUpdating = True End Sub ' ' |
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 |
' ' Sub PDF_PrintTest01() Dim s_ActPrinterName As String Dim s_PDF_PrinterName As String s_ActPrinterName = Application.ActivePrinter '通常使うプリンターを取得 s_PDF_PrinterName = "Microsoft Print to PDF" '印刷に使うPDFプリンターを設定 Call Sheets("メニュー詳細").PrintOut(ActivePrinter:=s_PDF_PrinterName) 'PDFで「メニュー詳細」シートを印刷。 'ただしこのとき、「ActivePrinter=通常使うプリンター」が 'PDFプリンターに勝手に切り替わってしまいます。 Application.ActivePrinter = s_ActPrinterName '通常使うプリンターを戻す End Sub ' ' |
- 投稿タグ
- 「ニセモノ」への道, 「本物」に近づくために, Ac2000-Win32API, AccessVBA, Accessの独学, Access操作の基礎, Accesの独学, ADO/DAO, ExcelSQL, ExcelVBA, Excelの独学, Excel操作の基礎, Excel連携VBA, MicrosoftQuery, ODBC, PDF, SQL, パソコンでの自動化, ビジネスパソコンの基礎, ビジネス一般常識, マクロ, ワークシート関数, 独学, 自動化